- 数据库:添加 amt_status 和 agent_status 字段 - 后端:Device 实体类和 DeviceDTO 添加新状态字段 - 后端:DeviceService 添加状态检测和更新方法 - 后端:添加 AmtStatusCheckTask 定时任务(每30秒检测一次) - 前端:设备列表页面拆分状态列显示 - 前端:统计卡片显示 AMT 和 Agent 在线/离线数量 - 网络扫描:自动设置 AMT 状态为在线 - 文档:添加 DEVICE_STATUS_SPLIT.md 和 AMT_REALTIME_STATUS.md
284 lines
6.8 KiB
Markdown
284 lines
6.8 KiB
Markdown
# 设备状态拆分说明
|
||
|
||
## 功能说明
|
||
|
||
将原来的单一设备状态拆分为两个独立的状态字段:
|
||
|
||
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
|