MQTT協議介紹
MQTT協議是什么?
MQTT(Message Queuing Telemetry Transport Protocol)的全稱是消息隊列遙感傳輸協議的縮寫,是一種基於輕量級代理的發布/訂閱模式的消息傳輸協議,運行在TCP協議棧之上,為其提供有序、可靠、雙向連接的網絡連接保證。
MQTT協議如何工作?
MQTT采用代理的發布/訂閱模式實現了發布者和訂閱者的解耦(decouple),因此,在MQTT協議中有三種角色:代理服務器、發布者客戶端以及訂閱者客戶端,其中發布者和訂閱者互不干擾,也就是說發布者和訂閱者互不知道對方的存在,它們只知道代理服務器,代理服務器負責將來自發布者的消息進行存儲處理並將這些消息發送到正確的訂閱者中去。
代理服務器(Server)
代理服務器可以是一個程序或者設備,作為發送消息的客戶端和請求訂閱的客戶端之間的中介。其主要作用是接收發布者客戶端發布的應用信息,然后將信息轉發給符合條件的訂閱者客戶端。
百度雲天工智能物聯網平台為用戶提供了代理服務器的功能。
客戶端(Client)
客戶端指使用MQTT協議的程序或設備。客戶端包括發布者客戶端和訂閱者客戶端,同一個客戶端可以即是發布者也是訂閱者。客戶端可以發布消息給其它相關客戶端,也可以訂閱其它客戶端發布的消息。
因為每個用戶的設備和使用場景不同,通常用戶需要自己開發客戶端軟件。MQTT官方提供了Client SDK,可以幫助客戶快速開發MQTT客戶端。
百度雲也為用戶提供了websocket,可用於模擬客戶端,幫助用戶進行業務測試和驗證。
如何將消息正確送達?
MQTT通過“主題”實現將消息從發布者客戶端送達至接收者客戶端。“主題”是附加在應用消息上的一個標簽,發布者客戶端將“主題”和“消息”發送至代理服務器,代理服務器將該消息轉發至每一個訂閱了該“主題”的訂閱者客戶端,如下圖所示:
一個主題名可以由多個主題層級組成,每一層通過“/”斜杠分隔開,如上圖所示,訂閱者客戶端A將主題過濾器設置為“baidu/F1”;訂閱者客戶端B將主題過濾器設置為“baidu/F2”。發布者客戶端向“baidu/F1”發布消息,因此只有訂閱者客戶端A可以接收到該消息。
主題過濾器指客戶端在訂閱時包含的一個表達式,用於表示相關的一個或多個主題。
如何使用通配符訂閱多個主題?
如果用戶需要一次訂閱多個具有類似結構的主題,可以在主題過濾器中包含通配符。通配符只可用在主題過濾器中,在發布應用消息時的主題名不允許包含通配符,主題通配符有兩種:
-
#:表示匹配>=0個層次,比如a/#就匹配a/b,a/b/c(不能匹配a/,后面必須有其它主題)。單獨的一個#表示匹配所有,不允許a#或a/#/c等形式。
-
+:表示匹配一個層次,例如a/+匹配a/b,a/c,不匹配a/b/c。單獨的一個+是允許的,但a+為非法形式。
如何確保消息已被送達?
發布者客戶端通過設置PUBLISH報文中的QoS標志位,對於客戶端發布的消息提供三種服務質量等級,如下:
-
QoS=0,協議對此等級應用信息不要求回應確認,也沒有重發機制,這類信息可能會發生消息丟失或重復,取決於TCP/IP提供的盡最大努力交互的數據包服務。
-
最少一次(At least once delivery):QoS=1,確保信息到達,但消息重復可能發生,發送者如果在指定時間內沒有收到PUBACK控制報文,應用信息會被重新發送。
-
僅僅一次(Exactlyonce delivery):QoS=2,最高級別的服務質量,消息丟失和重復都是不可接受的。
什么是臨終遺囑?
MQTT協議利用KeepAlive機制在客戶端異常斷開時發現問題。當客戶端斷開時(例如:電量耗盡、系統崩潰或者網絡斷開),代理服務器會采取相應措施。
客戶端設置“臨終遺囑”(LWT)信息后,當代理服務器檢測到客戶端離線后,就會發送保存在特定主題上的 LWT 信息,讓其它訂閱該主題的客戶端知道該節點已經意外離線。