Skip to content

设备上下线事件 (mapi 监听)

mapi 订阅 EMQX 系统主题,处理设备上下线事件。

EMQX 系统主题

主题方向说明
$SYS/brokers/{node}/clients/{clientid}/connectedEMQX → mapi设备上线事件
$SYS/brokers/{node}/clients/{clientid}/disconnectedEMQX → mapi设备下线事件

上线处理

  1. 解析 $SYS/.../connected 消息,提取 username(即 mq_id
  2. license_tb,仅处理 license_type=1(设备类型)
  3. 绑定 server_id 到当前 mapi 节点
  4. 延迟 1 秒后执行 logConnect()
    • 更新 device_mqtt_connect_tb:记录连接时间、客户端 ID、节点信息
    • 更新 device_tb.status = 1(在线)

延迟 1 秒是为了等待 MQTT 会话完全建立,避免在订阅未完成时就触发状态查询。

下线处理

  1. 解析 $SYS/.../disconnected 消息
  2. 清理 Redis 会话缓存:redis.del("SH:ST:{mq_id}")
    • 清除设备实时状态缓存
  3. 执行 logDisconnect()
    • 更新 device_mqtt_connect_tb:记录断开时间
    • 更新 device_tb.status = 0(离线)

数据库表

device_mqtt_connect_tb

记录设备的 MQTT 连接历史:

字段说明
mq_idMQTT 用户名(关联 license_tb)
clientidMQTT 客户端 ID
nodeEMQX 节点
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 过期机制自动回收。