设备心跳调整 app新增增设备时绑定联网设备
This commit is contained in:
17
.workbuddy/memory/2026-06-11.md
Normal file
17
.workbuddy/memory/2026-06-11.md
Normal 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` | ✅ 原有 |
|
||||
23
.workbuddy/memory/2026-06-12.md
Normal file
23
.workbuddy/memory/2026-06-12.md
Normal 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`
|
||||
Reference in New Issue
Block a user