设备心跳调整 app新增增设备时绑定联网设备

This commit is contained in:
yuhaiming
2026-06-13 10:51:45 +08:00
parent c7f9df980a
commit c74363afa4
65 changed files with 1622 additions and 592 deletions

View File

@@ -0,0 +1,17 @@
# 2026-06-11 工作日志
### 14. DeviceDataHandler 和 DeviceRegisterHandler 补充设备在线状态刷新
**问题**:之前只有 ACK 应答会调用 `refreshDeviceOnline()` 续期 Redis 中的设备在线状态。但设备只要上报电量或注册就证明在线,这两个场景没刷新在线缓存。后果:设备只上报数据不发 ACK 时5 分钟后重试逻辑误判它为离线。
**修复**
- `DeviceDataHandler.handle()` → 收到 `/publish/power` 后调用 `refreshDeviceOnline()`
- `DeviceRegisterHandler.handle()` → 注册后调用 `refreshDeviceOnline()`
- 两个 Handler 各自注入 `MqttProperties`,避免注入 `MqttCommandAckService` 引入新的循环依赖
**在线判定覆盖**(修复后):
| 触发方式 | 是否刷新在线状态 |
|---|---|
| 设备上报电量 `/publish/power` | ✅ 新增 |
| 设备注册 `/publish/register` | ✅ 新增 |
| ACK 应答 `/publish/ack` | ✅ 原有 |

View File

@@ -0,0 +1,23 @@
# 2026-06-12 工作日志
### 15. 修复设备断电后数据库状态未更新为离线
**问题**:设备断电/断网后Redis 中的在线 Key`mqtt:device:status:{deviceNo}`)会在 TTL默认 300s到期后自动消失但数据库 `app_device.status` 字段没有同步更新,始终显示在线。
**方案**:三层联动
1. **定时任务扫库(新增 `DeviceOfflineCheckTask`**:每 90s 扫描 DB 中 `status=1` 的设备,检查 Redis Key 是否存在,不存在则批量更新 `status=0`(离线)。扫描间隔可通过 `mqtt.offline-check.interval-ms` 配置项覆盖。
2. **上线时同步写库**
- `DeviceDataHandler.handle()`:收到电量上报时,`AppDeviceBo.setStatus("1")` 写库 + 刷新 Redis Key
- `DeviceRegisterHandler.buildRegisterDevice()`:注册时 `device.setStatus("1")`
3. **修复注册默认状态**`registerByMqtt()` 中注册默认值从 `status=2` 改为 `status=1`(在线)
**状态值定义**(来自 `AppDeviceBo` 注释):
- `0`:离线
- `1`:在线
- `2`:到期
- `3`:故障
**新增文件**`water-app/src/main/java/org/dromara/app/task/DeviceOfflineCheckTask.java`