日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

数据包格式_理解MQTT协议数据包结构

發(fā)布時間:2024/10/8 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据包格式_理解MQTT协议数据包结构 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在本教程中,我們將更詳細地介紹MQTT協(xié)議,以及MQTT消息或數(shù)據(jù)包的格式。

我們將研究:

MQTT消息格式。
MQTT消息頭
消息字段和編碼
控制消息編碼示例

介紹


MQTT是基于二進制的協(xié)議,控制元素是二進制字節(jié)而不是文本字符串。

MQTT使用命令和命令確認格式。

這意味著每個命令都有一個對應的確認。

主題名稱,客戶端ID,用戶名和密碼被編碼為UTF-8字符串。

除了MQTT協(xié)議信息(例如客戶端ID等)外,有效負載是二進制數(shù)據(jù),內容和格式是特定于應用程序的。

MQTT數(shù)據(jù)包或消息格式由2字節(jié)固定報頭(始終存在)+可變報頭(并非始終存在)+有效負載(并非始終存在)組成。

可能的數(shù)據(jù)包格式為:

  • Fixed Header (Control field + Length) – Example CONNACK

  • Fixed Header (Control field + Length) + Variable Header -Example PUBACK

  • Fixed Header (Control field + Length)? + Variable Header + payload -Example CONNECT

固定報頭字段由控制字段和可變長度數(shù)據(jù)包長度字段組成。

數(shù)據(jù)包長度字段的最小大小為1個字節(jié),用于總長度小于127個字節(jié)的消息(不包括控制字段和長度字段)。

最大數(shù)據(jù)包大小為256MB。小于127字節(jié)的小數(shù)據(jù)包具有1字節(jié)的數(shù)據(jù)包長度字段。

大于127且小于16383的數(shù)據(jù)包將使用2個字節(jié)。等等

注意:只是用7位,第8位用作連續(xù)位.

Note:?7 bits are used with the?8th bit?being a?continuation bit.

最小數(shù)據(jù)包大小只有2個字節(jié),其中包含一個單字節(jié)控制字段和一個單字節(jié)數(shù)據(jù)包長度字段。例如,斷開連接消息只有2個字節(jié)。

控制字段


8位控制字段是2字節(jié)固定報頭的第一個字節(jié)。它分為兩個4位字段,包含所有協(xié)議命令和響應。

前4個最高有效位是命令或消息類型字段,其他4位用作控制標志。

下表摘自MQTT 3.1.1規(guī)范,并顯示了MQTT命令及其相關代碼的示例。

因為它們是8位字節(jié)字段中最重要的部分,所以我也以十進制顯示了它們的字節(jié)值,就像它們出現(xiàn)在數(shù)據(jù)包中一樣。

?

控制標志

盡管有16種可能的標志,但實際上只使用其中少部分。

發(fā)行消息充分利用了這些標志,如下表所示:

當使用QOS或1或2重新發(fā)布消息時使用重復標志

發(fā)布消息時使用QOS標志,并指示QOS級別-0,1,2

保留消息標志也用于發(fā)布。

?

長度字段(剩余長度)

它的長度在1到4個字節(jié)之間。每個字節(jié)使用7位作為長度,其中MSB用作連續(xù)標志。

剩余長度是長度字段后面的字節(jié)數(shù),包括可變長度的頭和有效負載,如下所示:

下面說明了長度為64和321字節(jié)的數(shù)據(jù)包的長度字段

剩余數(shù)據(jù)包長度64個字節(jié)僅需要1個字節(jié):

321個字節(jié)的數(shù)據(jù)包長度需要2個字節(jié)的剩余長度字段:

從規(guī)范中獲取的下表顯示了數(shù)據(jù)包大小和數(shù)據(jù)包長度字段。

?

可變長度頭

如前所述,可變長度頭字段并不總是出現(xiàn)在MQTT消息中。

某些MQTT消息類型或命令要求使用此字段來攜帶其他控制信息。

可變長度報頭字段是相似的,但對于所有消息類型而言都不相同。

MQTT連接和斷開連接消息示例
作為說明,我們現(xiàn)在將查看連接消息的數(shù)據(jù)包詳細信息。

下面是一個真實的客戶端連接和斷開連接示例,顯示了已發(fā)送和已接收數(shù)據(jù)的實際字節(jié)值。

CONNECT控制代碼= 0x10

CONNACK控制碼= 0x20

MQTT數(shù)據(jù)包=控制+長度+協(xié)議名稱+協(xié)議級別+連接標志+保持活動+有效負載

(MQTT packet?=control + length + protocol name + Protocol Level +Connect Flags + keep alive +Payload)

注解:

  • 注意連接(0x10)和連接確認(0x20)控制代碼。

  • 注意十六進制0x17或23字節(jié)的總長度,其中不包括控制字段和長度字段。長度字段只有1個字節(jié)。

  • 您還應該能夠在發(fā)送的數(shù)據(jù)包中看到客戶端ID(python_test)。

  • 當查看實際的數(shù)據(jù)包字節(jié)時,Python會打印十六進制值,除非它可以匹配ASCII字符。在上面的示例中,keep alive字段為x00x3C,但顯示為x00

注解:

  • 客戶端ID字段作為有效內容的第一部分發(fā)送,而不是作為頭部的一部分發(fā)送。

  • 客戶端ID后跟一個長度字段。

  • 連接標志表明正在請求一個干凈的會話(clean session)。

  • 連接標志是“可變長度”標頭的一部分,用于指示用戶名,密碼的存在與否,以及有效負載中的消息字段。它還包含干凈會話標志和Will QOS。

控制包摘要表

Control PacketVariable HeaderPayload
CONNECTRequiredRequired
CONNACKNoneNone
PUBLISHRequiredOptional
PUBACKRequiredNone
PUBRECRequiredNone
PUBRELRequiredNone
PUBCOMPRequiredNone
SUBSCRIBERequiredRequired
SUBACKRequiredRequired
UNSUBSCRIBERequiredRequired
UNSUBACKRequiredRequired
PINGREQNoneNone
PINGRESPNoneNone
DISCONNECTNoneNone

?

Wireshark網絡分析

為了回應讀者有關TCP協(xié)議的問題,我創(chuàng)建了這張摘自Wireshark的屏幕截圖。

它顯示了一個MQTT客戶端連接和發(fā)布(QOS 1)。您可以清楚地看到總長度為58個字節(jié)的ACK數(shù)據(jù)包。

我們知道ACK數(shù)據(jù)包是2個字節(jié)。

因此,沒有MQTT的TCP數(shù)據(jù)包約為56個字節(jié)。

還有一點需要注意的有趣的事情是直到我完成數(shù)據(jù)包捕獲之前我都沒有想到的是,每個MQTT命令或響應都將獲得一個TCP ACK,甚至還有一個MQTT ACK。

如果查看屏幕截圖,則MQTT連接可以獲取TCP ACK響應和MQTT Connect ACK響應。

MQTT Connect ACK響應會有一個TCP ACK響應。

參考:MQTT V3.1.1 Specification pdf

http://www.steves-internet-guide.com/mqtt-protocol-messages-overview/

總結

以上是生活随笔為你收集整理的数据包格式_理解MQTT协议数据包结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。