MQTT協議-MQTT協議解析(MQTT數據包結構)


協議就是通信雙方的一個約定,即,表示第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,消息體內容是要訂閱的主題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM