MQTT初探

物聯網(Internet of Things,IoT)近來越發成爲火熱話題。雖然HTTP是互聯網連接着人與人的信息流標準,不過機器之間(Machine-to-Machine,M2M)的大規模溝通需要不同的模式:之前的請求/回答(Request/Response)模式不再合適,取而代之的是發佈/訂閱(Publish/Subscribe)模式。這就是輕量級、可擴展的MQTT(Message Queuing Telemetry Transport)可以施展拳腳的舞臺。

MQTT簡介

這裏寫圖片描述

通過MQTT協議,目前已經擴展出了數十個MQTT服務器端程序,可以通過PHP,JAVA,Python,C,C#等系統語言來向MQTT發送相關消息。
此外,國內很多企業都廣泛使用MQTT作爲Android手機客戶端與服務器端推送消息的協議。其中Sohu,Cmstop手機客戶端中均有使用到MQTT作爲消息推送消息。據Cmstop主要負責消息推送的高級研發工程師李文凱稱,隨着移動互聯網的發展,MQTT由於開放源代碼,耗電量小等特點,將會在移動消息推送領域會有更多的貢獻,在物聯網領域,傳感器與服務器的通信,信息的收集,MQTT都可以作爲考慮的方案之一。在未來MQTT會進入到我們生活的各各方面,如:

  • 遙感數據
  • 汽車
  • 智能家居
  • 智慧城市
  • 醫療醫護

如果需要下載MQTT服務器端,可以直接去MQTT官方網站點擊software進行下載MQTT協議衍生出來的各個不同版本。

協議原則

由於物聯網的環境是非常特別的,所以MQTT遵循以下設計原則:

  1. 精簡,不添加可有可無的功能。
  2. 發佈/訂閱(Pub/Sub)模式,方便消息在傳感器之間傳遞。
  3. 允許用戶動態創建主題,零運維成本。
  4. 把傳輸量降到最低以提高傳輸效率。
  5. 把低帶寬、高延遲、不穩定的網絡等因素考慮在內。
  6. 支持連續的會話控制。
  7. 理解客戶端計算能力可能很低。
  8. 提供服務質量管理。
  9. 假設數據不可知,不強求傳輸數據的類型與格式,保持靈活性。

運用MQTT協議,設備可以很方便地連接到物聯網雲服務,管理設備並處理數據,最後應用到各種業務場景,如下圖所示:

這裏寫圖片描述

發佈/訂閱模式

與請求/回答這種同步模式不同,發佈/定義模式解耦了發佈消息的客戶(發佈者)與訂閱消息的客戶(訂閱者)之間的關係,這意味着發佈者和訂閱者之間並不需要直接建立聯繫。打個比方,你打電話給朋友,一直要等到朋友接電話了才能夠開始交流,是一個典型的同步請求/回答的場景;而給一個好友郵件列表發電子郵件就不一樣,你發好電子郵件該幹嘛幹嘛,好友們到有空了去查看郵件就是了,是一個典型的異步發佈/訂閱的場景。

熟悉編程的同學一定非常熟悉這種設計模式了,因爲它帶來了這些好處:

發佈者與訂閱者不比了解彼此,只要認識同一個消息代理即可。
發佈者和訂閱者不需要交互,發佈者無需等待訂閱者確認而導致鎖定。
發佈者和訂閱者不需要同時在線,可以自由選擇時間來消費消息
主題

MQTT是通過主題對消息進行分類的,本質上就是一個UTF-8的字符串,不過可以通過反斜槓表示多個層級關係。主題並不需要創建,直接使用就是了。

主題還可以通過通配符進行過濾。其中,+可以過濾一個層級,而*只能出現在主題最後表示過濾任意級別的層級。舉個例子:

building-b/floor-5:代表B樓5層的設備。
+/floor-5:代表任何一個樓的5層的設備。
building-b/*:代表B樓所有的設備。
注意,MQTT允許使用通配符訂閱主題,但是並不允許使用通配符廣播。

服務質量

爲了滿足不同的場景,MQTT支持三種不同級別的服務質量(Quality of Service,QoS)爲不同場景提供消息可靠性:

級別0:“至多一次”,消息發佈完全依賴底層 TCP/IP 網絡。會發生消息丟失或重複。
級別1:至少一次。消息接收者如果沒有知會或者知會本身丟失,消息發送者會再次發送以保證消息接收者至少會收到一次,當然可能造成重複消息。
級別2:恰好一次。保證這種語義肯待會減少併發或者增加延時,在計費系統中,消息重複或丟失會導致不正確的結果。
級別2所提供的不重不丟很多情況下是最理想的,不過往返多次的確認一定對併發和延遲帶來影響。級別1提供的至少一次語義在日誌處理這種場景下是完全OK的。級別0可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因爲不久後還會有第二次發送。
消息類型

  1. MQTT擁有14種不同的消息類型:
  2. CONNECT:客戶端連接到MQTT代理
  3. CONNACK:連接確認
  4. PUBLISH:新發布消息
  5. PUBACK:新發布消息確認,是QoS 1給PUBLISH消息的回覆
  6. PUBREC:QoS 2消息流的第一部分,表示消息發佈已記錄
  7. PUBREL:QoS 2消息流的第二部分,表示消息發佈已釋放
  8. PUBCOMP:QoS 2消息流的第三部分,表示消息發佈完成
  9. SUBSCRIBE:客戶端訂閱某個主題
  10. SUBACK:對於SUBSCRIBE消息的確認
  11. UNSUBSCRIBE:客戶端終止訂閱的消息
  12. UNSUBACK:對於UNSUBSCRIBE消息的確認
  13. PINGREQ:心跳
  14. PINGRESP:確認心跳
  15. DISCONNECT:客戶端終止連接前優雅地通知MQTT代理

詳細規範的細節可通過MQTT V3.1 Protocol Specification查閱。

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