MQTT協議

 

簡介:後端

MQTT協議(Message Queuing Telemetry Transport)(消息隊列遙測傳輸),是IBM公司於1999年提出的。MQTT是一個基於TCP的發佈訂閱協議,設計的初始目的是爲了極有限的內存設備和網絡帶寬很低的網絡不可靠的通訊,很是適合物聯網通訊。服務器

  • MQTT 能夠被解釋爲一種低開銷,低帶寬佔用的即時通信協議,能夠用極少的代碼和帶寬的爲鏈接遠程設備提供實時可靠的消息服務,它適用於硬件性能低下的遠程設備以及網絡情況糟糕的環境下,所以 MQTT 協議在 IoT(Internet of things,物聯網),小型設備應用,移動應用等方面有較普遍的應用。
  • IoT 設備要運做,就必須鏈接到互聯網,設備才能相互協做,以及與後端服務協同工做。而互聯網的基礎網絡協議是 TCP/IP,MQTT 協議是基於 TCP/IP 協議棧而構建的,所以它已經慢慢的已經成爲了 IoT 通信的標準。

工做原理:微信

MQTT 協議提供一對多的消息發佈,能夠解除應用程序耦合,信息冗餘小。該協議須要客戶端和服務端,而協議中主要有三種身份:發佈者(Publisher)、代理(Broker,服務器)、訂閱者(Subscriber)。其中,消息的發佈者和訂閱者都是客戶端,消息代理是服務器,而消息發佈者能夠同時是訂閱者,實現了生產者與消費者的脫耦。
基本特色:
  • 使用 TCP/IP 提供網絡鏈接,提供有序、無損、雙向鏈接;網絡

    MQTT 是一種鏈接協議,它指定了如何組織數據字節並經過 TCP/IP 網絡傳輸它們。設備聯網,也須要鏈接到互聯網中,在大萬維的世界中,TCP 如同汽車,有輪子就能用來運輸數據,MQTT 就像是交通規則。在網絡模型中,TCP是傳輸層協議,而 MQTT是在應用層,在 TCP 的上層,所以MQTT 也是基於這個而構建的,提升了可靠性。架構

  • 對負載內容屏蔽的消息傳輸;性能

    能夠對消息訂閱者所接受到的內容有所屏蔽。ui

  • 具體有三種消息發佈的服務質量:編碼

    • 至多一次,消息發佈徹底依賴底層 TCP/IP 網絡。會發生消息丟失或重複。這一級別可用於以下狀況,環境傳感器數據,丟失一次讀記錄無所謂,由於不久後還會有第二次發送。
    • 至少一次,確保消息到達,但消息重複可能會發生。
    • 只有一次確保消息到達一次。這一級別可用於以下狀況,在計費系統中,消息重複或丟失會致使不正確的結果。
  • 小型傳輸,開銷小,固定長度的頭部是 2 字節,協議交換最小化,以下降網絡流量;spa

    總體上協議可拆分爲:固定頭部+可變頭部+消息體,這就是爲何在介紹裏說它很是適合"在物聯網領域,傳感器與服務器的通訊,信息的收集"。線程

  • 使用Last Will和Testament特性通知有關各方客戶端異常中斷的機制;

    Last Will:即遺言機制,用於通知同一主題下的其餘設備發送遺言的設備已經斷開了鏈接。

    Testament:遺囑機制,功能相似於Last Will。

基本概念:

  1. MQTT 客戶端

    一個使用 MQTT 協議的設備、應用程序等,它老是創建到服務器的網絡鏈接。

    • 能夠發佈信息,其餘客戶端能夠訂閱該信息

    • 訂閱其它客戶端發佈的消息

    • 退訂或刪除應用程序的消息

    • 斷開與服務器鏈接

  2. MQTT 服務器

    MQTT 服務器以稱爲 Broker(消息代理),以是一個應用程序或一臺設備。它是位於消息發佈者 和訂閱者之間

    • 接受來自客戶端的網絡鏈接
    • 接受客戶端發佈的應用信息
    • 處理來自客戶端的訂閱和退訂請求
    • 向訂閱的客戶轉發應用程序消息
  3. 主題(Topic)

    鏈接到一個應用程序消息的標籤,該標籤與服務器的訂閱相匹配。服務器會將消息發送給訂閱所匹配標籤的每一個客戶端。

    • 要訂閱的主題。一個主題能夠有多個級別,級別之間用斜槓字符分隔。例如,/worldemq/emqtt/emqx 是有效的主題。

    • 訂閱者的Topic name支持通配符#和+ :

      • # 支持一個主題內任意級別話題
      • +只匹配一個主題級別的通配符
    • 客戶端成功訂閱某個主題後,代理會返回一條 SUBACK 消息,其中包含一個或多個 returnCode 參數

  4. 主題篩選器(Topic Filter)

    一個對主題名通配符篩選器,在訂閱表達式中使用,表示訂閱所匹配到的多個主題。

  5. QoS(消息傳遞的服務質量水平)

    服務質量,標誌代表此主題範圍內的消息傳送到客戶端所需的一致程度。

    • 值 0:不可靠,消息基本上僅傳送一次,若是當時客戶端不可用,則會丟失該消息。
    • 值 1:消息應傳送至少 1 次。
    • 值 2:消息僅傳送一次。
  6. 會話(Session)

    每一個客戶端與服務器創建鏈接後就是一個會話,客戶端和服務器之間有狀態交互。會話存在於一個網絡之間,也可能在客戶端和服務器之間跨越多個連續的網絡鏈接。

  7. 訂閱(Subscription)

    訂閱包含主題篩選器(Topic Filter)和最大服務質量(QoS)。訂閱會與一個會話(Session)關聯。一個會話能夠包含多個訂閱。每個會話中的每一個訂閱都有一個不一樣的主題篩選器。

    • 客戶端在成功創建TCP鏈接以後,發送CONNECT消息,在獲得服務器端受權容許創建彼此鏈接的CONNACK消息以後,客戶端會發送SUBSCRIBE消息,訂閱感興趣的Topic主題列表(至少一個主題)
    • 訂閱的主題名稱採用UTF-8編碼,而後緊跟着對應的QoS值
  8. 發佈(publish)

    控制報文是指從客戶端向服務端或者服務端向客戶端傳輸一個應用消息,MQTT 客戶端發送消息請求,發送完成後返回應用程序線程

    • 好比安卓的推送服務,還有一些即時通訊軟件如微信等也是採用的推送技術。
  9. 負載(Payload)

    消息訂閱者所具體接收的內容

簡單示例:

MQTT 協議主要是根據如下狀況設計的:

  • M2M(Machine to Machine),機器或設備間端到端通訊,好比傳感器之間的數據通信。
  • 設備(Machine)中,例如傳感器,硬件能力很弱,協議要考慮儘可能小的資源消耗,好比計算能力和存儲等。

根據 MQTT 的基礎瞭解後並結合簡單的架構,在這裏作一個簡單的示例圖,能夠更直觀的理解MQTT協議的通訊模型。MQTT Broker 就選擇 EMQ 做爲示範。好比有1個溫度傳感器(1個Machine),1個移動設備,1個電腦,一個服務器(3個Machine),均可以獲得或者顯示溫度傳感器的溫度值

相關文章
相關標籤/搜索