有不少接触物联网、MQTT、EMQ X 的童鞋,都会询问如何获取设备上下线状态,因为设备上下状态数据是IoT数据一个基本呈现,很多更上层应用会基于此数据进行展现与分析,对此EMQ君将从MQTT协议侧、 Broker侧来介绍如何获取设备上下线状态:
通用方式
MQTT协议-遗嘱机制
MQTT 协议层面获取设备上下线状态,可利用 MQTT 协议遗嘱机制获取设备状态,设备连接时启用遗嘱,在连接到Broker时,设置 Will-Topic、Will-Payload等属性,当Client异常断开时(即设备没有发送Disconnect报文),Broker会发布遗嘱 Topic 与 Payload,但遗嘱机制明显弊端是,只有异常断开才会获得下线状态。
MQTT协议-主题设计
从MQTT协议侧,来获取设备上下线状态,更好的技巧和解决方法,可在 MQTT 协议 Topic 侧做设计,可以为 “presence” 进行主题设计。如,“presence/connect/client-id” ,当设备上线时,对其发布上线消息,当设备正常离线时(即设备发送Disconnect报文)对主题”presence/disconnect/client-id“发布其离线消息。
EMQ X 实现方式
以上两种方式,是依赖MQTT 协议的遗嘱机制,或是主题层面的设计来获取设备在线状态,可适用任何实现MQTT 协议的Broker,但 EMQ君,在这里介绍如何简单、快速从EMQ X Broker获取设备在线状态的三种方式。
EMQ X 系统主题
EMQ X Broker 上下线状态主题:
上线主题:$SYS/brokers//clients//connected
下线主题:$SYS/brokers//clients//disconnected
1)、 可分别指定具体节点名、设备ClientID
2)支持'+'、‘#’通配符
mosquitto示例:
mosquitto_sub -i mosuqitto_test -t '$SYS/brokers/+/clients/+/+' -d
通过以上命令订阅系统上下线主题后,如有设备上、下线,将收到其上下线消息,将打印下面的消息: