MQTT協議入門介紹

目錄

MQTT概覽

MQTT特點

MQTT協議的主要特性

MQTT主要應用

MQTT基於主題(Topic)消息路由

MQTT V3.1.1協議報文

MQTT消息QoS

MQTT會話(Clean Session)

MQTT連接保活心跳

MQTT遺願消息(Last Will)

MQTT保留消息(Retained Message)

MQTT WebSocket連接

MQTT協議客戶端庫

MQTT與XMPP協議對比

MQTT 在線測試工具

參考資料


MQTT概覽

MQTT是一個輕量的發佈訂閱模式消息傳輸協議,專門針對低帶寬和不穩定網絡環境的物聯網應用設計。MQTT 是 Message Queuing Telemetry Transport(消息隊列遙測傳輸)的縮寫,是 IBM 開發的一個即時通訊協議,它比較適合於在低帶寬、不可靠的網絡的進行遠程傳感器和控制設備通訊等,正在日益成爲物聯網通信協議的重要組成部分。

MQTT官網: http://mqtt.org

MQTT V3.1.1協議規範: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

MQTT特點

  1. 開放消息協議,簡單易實現
  2. 發佈訂閱模式,一對多消息發佈
  3. 基於TCP/IP網絡連接
  4. 1字節固定報頭,2字節心跳報文,報文結構緊湊
  5. 消息QoS支持,可靠傳輸保證

MQTT協議的主要特性

  • MQTT 協議使用發佈 / 訂閱消息範式來做到一對多的消息分發以及應用程序的解耦
  • MQTT 協議提供了 3 種(QoS)服務質量用於消息傳輸,適應不同的物聯網數據傳輸場景
    • QoS 0:最多一次傳送 (只負責傳送,發送過後就不管數據的傳送情況)
    • QoS 1:至少一次傳送 (確認數據交付)
    • QoS 2:正好一次傳送 (保證數據交付成功)
  • 通過很小的傳輸開銷,以及最小化的協議交換來減少網絡流量
  • 發生異常斷線時通知各方的機制

MQTT主要應用

MQTT協議廣泛應用於物聯網、移動互聯網、智能硬件、車聯網、電力能源等領域。

  1. 物聯網M2M通信,物聯網大數據採集
  2. Android消息推送,WEB消息推送
  3. 移動即時消息,例如Facebook Messenger
  4. 智能硬件、智能傢俱、智能電器
  5. 車聯網通信,電動車站樁採集
  6. 智慧城市、遠程醫療、遠程教育
  7. 電力、石油與能源等行業市場

MQTT基於主題(Topic)消息路由

MQTT協議基於主題(Topic)進行消息路由,主題(Topic)類似URL路徑,例如:

chat/room/1

sensor/10/temperature

sensor/+/temperature

$SYS/broker/metrics/packets/received

$SYS/broker/metrics/#

主題(Topic)通過’/’分割層級,支持’+’, ‘#’通配符:

'+': 表示通配一個層級,例如a/+,匹配a/x, a/y

'#': 表示通配多個層級,例如a/#,匹配a/x, a/b/c/d

訂閱者與發佈者之間通過主題路由消息進行通信,例如採用mosquitto命令行發佈訂閱消息:

mosquitto_sub -t a/b/+ -q 1

mosquitto_pub -t a/b/c -m hello -q 1

註解

訂閱者可以訂閱含通配符主題,但發佈者不允許向含通配符主題發佈消息。

MQTT V3.1.1協議報文

報文結構

固定報頭(Fixed header)
可變報頭(Variable header)

報文有效載荷(Payload)

固定報頭

Bit 7 6 5 4 3 2 1 0
byte1 MQTT Packet type Flags
byte2… Remaining Length

報文類型

類型名稱 類型值 報文說明
CONNECT 1 發起連接
CONNACK 2 連接回執
PUBLISH 3 發佈消息
PUBACK 4 發佈回執
PUBREC 5 QoS2消息回執
PUBREL 6 QoS2消息釋放
PUBCOMP 7 QoS2消息完成
SUBSCRIBE 8 訂閱主題
SUBACK 9 訂閱回執
UNSUBSCRIBE 10 取消訂閱
UNSUBACK 11 取消訂閱回執
PINGREQ 12 PING請求
PINGRESP 13 PING響應
DISCONNECT 14 斷開連接

PUBLISH發佈消息

PUBLISH報文承載客戶端與服務器間雙向的發佈消息。 PUBACK報文用於接收端確認QoS1報文,PUBREC/PUBREL/PUBCOMP報文用於QoS2消息流程。

PINGREQ/PINGRESP心跳

客戶端在無報文發送時,按保活週期(KeepAlive)定時向服務端發送PINGREQ心跳報文,服務端響應PINGRESP報文。PINGREQ/PINGRESP報文均2個字節。

MQTT消息QoS

MQTT發佈消息QoS保證不是端到端的,是客戶端與服務器之間的。訂閱者收到MQTT消息的QoS級別,最終取決於發佈消息的QoS和主題訂閱的QoS。

發佈消息的QoS 主題訂閱的QoS 接收消息的QoS
0 0 0
0 1 0
0 2 0
1 0 0
1 1 1
1 2 1
2 0 0
2 1 1
2 2 2

Qos0消息發佈訂閱

_images/qos0_seq.png

Qos1消息發佈訂閱

Qos2消息發佈訂閱

 

_images/qos2_seq.png

MQTT會話(Clean Session)

MQTT客戶端向服務器發起CONNECT請求時,可以通過’Clean Session’標誌設置會話。

‘Clean Session’設置爲0,表示創建一個持久會話,在客戶端斷開連接時,會話仍然保持並保存離線消息,直到會話超時註銷。

‘Clean Session’設置爲1,表示創建一個新的臨時會話,在客戶端斷開時,會話自動銷燬。

MQTT連接保活心跳

MQTT客戶端向服務器發起CONNECT請求時,通過KeepAlive參數設置保活週期。

客戶端在無報文發送時,按KeepAlive週期定時發送2字節的PINGREQ心跳報文,服務端收到PINGREQ報文後,回覆2字節的PINGRESP報文。

服務端在1.5個心跳週期內,既沒有收到客戶端發佈訂閱報文,也沒有收到PINGREQ心跳報文時,主動心跳超時斷開客戶端TCP連接。

註解

emqttd消息服務器默認按最長2.5心跳週期超時設計。

MQTT遺願消息(Last Will)

MQTT客戶端向服務器端CONNECT請求時,可以設置是否發送遺願消息(Will Message)標誌,和遺願消息主題(Topic)與內容(Payload)。

MQTT客戶端異常下線時(客戶端斷開前未向服務器發送DISCONNECT消息),MQTT消息服務器會發布遺願消息。

MQTT保留消息(Retained Message)

MQTT客戶端向服務器發佈(PUBLISH)消息時,可以設置保留消息(Retained Message)標誌。保留消息(Retained Message)會駐留在消息服務器,後來的訂閱者訂閱主題時仍可以接收該消息。

例如mosquitto命令行發佈一條保留消息到主題’a/b/c’:

mosquitto_pub -r -q 1 -t a/b/c -m 'hello'

之後連接上來的MQTT客戶端訂閱主題’a/b/c’時候,仍可收到該消息:

$ mosquitto_sub -t a/b/c -q 1
hello

保留消息(Retained Message)有兩種清除方式:

  1. 客戶端向有保留消息的主題發佈一個空消息:

    mosquitto_pub -r -q 1 -t a/b/c -m ''
    
  2. 消息服務器設置保留消息的超期時間。

 

MQTT WebSocket連接

MQTT協議除支持TCP傳輸層外,還支持WebSocket作爲傳輸層。通過WebSocket瀏覽器可以直連MQTT消息服務器,發佈訂閱模式與其他MQTT客戶端通信。

MQTT協議的WebSocket連接,必須採用binary模式,並攜帶子協議Header:

Sec-WebSocket-Protocol: mqttv3.1 或 mqttv3.1.1

MQTT協議客戶端庫

emqtt客戶端庫

emqtt項目組: https://github.com/emqtt

emqttc Erlang MQTT客戶端庫
CocoaMQTT Swift語言MQTT客戶端庫
QMQTT QT框架MQTT客戶端庫

Eclipse Paho客戶端庫

Paho官網: http://www.eclipse.org/paho/

mqtt.org官網客戶端庫

mqtt.org: https://github.com/mqtt/mqtt.github.io/wiki/libraries

MQTT與XMPP協議對比

MQTT協議設計簡單輕量、路由靈活,將在移動互聯網物聯網消息領域,全面取代PC時代的XMPP協議:

  1. MQTT協議一個字節固定報頭,兩個字節心跳報文,報文體積小編解碼容易。XMPP協議基於繁重的XML,報文體積大且交互繁瑣。
  2. MQTT協議基於主題(Topic)發佈訂閱模式消息路由,相比XMPP基於JID的點對點消息路由更爲靈活。
  3. MQTT協議未定義報文內容格式,可以承載JSON、二進制等不同類型報文。XMPP協議採用XML承載報文,二進制必須Base64編碼等處理。
  4. MQTT協議支持消息收發確認和QoS保證,XMPP主協議並未定義類似機制。MQTT協議有更好的消息可靠性保證。

MQTT 在線測試工具

MQTT Web Toolkit 是 EMQ 最近開源的一款 MQTT (WebSocket) 測試工具,支持在線訪問使用。該工具採用了聊天界面形式,簡化了頁面操作邏輯,方便用戶快速測試驗證 MQTT 應用場景:

  • 支持通過普通或者加密的 WebSocket 端口連接至 MQTT 消息服務器;
  • 鏈接的新建、編輯、刪除以及緩存鏈接方便下次訪問使用;
  • 不同鏈接的訂閱列表管理;
  • 消息發佈、接收、以及接收到新消息時提示,同時支持按照消息類型過濾消息列表。

訪問 http://tools.emqx.io 即可查看使用。

 

 

參考資料

MQTT協議介紹 (Protocol):https://docs.emqx.io/broker/latest/cn/protocol.html#mqtt

發佈了104 篇原創文章 · 獲贊 138 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章