MQTT作爲物聯網IoT協議

MQTT(Message Queuing Telemetry Transport Protocol)的全稱是消息隊列遙感傳輸協議的縮寫,是一種基於輕量級代理的發佈/訂閱模式的消息傳輸協議,運行在TCP協議棧之上,爲其提供有序、可靠、雙向連接的網絡連接保證。

手機app,路由器,智能開關,智能插座,空氣淨化器,智能掃地機,智能鎖都是mqtt客戶端,一方面發佈信息,同時訂閱信息。

Mqtt協議實施要點:

1、mqtt節點。

服務器建立Mqttd作爲消息broker。而每一個手機APP,每一臺物聯網設備,都是作爲mqtt client客戶端。

2、消息級別分三類。

發佈者通過設置PUBLISH報文中的QoS標誌位,對於客戶端發佈的消息提供三種服務質量等級,如下:

QoS=0,協議對此等級應用信息不要求迴應確認,也沒有重發機制,這類信息可能會發生消息丟失或重複,取決於TCP/IP提供的盡最大努力交互的數據包服務。

用作數據採集時,請設置QoS=0

最少一次(At least once delivery):QoS=1,確保信息到達,但消息重複可能發生,發送者如果在指定時間內沒有收到PUBACK控制報文,應用信息會被重新發送。

控制開關指令,QoS=1。設備IO狀態變化上報(手工操作導致IO變化),QoS=1

僅僅一次(Exactlyonce delivery):QoS=2,最高級別的服務質量,消息丟失和重複都是不可接受的。此消息的效率只有QoS=0的1%。小奇物聯暫時不會使用此消息類型。

3、節點狀態維護。

MQTT協議利用KeepAlive機制在客戶端異常斷開時發現問題。當客戶端斷開時(例如:電量耗盡、系統崩潰或者網絡斷開),代理服務器會採取相應措施通過相關訂閱節點。

客戶端設置“臨終遺囑”(LWT)信息後,當代理服務器檢測到客戶端離線後,就會發送保存在特定主題上的 LWT 信息,讓其它訂閱該主題的客戶端知道該節點已經意外離線。每個設備節點必須發佈LWTAPP節點和admin節點都要訂閱。

wifi模塊的訂閱或發佈mqtt topic消息,是由MCU通過串口發送AT指令來控制wifi模塊完成的。Wifi模塊+MCU組成一個mqtt client(節點)。MCU單片機是實際的功能節點,是插座、空氣淨化器等功能模塊的主控CPU。

broker服務器只對設備和APP之間的消息進行中轉,不進行識別處理。比如,APP遠程開關插座消息,空氣淨化器採集的環境數據等,只轉發不識別或存儲。

服務器作爲管理節點,需要維護設備的在線/離線狀態,同時協助appdevice建立通信。

Mqtt的 ClientID,由各client自行生成,比如app,就用user_id作爲mqtt clientID。

各設備則用設備的mac地址作爲clientID。

發佈mqtt消息時,設備publish時,要讓retain=1App進行publish時,則讓retain=0

不管是app還是device,進行mqtt client連接的時候要設置:clean Session=true,這樣離線消息就不會緩存,不能緩存離線消息,因爲我們是要實時遠程控制設備。

Admin實體協助建立device和app通信的過程也稱爲設備綁定過程,如下:

  1. device上電後,主動訂閱admin相應的devid管理頻道消息。
  2. App上電,主動訂閱自己的user_id控制頻道。app作爲owner發起設備綁定請求,發起綁定前,主動訂閱此設備的login和logout頻道。
  3. Admin收到bind消息後,通過devid管理頻道,將owner的頻道告之device,device往此頻道發送data消息。
  4. Admin不回覆app綁定成功或失敗。因爲admin也不清楚,app收到device的data消息,就說明綁定成功,可以控制了。設備收到bind消息後,要立刻publish一條data消息,告之app。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章