MQTT簡介之三(1) MQTT協議

發佈與訂閱

打個比方,你打電話給朋友,一直要等到朋友接電話了才能夠開始交流,是一個典型的同步請求/應答的場景;而給一個好友郵件列表發電子郵件就不一樣,你發好電子郵件該幹嘛幹嘛,好友到有空了去查看郵件就是了,是一個典型的一部發布/訂閱的場景。
熟悉編程的同學一定非常熟悉這種設計模式了,因爲它帶來了這些好處:發佈者與訂閱者不用瞭解彼此,只要認識同一個消息代理即可。
發佈者和訂閱者不需要交互,發佈者無需等待訂閱者確認而導致鎖定。
發佈者和訂閱者不需要同時在線,可以自由選擇時間來消費消息。

 

主題

MQTT是通過主題對消息進行分類的,本質上就是一個UTF-d字符串,不過可以通過反斜槓標識多個層級關係,主題並不需要創建,直接使用就可以。
主題還可以通過通配符進行過濾,其中層級數量沒有限制不能包含任何的下文提到的特殊符號(/+#),必須至少包含一個字符
-/A”和“A”是不同的
-A”和“A/”是不同的
層級分隔符/
只能匹配本級別不能匹配上級。例如,“sport/+”不匹配“sport
多層通配符#
單層通配符+
一個Subscribe請求可以訂閱多個Topic(節省帶寬、多訂閱儘量用一次請求)

 

服務質量-Qos0

對於qos0而言,對於client而言,有且僅發一次publish包,對於broker而言,有且僅發一次publish,簡而言之,就是僅發一次包,是否收到完全不管,適合一些不是很重要的數據。

服務質量-Qos1

對於qos1而言,這個交互就是多了一次ack的作用,但是會有個問題,儘管我們可以通過確認來保證一定收到客戶端或服務器的message,但是我們卻不能保證message僅有一次,也就是當client沒收到servicepuback或者service沒有收到clientpuback,那麼就會一直髮送publisher

流程:(publisher -> broker

1.publisher store msg -> publish ->broker (傳遞message
2.broker -> puback -> publisher delete msg (確認傳遞成功)

注意:

1.publisher必須保存msg,這樣才能在重發
2.publisher如果在一定時間或socket斷開等異常情況,會繼續重發msg

服務質量-Qos2

對於qos2可以實現僅僅接受一次message,其主要原理(對於publisher而言)
publisherbroker進行了緩存,其中publisher緩存了messagemsgID,而broker緩存了msgID,兩方都做記錄所以可以保證消息不重複,但是由於記錄是需要刪除的,這個刪除流程同樣多了一倍

流程:(publisher -> broker

1.publisher store msg -> publish ->broker -> broker store msgID(傳遞message
2.broker -> puberc (確認傳遞成功)
3.publisher -> pubrel -> broker delete msgID (告訴broker刪除msgID
4.broker -> pubcomp -> publisher delete msg (告訴publisher刪除msg

注意:

1.第二步,即puberc不可以刪除 publishermsg,因爲第三步未必成功,這個時候就需要第一步提醒第二步繼續發,而提醒必須要msgID

遺囑消息

MQTT本身是爲信號不穩定的網絡設計的,所有難免一些客戶端會無故的和Broker斷開連接。當客戶端連接到Broker時,可以指定LWT,Broker回定期檢測客戶端是否有異常。當客戶端異常掉線時,Broker就往連接時指定的Topic裏面推送當時指定的LWT消息。
當客戶端斷開連接時,發送給相關的訂閱者的遺囑消息。以下情況回發送Will Message:
服務端發生了I/O錯誤或者網絡失敗;
客戶端在定義的心跳時期失聯;
客戶端在發送下線包之前關閉網絡連接;
服務端在收到下線包之前關閉網絡連接;
 

遺囑消息---使用場景

      在客戶端 A 進行連接時候,遺囑消息設定爲”offline“,客戶端 B 訂閱這個遺囑主題。 當 A 異常斷開時,客戶端 B 會收到這個”offline“的遺囑消息,從而知道客戶端 A 離線了。

遺囑消息---高級使用場景

高級使用場景 這裏介紹一下如何將 Retained 消息與Will 消息結合起來進行使用。

客戶端 A 遺囑消息設定爲”offline“,該遺囑主題與一個普通發送狀態的主題設定成同一個 A/status;

當客戶端 A 連接時,向主題 A/status 發送 “online” 的 Retained 消息,其它客戶端訂閱主題 A/status的時候,獲取 Retained 消息爲 “online” ; 當客戶端 A 異常斷開時,系統自動向主題 A/status 發送”offline“的消息,其它訂閱了此主題的客戶端會馬上收到”offline“消息;如果遺囑消息被設定了 Retained 的話,這時有新的訂閱A/status主題的客戶端上線的時候,獲取到的消息爲“offline”。

 

 

 

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章