MQTT協議從服務端到客戶端詳解
一:前言
最近在瞭解MQTT協議相關的內容,內容有點多,特此把MQTT協議,以及其從服務端到客戶端的流程整理出來,記錄如下。
二:MQTT協議介紹
MQTT(Message Queuing Telemetry Transport,訊息佇列遙測傳輸)是IBM開發的一個即時通訊協議,它是一種輕量級的、基於代理的“釋出/訂閱”模式的訊息傳輸協議。其具有協議簡潔、小巧、可擴充套件性強、省流量、省電等優點,而且已經有PHP,JAVA,Python,C,C#,Go等多個語言版本,基本可以使用在任何平臺上,幾乎可以把所有聯網物品和外部連線起來,所以特別適合用來當做物聯網的通訊協議,實用的場景有遙感資料、汽車、智慧家居、智慧城市、醫療醫護等等。
MQTT特點
MQTT協議是為大量計算能力有限,且工作在低頻寬、不可靠的網路的遠端感測器和控制裝置通訊而設計的協議,它具有以下主要的幾項特性:
1、使用釋出/訂閱訊息模式,提供一對多的訊息釋出,解除應用程式耦合;
2、對負載內容遮蔽的訊息傳輸;
3、使用 TCP/IP 提供網路連線;
4、有三種訊息釋出服務質量:
“至多一次”,訊息釋出完全依賴底層 TCP/IP 網路。會發生訊息丟失或重複。這一級別可用於如下情況,環境感測器資料,丟失一次讀記錄無所謂,因為不久後還會有第二次傳送。
“至少一次”,確保訊息到達,但訊息重複可能會發生。
“只有一次”,確保訊息到達一次。這一級別可用於如下情況,在計費系統中,訊息重複或丟失會導致不正確的結果。
5、小型傳輸,開銷很小(固定長度的頭部是 2 位元組),協議交換最小化,以降低網路流量;
6、使用 Last Will (遺囑)和 Testament 特性通知有關各方客戶端異常中斷的機制;
MQTT協議內容
1 :訊息模型
MQTT是一種基於代理的釋出/訂閱的訊息協議。與請求/回答這種同步模式不同,釋出/訂閱模式解耦了釋出訊息的客戶(釋出者)與訂閱訊息的客戶(訂閱者)之間的關係,這意味著釋出者和訂閱者之間並不需要直接建立聯絡。一個釋出者可以對應多個訂閱者,當釋出者發生變化的時候,他可以將訊息一一通知給所有的訂閱者。這種模式提供了更大的網路擴充套件性和更動態的網路拓撲
此外運用MQTT協議,裝置可以很方便地連線到物聯網雲服務,管理裝置並處理資料,最後應用到各種業務場景,如下圖所示
2 服務質量
MQTT提供三種質量的服務:
至多一次(qos = 0),可能會出現丟包的現象。使用在對實時性要求不高的情況。這一級別可應用於如下情景,如環境感測器資料,丟失一次讀記錄無所謂,因為很快下一次讀記錄就會產生。
至少一次(qos = 1),保證包會到達目的地,但是可能出現重包。
正好一次(qos = 2),保證包會到達目的地,且不會出現重包的現象。這一級別可用於如計費系統等場景,在計費系統中,訊息丟失或重複可能會導致生成錯誤的費用。
服務質量
3 主題與萬用字元
主題名稱(Topic name)用來標識已釋出訊息的資訊的渠道。訂閱者用它來確定接收到所關心的資訊。它是一個分層的結構,用斜線“/”作為分隔符(這個有點類似於restful風格)。主題還可以通過萬用字元進行過濾。其中,+可以過濾一個層級,而#只能出現在主題最後表示過濾任意級別的層級。值得注意的是MQTT允許使用萬用字元訂閱主題,但是並不允許使用萬用字元廣播。
舉個例子:
building-b/floor-5:代表B樓5層的裝置。
+/floor-5:代表任何一個樓的5層的裝置。
building-b/#:代表B樓所有的裝置。
4 遺囑
當一個客戶端斷開連線的時候,它希望客戶端可以傳送它指定的訊息。該訊息和普通訊息的結構相同。通過設定該位並填入和資訊相關的內容即可(後面會有介紹)。
作者:子夏的不語
連結:https://www.jianshu.com/p/3d5b487c6860
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。