協議就是通信雙方的一個約定,即,表示第1位傳輸的什么、第2位傳輸的什么……。在MQTT
協議中,一個MQTT
數據包由:固定頭(Fixed header)
、 可變頭(Variable header)
、 消息體(payload)
三部分構成。
MQTT 數據包結構
-
固定頭(Fixed header)
,存在於所有MQTT
數據包中,表示數據包類型及數據包的分組類標識 -
可變頭(Variable header)
,存在於部分MQTT
數據包中,數據包類型決定了可變頭是否存在及其具體內容 -
消息體(Payload)
,存在於部分MQTT
數據包中,表示客戶端收到的具體內容
1 MQTT
固定頭
固定頭
存在於所有MQTT
數據包中,其結構如下:
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
byte 1 | MQTT 數據包類型 |
不同類型MQTT 數據包的具體標識 |
||||||
byte 2… | 剩余長度 |
1.1 MQTT
數據包類型
位置:byte 1, bits 7-4。
相於一個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 | 不可用 | 保留位 |
1.2 標識位
位置:byte 1, bits 3-0。
在不使用標識位的消息類型中,標識位被做為保留位。如果收到無效的標志時,接收端必須關閉網絡連接:
數據包 | 標識位 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
---|---|---|---|---|---|
CONNECT | 保留位 | 0 | 0 | 0 | 0 |
CONNACK | 保留位 | 0 | 0 | 0 | 0 |
PUBLISH | MQTT 3.1.1使用 | DUP1 | QoS2 | QoS2 | RETAIN3 |
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,則在下面的變長中增加MessageId,並且需要回復確認,以保證消息傳輸完成,但不能用於檢測消息重復發送。 -
QoS
:發布消息的服務質量,即:保證消息傳遞的次數-
00
:最多一次,即:<=1 -
01
:至少一次,即:>=1 -
10
:一次,即:=1 -
11
:預留
-
-
RETAIN
: 發布保留標識,表示服務器要保留這次推送的信息,如果有新的訂閱者出現,就把這消息推送給它,如果設有那么推送至當前訂閱者后釋放。
1.3 剩余長度(Remaining Length)
位置:byte 1。
固定頭的第二字節用來保存變長頭部和消息體的總大小的,但不是直接保存的。這一字節是可以擴展,其保存機制,前7位用於保存長度,后一部用做標識。當最后一位為 1時,表示長度不足,需要使用二個字節繼續保存。 例如:計算出后面的大小為0
2 MQTT
可變頭
MQTT
數據包中包含一個可變頭,它駐位於固定的頭和負載之間。可變頭的內容因數據包類型而不同,較常的應用是做為包的標識:
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
byte 1 | 包標簽符(MSB) | |||||||
byte 2… | 包標簽符(LSB) |
很多類型數據包中都包括一個2字節的數據包標識字段,這些類型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK
3 Payload
消息體
Payload
消息體位MQTT
數據包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四種類型的消息 有消息體:
-
CONNECT
,消息體內容主要是:客戶端的ClientID、訂閱的Topic、Message以及用戶名和密碼。 -
SUBSCRIBE
,消息體內容是一系列的要訂閱的主題以及QoS
。 -
SUBACK
,消息體內容是服務器對於SUBSCRIBE
所申請的主題及QoS
進行確認和回復。 -
UNSUBSCRIBE
,消息體內容是要訂閱的主題。