# 设备状态拆分说明 ## 功能说明 将原来的单一设备状态拆分为两个独立的状态字段: 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 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