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
,訊息體內容是要訂閱的主題。