1. 程式人生 > >MQTT協議從服務端到客戶端詳解

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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。