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