在本教程中,我们将更详细地介绍MQTT协议,以及MQTT消息或数据包的格式。

我们将研究:

MQTT消息格式。
MQTT消息头
消息字段和编码
控制消息编码示例

介绍

MQTT是基于二进制的协议,控制元素是二进制字节而不是文本字符串。

MQTT使用命令和命令确认格式。

这意味着每个命令都有一个对应的确认。

主题名称,客户端ID,用户名和密码被编码为UTF-8字符串。

除了MQTT协议信息(例如客户端ID等)外,有效负载是二进制数据,内容和格式是特定于应用程序的。

MQTT数据包或消息格式由2字节固定报头(始终存在)+可变报头(并非始终存在)+有效负载(并非始终存在)组成。

可能的数据包格式为:

  • 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

固定报头字段由控制字段和可变长度数据包长度字段组成。

数据包长度字段的最小大小为1个字节,用于总长度小于127个字节的消息(不包括控制字段和长度字段)。

最大数据包大小为256MB。小于127字节的小数据包具有1字节的数据包长度字段。

大于127且小于16383的数据包将使用2个字节。等等

注意:只是用7位,第8位用作连续位.

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

最小数据包大小只有2个字节,其中包含一个单字节控制字段和一个单字节数据包长度字段。例如,断开连接消息只有2个字节。

控制字段

8位控制字段是2字节固定报头的第一个字节。它分为两个4位字段,包含所有协议命令和响应。

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

下表摘自MQTT 3.1.1规范,并显示了MQTT命令及其相关代码的示例。

因为它们是8位字节字段中最重要的部分,所以我也以十进制显示了它们的字节值,就像它们出现在数据包中一样。

控制标志

尽管有16种可能的标志,但实际上只使用其中少部分。

发行消息充分利用了这些标志,如下表所示:

当使用QOS或1或2重新发布消息时使用重复标志

发布消息时使用QOS标志,并指示QOS级别-0,1,2

保留消息标志也用于发布。

长度字段(剩余长度)

它的长度在1到4个字节之间。每个字节使用7位作为长度,其中MSB用作连续标志。

剩余长度是长度字段后面的字节数,包括可变长度的头和有效负载,如下所示:

下面说明了长度为64和321字节的数据包的长度字段

剩余数据包长度64个字节仅需要1个字节:

321个字节的数据包长度需要2个字节的剩余长度字段:

从规范中获取的下表显示了数据包大小和数据包长度字段。

可变长度头

如前所述,可变长度头字段并不总是出现在MQTT消息中。

某些MQTT消息类型或命令要求使用此字段来携带其他控制信息。

可变长度报头字段是相似的,但对于所有消息类型而言都不相同。

MQTT连接和断开连接消息示例
作为说明,我们现在将查看连接消息的数据包详细信息。

下面是一个真实的客户端连接和断开连接示例,显示了已发送和已接收数据的实际字节值。

CONNECT控制代码= 0x10

CONNACK控制码= 0x20

MQTT数据包=控制+长度+协议名称+协议级别+连接标志+保持活动+有效负载

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

注解:

  • 注意连接(0x10)和连接确认(0x20)控制代码。

  • 注意十六进制0x17或23字节的总长度,其中不包括控制字段和长度字段。长度字段只有1个字节。

  • 您还应该能够在发送的数据包中看到客户端ID(python_test)。

  • 当查看实际的数据包字节时,Python会打印十六进制值,除非它可以匹配ASCII字符。在上面的示例中,keep alive字段为x00x3C,但显示为x00

注解:

  • 客户端ID字段作为有效内容的第一部分发送,而不是作为头部的一部分发送。

  • 客户端ID后跟一个长度字段。

  • 连接标志表明正在请求一个干净的会话(clean session)。

  • 连接标志是“可变长度”标头的一部分,用于指示用户名,密码的存在与否,以及有效负载中的消息字段。它还包含干净会话标志和Will QOS。

控制包摘要表

Control Packet Variable Header Payload
CONNECT Required Required
CONNACK None None
PUBLISH Required Optional
PUBACK Required None
PUBREC Required None
PUBREL Required None
PUBCOMP Required None
SUBSCRIBE Required Required
SUBACK Required Required
UNSUBSCRIBE Required Required
UNSUBACK Required Required
PINGREQ None None
PINGRESP None None
DISCONNECT None None

Wireshark网络分析

为了回应读者有关TCP协议的问题,我创建了这张摘自Wireshark的屏幕截图。

它显示了一个MQTT客户端连接和发布(QOS 1)。您可以清楚地看到总长度为58个字节的ACK数据包。

我们知道ACK数据包是2个字节。

因此,没有MQTT的TCP数据包约为56个字节。

还有一点需要注意的有趣的事情是直到我完成数据包捕获之前我都没有想到的是,每个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协议数据包结构相关推荐

  1. MQTT协议图解,一文看懂MQTT协议数据包(真实报文数据解析解释)

    文章目录 一.MQTT协议 二.协议详解 2.1 协议结构 2.1.1 固定报头 2.1.2 可变报头 2.1.3 有效载荷 三.具体协议报文详解 3.1 连接服务器报文详解 3.2 发布消息报文详解 ...

  2. MQTT协议数据包结构

    MQTT协议数据包结构 协议就是通信双方的一个约定,即,表示第1位传输的什么.第2位传输的什么--.在MQTT协议中,一个MQTT数据包由:固定头(Fixed header). 可变头(Variabl ...

  3. 浅浅的 使用网络调试助手和Mosquitto 分析MQTT协议数据包内容

    使用网络调试助手和Mosquitto 分析MQTT协议数据包内容 参考: 零.涉及到的主要的数据包: 一.环境搭建 二.connect数据包 根据数据包的内容逐个字节进行分析: 三.心跳包 四.订阅S ...

  4. 合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(一)

    本篇目标 一.调通合泰单片机串口(成功接收和发送数据) 二.通过WiFi模块连接到Onenet_MQTT服务器 合泰32串口 HT32F5XXX串口 如下表所示,HT32F52352芯片USART0. ...

  5. mqtt 变为乱码 接受16进制字节流_转战物联网#183;基础篇07-深入理解MQTT协议之控制报文(数据包)格式...

    在MQTT协议中,一个控制报文(数据包)的结构按照前后顺序分如下三部分: 结构名 中文名 解释说明 Fixed header 固定报头 报文的最开始部分,所有报文都包含这个部分 Variable he ...

  6. 【EMQX 5.0】1.3 MQTT协议数据包结构

    1. MQTT数据包         官方文档: http://mqtt.org/documentation          MQTT数据包 由以下 三部分构成 : 固定头(Fixed header ...

  7. http报文格式_理解数据通信协议的报文格式有何用?

    我们知道应用层的PDU是报文,最后变成物理层的比特流来传播,那么一个协议的报文格式同这个报文本身是什么关系?理解一个协议的报文格式有什么作用?简而言之,数据的发送方每层(从高层向底层下沉过程)做原始数 ...

  8. 合泰32-Onenet-WiFi模块-合泰单片机通过MQTT协议数据上云(二)

    本篇目标 一.学习MQTT协议 二.发送温度湿度数据到OneNET 准备材料 感觉麻烦的小伙伴请移步到文末,那里有整个工程的链接. (关于串口和WiFi部分的内容,可以查看前一篇博文,链接:这个是传送 ...

  9. modbus连续读取时数据不正确_使用MODBUS协议与传感器、工控屏对接时碰到的问题...

    当控制器作为可编程逻辑器件用于工控系统时,其需要与各种不同的传感器对接, 同时需要与工控屏对接,以提供人机界面与用户进行交互: 对接的传感器功能多种多样, 有检测环境的温.湿度.二氧化碳.光照等的传感 ...

最新文章

  1. Android - 已安装了存在签名冲突的同名数据包,解决方法!
  2. fmt.Println、fmt.Printf、fmt.Sprintf、fmt.Sprintln
  3. WEBAPI 增加身份验证 (OAUTH 2.0方式)
  4. SetDockingMode 设置dock停泊方式
  5. 【git】git 使用 Submodule 管理子模块 报错 pathspec did not match any files
  6. php删除二维数组的某一行某一列_php中怎么去除二维数组的某个字段?
  7. 内网穿透工具_utools让你3步搭建一个内网穿透工具
  8. Wine 4.4 发布,Windows 应用的兼容层
  9. Goodfellow说,聊失败才不是在秀优越...
  10. Javascript三种创建对象的方法,new关键字,for...in 遍历对象
  11. Unity OnPostprocessTexture 和 OnPreprocessTexture 使用注意事项
  12. 身体排毒,自己就可以轻松搞定 - 生活至上,美容至尚!
  13. VS2018 查看类图 安装-属性,快捷键
  14. 欧拉定理和费马小定理
  15. Linux:获取线程的PID(TID、LWP)的几种方式
  16. ardupilot 中关键坐标系
  17. 【毕业设计】基于单片机的心率检测系统 - stm32 物联网 嵌入式
  18. python之转义字符
  19. 数据库 PolarDB 开源之路该如何走?听听他们怎么说
  20. linux安装ati工具,Linux下ATI驱动安装傻瓜安装方法

热门文章

  1. python 保存本地乱码_请教大神,如何解决保存后的文件的乱码问题
  2. Qt Post上传图片文件到服务器
  3. 如何快速学会嵌入式?
  4. python(numpy,pandas12)——pandas plot 画图
  5. Javaweb基础——Servlet
  6. java 传递intent_Android中使用Intent在Activity之间传递对象(使用Serializable或者Parcelable)的方法...
  7. python json包_python编程 之 json包
  8. 华为鸿蒙ai字幕,EMUI11一个值得吹爆的功能?AI字幕,支持翻译英日韩
  9. python视频处理教程_Python视频编辑库:MoviePy|python爬虫|python入门|python教程
  10. C51对标准C语言的扩展 / 数据类型