帶你了解MQTT協議

2022.09.27
帶你了解MQTT協議
目前MQTT協議被廣泛應用於自動駕駛、工業、通信等領域。本文將詳細介紹MQTT協議的特點、如何運作等相關問題。

作者| 王映月,單位:中國移動智慧家庭運營中心

​Labs 導讀

目前MQTT協議被廣泛應用於自動駕駛、工業、通信等領域。而在智能家居領域市場上,中國移動、華為、阿里、騰訊等多家IoT平台都支持MQTT協議接入。本文將詳細介紹MQTT協議的特點、如何運作等相關問題。

MQTT是結構化信息標準促進組織(OASIS,Organization for the Advancement of Structured Information Standards)標準下的物聯網消息傳遞協議,其輕量級的發布/訂閱傳輸機制,非常適合為遠程連接設備提供可靠的消息通信服務。目前MQTT協議被廣泛應用於自動駕駛、工業、通信等領域。而在智能家居領域市場上中國移動、華為、阿里、騰訊等多家IoT平台都支持MQTT協議接入。

圖片

Part 01MQTT協議的特點 

- 輕量高效

只需極少的資源即可實現MQTT客戶端,這使得MQTT協議可以輕鬆地在微型芯片上運行。極簡報文設置實現最小網絡開銷。

- 範圍廣播

輕鬆實現百萬設備消息廣播。

- 穩定傳輸

3種消息傳輸保障等級,提供不同場景下消息傳遞的可靠性保證。

- 弱網支持

會話保持機制減少弱網環境下設備重連時間。

- 安全保障

支持多種認證協議保障消息安全

Part 02MQTT協議是怎麼工作的 ● 

MQTT協議定義了消息代理節點(Broker)及MQTT客戶端(Client),兩種網絡實體類型。Broker接收Client發送的消息並負責轉發這些消息到指定的Client。Client是能與Broker產生交互的任何實體,負責發送與接收消息。常見的Client比如IoT傳感器,雲端服務器。可見在MQTT協議中消息是通過Broker進行轉發的,而不是由一個Client與另一個Client直接連接通信。為了區分,我們可以把Client定義為消息發送者(Publisher-Client)與消息接收者(Subscriber-Client)。

  • Client與Broker建立連接,該連接可以是一個TCP/IP連接,也可以是一個加密的TLS連接。
  • Subscriber-Client訂閱一個主題(Topic)。
  • Publisher-Client發送某個Topic消息到Broker。
  • Broker將該條消息轉發給所有訂閱該Topic的Subscriber-Client。

圖片

Part 03MQTT協議質量保障 

眾所周知,物聯網設備往往處在復雜的網絡環境下,比如農業物聯網中,蔬菜大棚的傳感器設備;工業物聯網中,封閉車間的溫濕度傳感器等等。在這些複雜網絡場景下,設備狀態是無法確定的,為了在這些場景下保障連接,MQTT協議提供了消息服務質量保障等級(Qos,Quality of Service levels)。

  • Qos-0最多一次

Qos 0 保障消息到達終點最多不超過1次。消息可能到達1次或根本不會到達。適用於功率受限設備,可以最大減少傳播時間,減少消息傳遞成本;適用於非關鍵消息傳遞,例如被頻繁重複發送的消息。

圖片

  • Qos-1 最少一次

Qos 1保障消息到達終點最少不低於1次。Broker在確認接收消息後會返回一個PUBACK消息給到Publisher-Client。如果消息發送失敗,Publisher-Client將在一段時間後重發消息。此類型消息適用於重要不可丟失的消息傳遞,可利用該傳輸機制保證消息在離線設備上線後仍能收到。Subscriber-Client需要做好重複消息處理工作。

圖片

  • Qos-2 只有一次

Qos 2 保障消息到達終點只有1次。此類消息保證接接收端對於一條消息只接收一次,是MQTT協議中最安全且傳輸速度最慢的一種消息傳遞形式。適用於十分重要且不允許重複消息出現的場景使用,由於消息十分重要,因此可忽視額外的網絡開銷。

圖片

Part 04最小MQTT應用搭建

在了解MQTT理論基礎概念後,我們一起在Windows系統上搭建一個最小MQTT服務,實現MQTT消息的發送及訂閱。

(1) Broker搭建

我們選擇開源代理平台Mosquitto作為此次最小MQTT應用的單點Broker。

將Mosquitto Windows版下載完成後,通過Windows系統終端打開mosquitto.exe文件。輸入./mosquitto.exe -p 1883 即在Windows系統上啟動了一個MQTT服務,監聽地址為127.0.0.1,端口是1883。

(2) Client搭建

完成Broker搭建後,我們還需要Client實現消息的發送和訂閱。我們選擇mqtt.fx軟件作為此次最小MQTT應用的Client。打開mqtt.fx軟件,我們通過設置MQTT Broker Address為127.0.01,Broker Port為1883,並自定義Client ID。完成設置後,點擊主頁面的Connect,頁面右上角的連接指示燈顯示為綠色即表示完成了連接,此時我們實現了Client到Broker的連接。

(3) 消息訂閱

假定步驟二創建的Client為一個Subscriber-Client,此時通過點擊主頁面中的Subscribe,填寫訂閱Topic信息,在示例中我訂閱的Topic為test,即可完成該Client對於該Topic訂閱。

(4) 消息發送

重新打開一個mqtt.fx客戶端,創建一個Publisher-Client,設置MQTT Broker信息與Subscriber-Client信息一致,成功連接Broker後,在Publish頁面下,向指定Topic即test發送信息,此時我們可以在Subscriber-Client界面上看到消息成功的從Broker轉發至Subscriber-Client。

至此一個最小的MQTT應用就搭建完成了。

圖片

綜上所述,MQTT協議關注於消息,擁有輕量、高效、低開銷等特性,相對於HTTP等廣泛應用於互聯網場景的協議來說,MQTT協議與物聯網通信領域更加契合。