Mosquitto感知客户端上下线的方法

房东的猫 提交于 2019-12-10 04:20:51

国内最活跃的Mosquitto沟通社区,关于MQTT、Mosquitto、IM、推送系统、物联网、高并发处理等技术。
 

需要让设备上mqtt客户端配合来完成。
1、怎么知道设备下线?
异常断线(Mosquitto没有收到MQTT 的DISCONNECT报文)时,使用遗嘱机制,mqtt客户端在建立mqtt连接的时候,设置遗嘱(向什么topic发送什么数据):当前这个tcp连接断开的时候,Mosquitto自动按照遗嘱设置发送消息,这时利用这个机制,topic应用设定好,例如:iot/status/onoffline;所设置的遗嘱消息内容就是一个JSON字符串,里面包含当前连接的ID等信息,上线状态,例如:

{"id":11232232432,//这个id就是当前设备的ID

"status":"offline"//表示这是一个设备下线的通知;

}

这样这个连接断开的时候(无论正常还是异常)谁订阅了这个topic就能收到这个消息.

正常断线(mqtt客户端主动发送了DISCONNECT报文)时,客户端要在发送DISCONNECT报文之前(及调用paho包的disconnect接口之前)主动向上下线topic发布一条设备下线的消息。

2、怎么知道设备上线?
mqtt客户端在建立mqtt连接之后,无条件向某个topic(例如:iot/status/onoffline)发送一个消息,消息内容包括自己的设备ID和上线状态,例如:

{"id":11232232432,//这个id就是当前设备的ID

"status":"online"//表示这是一个设备上线的通知;

}

,这样一旦自己的设备上线了,订阅了这个topic的应用就能收到该设备发过来的消息;

在上述说明中:正常的上下线通知都是由客户端主动发送,即:建立mqtt连接之后的第一条pub消息和断开mqtt连接之前的最后一条pub消息;对于异常断开的连接使用MQTT的遗嘱机制让mqtt broker来自动发送异常下线消息。

 

如果觉得这种方式比较麻烦,可加入群:221779856,群里开源的软件在Mosquitto上做了优化修改,不需要客户端做任何配合就能实现:
(1)自动上下线通知,无需客户端做任何配合,详细可参考开源软件的说明,其思路如下:
【功能说明】向指定topic发送上下线通知的消息

【使用说明】:

打开下面两个配置项“topic_notice_online”(对应上线消息)和“topic_notice_offline”(对应下线消息),并为他们分别设置一个参数,这个设置的参数将被作为一个topic,也可以将这两个topic参数设置成一样,这样,上下线消息都会发送到同一个topic上;在有连接建立或断开时mosquitto将向这两个topic发送消息,

【消息格式说明】mosquitto向下面这两个配置topic发送的上下线消息为JSON字符串,共包含三个字段:

clientid:当前通知所涉及的连接ID;

type:连接的状态:1:连接建立;0:连接断开;

time:当前系统时间,1970年1月1日到现在的时间;

例如:

{

"clientid","clientId-test-001",

"type","1",

"time",""

}

topic_notice_online $SYS/NOTICE/STATUS/ONLINE

topic_notice_offline $SYS/NOTICE/STATUS/OFFLINE

(2)直接向Mosquitto查询某个设备当前是否在线?
【功能说明】查询指定连接ID是否在线,返回JSON格式字符串,JSON格式与新增功能2一致:1:在线;0:不在线;

【使用方式】开启下面配置,该配置将指定一个topic,任何一个客户端只要向这个topic发布一个连接ID(即pub过来的消息内容就是要查询的连接ID),mosquitto就会给这个当前pub消息的客户端回复一条消息,查询的客户端无需订阅任何topic,只要向这里配置的topic发布连接ID,就能收到mosquitto发布过来的查询结果。

topic_query_conn_status client/query/connection

这种方式的缺点是:这里Mosquitto自动感知的是连接状态,为了让连接和设备关联起来,需要使用设备标识作为连接标识,由于MQTT协议规定连接ID不能大于23个字符,否则mqtt broker就会拒绝该连接,因此设备id长度大于23个字符时此方式不可用。
 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!