admin/DEVICE_STATUS_SPLIT.md
lvfengfree 2e28ad1472 feat: 拆分设备状态为AMT状态和Agent状态
- 数据库:添加 amt_status 和 agent_status 字段
- 后端:Device 实体类和 DeviceDTO 添加新状态字段
- 后端:DeviceService 添加状态检测和更新方法
- 后端:添加 AmtStatusCheckTask 定时任务(每30秒检测一次)
- 前端:设备列表页面拆分状态列显示
- 前端:统计卡片显示 AMT 和 Agent 在线/离线数量
- 网络扫描:自动设置 AMT 状态为在线
- 文档:添加 DEVICE_STATUS_SPLIT.md 和 AMT_REALTIME_STATUS.md
2026-03-01 19:18:32 +08:00

284 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 设备状态拆分说明
## 功能说明
将原来的单一设备状态拆分为两个独立的状态字段:
1. **AMT 状态** (`amt_status`):表示 Intel AMT 是否在线
- `online`AMT 在线,可以进行远程管理
- `offline`AMT 离线,无法连接
2. **Agent 状态** (`agent_status`):表示操作系统是否在线
- `online`操作系统在线Agent 正常运行
- `offline`:操作系统离线或 Agent 未运行
## 数据库变更
### 新增字段
```sql
ALTER TABLE device
ADD COLUMN amt_status VARCHAR(20) DEFAULT 'offline' COMMENT 'AMT状态: online-在线, offline-离线',
ADD COLUMN agent_status VARCHAR(20) DEFAULT 'offline' COMMENT 'Agent状态: online-在线, offline-离线';
```
### 数据迁移
-`status` 字段保留用于兼容
- 新设备的 `amt_status``agent_status` 默认为 `offline`
- 通过网络扫描添加的设备,`amt_status` 自动设置为 `online`
## 后端变更
### 1. 实体类更新
**Device.java**:
```java
private String status; // 保留原字段用于兼容
private String amtStatus; // AMT 状态
private String agentStatus; // Agent 状态
```
**DeviceDTO.java**:
```java
private String status; // 保留用于兼容
private String amtStatus; // AMT 状态
private String agentStatus; // Agent 状态
```
### 2. 服务层更新
**DeviceService.java**:
- 添加 `checkAmtStatus()` 方法:检测设备 AMT 状态
- 添加 `updateAmtStatus()` 方法:更新设备 AMT 状态
- 添加 `updateAgentStatus()` 方法:更新设备 Agent 状态
- 更新 `getDeviceStatistics()` 方法:统计 AMT 和 Agent 在线/离线数量
## 前端变更
### 1. 类型定义更新
**device.d.ts**:
```typescript
interface Device {
status: 'online' | 'offline' | 'fault' | 'maintenance'; // 保留
amtStatus: 'online' | 'offline'; // AMT 状态
agentStatus: 'online' | 'offline'; // Agent 状态
}
```
### 2. 设备列表页面更新
**index.vue**:
#### 统计卡片
- 总设备数
- AMT 在线
- AMT 离线
- Agent 在线
- Agent 离线
#### 表格列
- 设备名称
- UUID
- **AMT 状态**(新增)
- **Agent 状态**(新增)
- IP 地址
- MAC 地址
- 创建时间
- 操作
#### 状态显示
- AMT 在线:绿色标签
- AMT 离线:灰色标签
- Agent 在线:蓝色标签
- Agent 离线:灰色标签
### 3. 网络扫描功能
- 扫描到的设备自动设置 `amtStatus = 'online'`
- Agent 状态默认为 `offline`(需要 Agent 上报)
## 使用说明
### 1. 执行数据库更新
运行批处理文件:
```bash
update_device_status.bat
```
或手动执行 SQL
```bash
mysql -h localhost -P 3306 -u root -proot soybean_admin < update_device_status_fields.sql
```
### 2. 重新编译后端
```bash
cd backend
mvn clean package -DskipTests
```
### 3. 重启后端服务
```bash
start_backend.bat
```
### 4. 测试功能
1. 打开设备列表页面
2. 查看统计卡片是否显示 AMT 和 Agent 状态
3. 查看表格是否显示两个状态列
4. 进行网络扫描,添加设备
5. 验证新添加的设备 AMT 状态为"在线"
## AMT 状态检测
### 当前实现
扫描到的设备自动设置为在线,其他设备默认离线。
### 后续完善
1. **定时检测**
- 创建定时任务,定期检测所有设备的 AMT 状态
- 使用 Identify 请求快速检测连接性
- 更新数据库中的 `amt_status` 字段
2. **手动刷新**
- 在设备列表添加"刷新状态"按钮
- 点击后检测选中设备的 AMT 状态
- 实时更新状态显示
3. **状态变化通知**
- AMT 从在线变为离线时发送告警
- 记录状态变化历史
## Agent 状态实现
### 当前状态
Agent 状态字段已添加,默认为离线(假数据)。
### 后续实现步骤
1. **开发 Agent 程序**
- 在目标设备上运行的客户端程序
- 定期向服务器报告心跳
- 上报设备信息CPU、内存、磁盘等
2. **心跳机制**
- Agent 每 30 秒发送一次心跳
- 服务器记录最后心跳时间
- 超过 2 分钟未收到心跳则标记为离线
3. **状态更新接口**
```java
@PostMapping("/device/agent/heartbeat")
public Result<Boolean> agentHeartbeat(@RequestBody AgentHeartbeat heartbeat) {
// 更新设备 Agent 状态为在线
// 更新最后心跳时间
// 记录设备信息
}
```
4. **定时检查**
- 创建定时任务,每分钟检查一次
- 将超时未心跳的设备标记为离线
## 状态组合说明
| AMT 状态 | Agent 状态 | 说明 |
|---------|-----------|------|
| 在线 | 在线 | 设备完全正常,可进行所有操作 |
| 在线 | 离线 | 操作系统关机,但 AMT 可用,可远程开机 |
| 离线 | 在线 | AMT 未启用或故障,但系统正常运行 |
| 离线 | 离线 | 设备完全离线或断电 |
## 操作建议
### 根据状态执行操作
1. **AMT 在线 + Agent 离线**
- 可以使用远程开机功能
- 可以查看 BIOS 设置
- 可以进行硬件级别的管理
2. **AMT 离线 + Agent 在线**
- 可以通过 Agent 执行软件操作
- 无法进行硬件级别的管理
- 建议启用 AMT 功能
3. **AMT 在线 + Agent 在线**
- 所有功能可用
- 最佳状态
4. **AMT 离线 + Agent 离线**
- 设备不可用
- 需要物理检查设备
## 测试场景
### 场景 1网络扫描添加设备
1. 执行网络扫描
2. 选择设备并批量添加
3. 验证AMT 状态 = 在线Agent 状态 = 离线
### 场景 2手动添加设备
1. 选择"手动添加"方式
2. 输入设备信息
3. 验证AMT 状态 = 离线Agent 状态 = 离线
### 场景 3查看统计信息
1. 打开设备列表
2. 查看顶部统计卡片
3. 验证:显示 AMT 和 Agent 的在线/离线数量
### 场景 4状态筛选
1. 在搜索栏选择状态筛选
2. 验证:可以按 AMT 或 Agent 状态筛选(后续实现)
## 注意事项
1. **数据兼容性**
- 保留了原 `status` 字段
- 旧代码仍可正常运行
- 建议逐步迁移到新字段
2. **性能考虑**
- AMT 状态检测会产生网络请求
- 建议使用缓存和定时任务
- 避免频繁检测
3. **错误处理**
- AMT 检测失败不应影响其他功能
- 记录检测失败的原因
- 提供重试机制
4. **安全性**
- Agent 心跳需要身份验证
- 防止伪造心跳攻击
- 加密传输敏感信息
## 后续优化
1. **实时状态推送**
- 使用 WebSocket 推送状态变化
- 前端实时更新显示
2. **状态历史记录**
- 记录状态变化历史
- 生成状态变化报表
- 分析设备可用性
3. **告警功能**
- 设备离线告警
- 状态异常告警
- 邮件/短信通知
4. **批量操作**
- 批量刷新状态
- 批量启用/禁用 AMT
- 批量部署 Agent