recruit
—— 人力資源 ——
【MQTT】MQTT協(xié)議解析(MQTT數(shù)據(jù)包結(jié)構(gòu))
發(fā)布時間:2024-01-16瀏覽次數(shù):
MQTT協(xié)議解析(MQTT數(shù)據(jù)包結(jié)構(gòu))
來源:簡書 作者:Dg_fc58 時間:2019.07.27

協(xié)議就是通信雙方的一個約定,即,表示第1位傳輸?shù)氖裁?、?位傳輸?shù)氖裁础?。在MQTT協(xié)議中,一個MQTT數(shù)據(jù)包由:固定頭(Fixed header)、 可變頭(Variable header)、 消息體(payload)三部分構(gòu)成。
MQTT 數(shù)據(jù)包結(jié)構(gòu)
固定頭(Fixed header),存在于所有MQTT數(shù)據(jù)包中,表示數(shù)據(jù)包類型及數(shù)據(jù)包的分組類標(biāo)識
可變頭(Variable header),存在于部分MQTT數(shù)據(jù)包中,數(shù)據(jù)包類型決定了可變頭是否存在及其具體內(nèi)容
消息體(Payload),存在于部分MQTT數(shù)據(jù)包中,表示客戶端收到的具體內(nèi)容
1 MQTT固定頭
固定頭存在于所有MQTT數(shù)據(jù)包中,其結(jié)構(gòu)如下:
Bit 7 6 5 4 3 2 1 0
byte 1 MQTT數(shù)據(jù)包類型 不同類型MQTT數(shù)據(jù)包的具體標(biāo)識
byte 2… 剩余長度
1.1 MQTT數(shù)據(jù)包類型
位置:byte 1, bits 7-4。
相于一個4位的無符號值,類型如下:
名稱 值 流方向 描述
Reserved 0 不可用 保留位
CONNECT 1 客戶端到服務(wù)器 客戶端請求連接到服務(wù)器
CONNACK 2 服務(wù)器到客戶端 連接確認
PUBLISH 3 雙向 發(fā)布消息
PUBACK 4 雙向 發(fā)布確認
PUBREC 5 雙向 發(fā)布收到(保證第1部分到達)
PUBREL 6 雙賂 發(fā)布釋放(保證第2部分到達)
PUBCOMP 7 雙向 發(fā)布完成(保證第3部分到達)
SUBSCRIBE 8 客戶端到服務(wù)器 客戶端請求訂閱
SUBACK 9 服務(wù)器到客戶端 訂閱確認
UNSUBSCRIBE 10 客戶端到服務(wù)器 請求取消訂閱
UNSUBACK 11 服務(wù)器到客戶端 取消訂閱確認
PINGREQ 12 客戶端到服務(wù)器 PING請求
PINGRESP 13 服務(wù)器到客戶端 PING應(yīng)答
DISCONNECT 14 客戶端到服務(wù)器 中斷連接
Reserved 15 不可用 保留位
1.2 標(biāo)識位
位置:byte 1, bits 3-0。
在不使用標(biāo)識位的消息類型中,標(biāo)識位被做為保留位。如果收到無效的標(biāo)志時,接收端必須關(guān)閉網(wǎng)絡(luò)連接:
數(shù)據(jù)包 標(biāo)識位 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:發(fā)布消息的副本。用來在保證消息的可靠傳輸,如果設(shè)置為 1,則在下面的變長中增加MessageId,并且需要回復(fù)確認,以保證消息傳輸完成,但不能用于檢測消息重復(fù)發(fā)送。
QoS:發(fā)布消息的服務(wù)質(zhì)量,即:保證消息傳遞的次數(shù)
00:最多一次,即:<=1
01:至少一次,即:>=1
10:一次,即:=1
11:預(yù)留
RETAIN: 發(fā)布保留標(biāo)識,表示服務(wù)器要保留這次推送的信息,如果有新的訂閱者出現(xiàn),就把這消息推送給它,如果設(shè)有那么推送至當(dāng)前訂閱者后釋放。
1.3 剩余長度(Remaining Length)
位置:byte 1。
固定頭的第二字節(jié)用來保存變長頭部和消息體的總大小的,但不是直接保存的。這一字節(jié)是可以擴展,其保存機制,前7位用于保存長度,后一部用做標(biāo)識。當(dāng)最后一位為 1時,表示長度不足,需要使用二個字節(jié)繼續(xù)保存。 例如:計算出后面的大小為0
2 MQTT可變頭
MQTT數(shù)據(jù)包中包含一個可變頭,它駐位于固定的頭和負載之間??勺冾^的內(nèi)容因數(shù)據(jù)包類型而不同,較常的應(yīng)用是做為包的標(biāo)識:
Bit 7 6 5 4 3 2 1 0
byte 1 包標(biāo)簽符(MSB)
byte 2… 包標(biāo)簽符(LSB)
很多類型數(shù)據(jù)包中都包括一個2字節(jié)的數(shù)據(jù)包標(biāo)識字段,這些類型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK
3 Payload消息體
Payload消息體位MQTT數(shù)據(jù)包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四種類型的消息 有消息體:
CONNECT,消息體內(nèi)容主要是:客戶端的ClientID、訂閱的Topic、Message以及用戶名和密碼。
SUBSCRIBE,消息體內(nèi)容是一系列的要訂閱的主題以及QoS。
SUBACK,消息體內(nèi)容是服務(wù)器對于SUBSCRIBE所申請的主題及QoS進行確認和回復(fù)。
UNSUBSCRIBE,消息體內(nèi)容是要訂閱的主題。
作者:Dg_fc58
鏈接:https://www.jianshu.com/p/016858839e24
來源:簡書
著作權(quán)歸作者所有。
