Mosquitto感知客戶端上下線的方法

國內最活躍的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個字符時此方式不可用。
 

發佈了202 篇原創文章 · 獲贊 88 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章