设备上下线事件 (mapi 监听)
mapi 订阅 EMQX 系统主题,处理设备上下线事件。
EMQX 系统主题
| 主题 | 方向 | 说明 |
|---|---|---|
$SYS/brokers/{node}/clients/{clientid}/connected | EMQX → mapi | 设备上线事件 |
$SYS/brokers/{node}/clients/{clientid}/disconnected | EMQX → mapi | 设备下线事件 |
上线处理
- 解析
$SYS/.../connected消息,提取username(即mq_id) - 查
license_tb,仅处理license_type=1(设备类型) - 绑定
server_id到当前 mapi 节点 - 延迟 1 秒后执行
logConnect():- 更新
device_mqtt_connect_tb:记录连接时间、客户端 ID、节点信息 - 更新
device_tb.status = 1(在线)
- 更新
延迟 1 秒是为了等待 MQTT 会话完全建立,避免在订阅未完成时就触发状态查询。
下线处理
- 解析
$SYS/.../disconnected消息 - 清理 Redis 会话缓存:
redis.del("SH:ST:{mq_id}")- 清除设备实时状态缓存
- 执行
logDisconnect():- 更新
device_mqtt_connect_tb:记录断开时间 - 更新
device_tb.status = 0(离线)
- 更新
数据库表
device_mqtt_connect_tb
记录设备的 MQTT 连接历史:
| 字段 | 说明 |
|---|---|
| mq_id | MQTT 用户名(关联 license_tb) |
| clientid | MQTT 客户端 ID |
| node | EMQX 节点 |
| connected_at | 连接时间 |
| disconnected_at | 断开时间 |
device_tb.status
| 值 | 含义 |
|---|---|
| 0 | 离线 |
| 1 | 在线 |
Redis 缓存清理
设备下线时清理的 Redis Key:
| Key | 类型 | 说明 |
|---|---|---|
SH:ST:{mq_id} | Hash | 设备实时状态(field=naddr, value=hex 状态) |
其他关联缓存(如
SH:DEVICE:MAP:{mq_id}、SH:DEVICE:DATA:{mq_id}:{mac})在下线时不主动清理,由 TTL 过期机制自动回收。
