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

6.8 KiB
Raw Blame History

设备状态拆分说明

功能说明

将原来的单一设备状态拆分为两个独立的状态字段:

  1. AMT 状态 (amt_status):表示 Intel AMT 是否在线

    • onlineAMT 在线,可以进行远程管理
    • offlineAMT 离线,无法连接
  2. 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_statusagent_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. 测试功能

  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. 状态更新接口

    @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