目錄
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特點
- 開放消息協議,簡單易實現
- 發佈訂閱模式,一對多消息發佈
- 基於TCP/IP網絡連接
- 1字節固定報頭,2字節心跳報文,報文結構緊湊
- 消息QoS支持,可靠傳輸保證
MQTT協議的主要特性
- MQTT 協議使用發佈 / 訂閱消息範式來做到一對多的消息分發以及應用程序的解耦
- MQTT 協議提供了 3 種(QoS)服務質量用於消息傳輸,適應不同的物聯網數據傳輸場景
- QoS 0:最多一次傳送 (只負責傳送,發送過後就不管數據的傳送情況)
- QoS 1:至少一次傳送 (確認數據交付)
- QoS 2:正好一次傳送 (保證數據交付成功)
- 通過很小的傳輸開銷,以及最小化的協議交換來減少網絡流量
- 發生異常斷線時通知各方的機制
MQTT主要應用
MQTT協議廣泛應用於物聯網、移動互聯網、智能硬件、車聯網、電力能源等領域。
- 物聯網M2M通信,物聯網大數據採集
- Android消息推送,WEB消息推送
- 移動即時消息,例如Facebook Messenger
- 智能硬件、智能傢俱、智能電器
- 車聯網通信,電動車站樁採集
- 智慧城市、遠程醫療、遠程教育
- 電力、石油與能源等行業市場
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消息發佈訂閱
Qos1消息發佈訂閱
Qos2消息發佈訂閱
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)有兩種清除方式:
-
客戶端向有保留消息的主題發佈一個空消息:
mosquitto_pub -r -q 1 -t a/b/c -m ''
-
消息服務器設置保留消息的超期時間。
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協議:
- MQTT協議一個字節固定報頭,兩個字節心跳報文,報文體積小編解碼容易。XMPP協議基於繁重的XML,報文體積大且交互繁瑣。
- MQTT協議基於主題(Topic)發佈訂閱模式消息路由,相比XMPP基於JID的點對點消息路由更爲靈活。
- MQTT協議未定義報文內容格式,可以承載JSON、二進制等不同類型報文。XMPP協議採用XML承載報文,二進制必須Base64編碼等處理。
- 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