1. 程式人生 > >MQTT協議—資料包結構

MQTT協議—資料包結構

一個MQTT協議資料包由固定頭(Fixed header),可變頭(Variable Header),訊息體(Payload)三部分組成。

一、固定頭

固定頭存在於所有的MQTT資料包中,表示資料包型別及資料包的分組類標識。其結構如下:

Bit 7 6 5 4 3 2 1 0
Byte1 MQTT資料包型別 不同型別MQTT資料包的具體標識
Byte2-5 剩餘長度

mqtt資料包型別:位於Byte1的第7~4位

名稱 流方向 描述
Reserved 0 不可用 保留位
CONNECT 1 客戶端到伺服器 客戶端請求連線到伺服器
CONNACK 2 伺服器到客戶端 連線確認
PUBLISH 3 雙向 釋出訊息
PUBACK 4 雙向 釋出確認
PUBREC 5 雙向 釋出收到(保證第1部分到達)
PUBREL 6 雙向 釋出釋放(保證第2部分到達)
PUBCOMP 7 雙向 釋出完成(保證第3部分到達)
SUBSCRIBE 8 客戶端到伺服器 客戶端請求訂閱
SUBACK 9 伺服器到客戶端 訂閱確認
UNSUBSCRIBE 10 客戶端到伺服器 請求取消訂閱
UNSUBACK 11 伺服器到客戶端 取消訂閱確認
PINGREQ 12 客戶端到伺服器 PING請求
PINGRESP 13 伺服器到客戶端 PING應答
DISCONNECT 14 客戶端到伺服器 中斷連線
Reserved 15 不可用 保留位

標識位:位於Byte1的第3~0位,在不使用標識位的訊息型別中,標識位被做為保留位。如果收到無效的標誌時,接收端必須關閉網路連線。

資料包 標識位 Bit3 Bit2 Bit1 Bit0
CONNECT 保留位 0 0 0 0
CONNACK 保留位 0 0 0 0
PUBLISH MQTT 3.1.1使用 DUP QoS QoS RETAIN
PUBACK 保留位 0 0 0 0
PUBREC 保留位 0 0 0 0
PUBREL 保留位 0 0 0 0
PUBCOMP 保留位 0 0 0 0
SUBSCRIBE 保留位 0 0 0 0
SUBACK 保留位 0 0 0 0
UNSUBSCRIBE 保留位 0 0 0 0
UNSUBACK 保留位 0 0 0 0
PINGREQ 保留位 0 0 0 0
PINGRESP 保留位 0 0 0 0
DISCONNECT 保留位 0 0 0 0

DUP:

釋出訊息的副本。用來在保證訊息的可靠傳輸,如果設定為1,則在下面的變長中增加Messageld,並且需要回復確認,以保證訊息傳輸完成,但不能用於檢測訊息重複傳送。

QoS:

釋出訊息的服務質量,即:保證訊息傳遞的次數。(1)00:“至多一次”,訊息釋出完全依賴底層 TCP/IP 網路。會發生訊息丟失或重複。這一級別可用於如下情況,環境感測器資料,丟失一次讀記錄無所謂,因為不久後還會有第二次傳送。01:“至少一次”,確保訊息到達,但訊息重複可能會發生。10:“只有一次”,確保訊息到達一次。這一級別可用於如下情況,在計費系統中,訊息重複或丟失會導致不正確的結果。11:預留。

RETAIN

釋出保留標識,表示伺服器要保留這次推送的資訊,如果有新的訂閱者出現,就把這訊息推送給它,如果設有那麼推送至當前訂閱者後釋放。

剩餘長度(Remaining Length)

固定頭的第二位元組用來儲存變長頭部和訊息體的總大小的,但不是直接儲存的。這一位元組是可以擴充套件,其儲存機制,前7位用於儲存長度,後一部用做標識。當最後一位為 1時,表示長度不足,需要使用二個位元組繼續儲存。 例如:計算出後面的大小為0

二、可變頭

可變頭存在於部分MQTT資料包中,資料包型別決定了可變頭是否存在及其具體內容。它駐位於固定的頭和負載之間。可變頭的內容因資料包型別而不同,較常的應用是做為包的標識:

Bit 7 6 5 4 3 2 1 0
Byte1 包標籤符(MSB)
Byte2-5 包標籤符(LSB)

很多型別資料包中都包括一個2位元組的資料包標識欄位,這些型別的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK

 

三、訊息體

訊息體存在於部分的MQTT資料包中,表示客戶端收到的具體內容。

Payload訊息體位MQTT資料包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四種類型的訊息 有訊息體:

 

CONNECT,訊息體內容主要是:客戶端的ClientID、訂閱的Topic、Message以及使用者名稱和密碼。

SUBSCRIBE,訊息體內容是一系列的要訂閱的主題以及QoS

SUBACK,訊息體內容是伺服器對於SUBSCRIBE所申請的主題及QoS進行確認和回覆。

UNSUBSCRIBE,訊息體內容是要訂閱的主題。