在上期中,我们介绍了 MQTT 包由固定头、可变头和负载三部分组成,以及 MQTT 包中的一些常见概念,如可变字节整数和属性。
MQTT Control Packets(MQTT控制包)了解吗?
现在,我们将根据实际用途进一步介绍每种包的组成。首先,我们将重点介绍用于建立 MQTT 连接的包。
如果我们要使用 MQTT 进行通信,第一步必须是建立 MQTT 连接。建立 MQTT 连接需要使用两个控制包,即 CONNECT 包和 CONNACK 包。CONNECT 包是客户端在建立网络连接后发送给服务器的第一个控制包,用于发起连接请求。服务器会返回一个 CONNACK 包来告知客户端连接结果。
我们使用 MQTTX客户端与公共 MQTT 服务器建立连接。
在上图这个连接中,我们将协议版本设置为 MQTT 5.0,Clean Start 设置为 1,会话过期间隔设置为 300 秒,心跳间隔设置为 60,用户名和密码分别设置为 admin 和 public。当然也可以用 MQTTX CLI 命令行工具与公共 MQTT 服务器建立连接。
mqttx conn --hostname broker.emqx.io--mqtt-version5 \
--session-expiry-interval300--keepalive60--username admin --password public
以下是由 MQTTX CLI 发送的 CONNECT 数据包,使用 Wireshark 捕获。
但这是一串十六进制字节,除非将其转换为以下格式才容易理解:
例如上述Variable Header里面的Protocol Name:00 04 4d 51 54 54
具体的协议编码及数据格式可以参考MQTT官方的资料:
https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901004
同样,我们还捕获了公共 MQTT 服务器返回的 CONNACK 包:
解析了这个数据包字符串后,我们可以看到,CONNACK 数据包的 Reason Code 为 0,这意味着连接成功。随后的多个属性提供了一组服务器支持的功能列表,例如支持的最大数据包大小、是否支持保留消息等:
上述示例有助于大家更好地理解 MQTT 包的结构。在实际应用中,您可以直接在 Wireshark 中查看包详情。Wireshark 对 MQTT 提供了很好的支持,它会直接列出每个字段的值,无需我们自行分析。
当然,Wireshark 确实为我们列出了每个字段的值。通过接下来对 CONNECT 和 CONNACK 包的结构介绍,结合 Wireshark 的包捕获结果,你将迅速掌握这两种包:
关于Wireshark的官方免费下载地址:
https://www.wireshark.org/#downloadLink
CONNECT包结构
Fixed Header固定头
在 CONNECT 报文的固定头部中,位于第一个字节高位的包类型字段必须是 1(0b0001),而第一个字节的低位必须全部为 0。
因此,CONNECT 报文的第一个字节的值必须是 0x10
。我们可以使用这一点来确定一个报文是否是 CONNECT 报文。
CONNECT 包的可变头部按顺序包含以下字段:
MQTT
,因此相应的完整内容在十六进制字节中为 00 04 4d 51 54 54
,其中 4d 51 54 54
是字符串 MQTT
的 ASCII 值。最早的 MQTT 3.1 中的协议名称为 MQIsdp
,因此对应于 00 06 4d 51 49 73 64 70
。在 CONNECT 包的 Payload 中,除了 Client ID 之外,其他所有字段都是可选的。它们的存在取决于可变头中的 Connect Flags 对应标志的值。然而,如果这些字段存在,它们必须按照 Client ID、Last Will Properties、Last Will Topic、Last Will Payload、User Name 和 Password 的顺序出现。
Fixed Header固定头
第一个固定头字节的高 4 位的值为 2(0b0010),表示这是一个 CONNACK 包。
Variable Header 变量头
CONNACK 包的可变头部按顺序包含以下字段:
结论
CONNECT 是客户端在网络连接与服务器建立之后发送的第一个 MQTT 包。CONNACK,作为 CONNECT 的响应包,通过原因码表示连接结果。
客户端和服务器需要使用 CONNECT 和 CONNACK 报文来完成必要的信息交换,例如协议版本、Client ID、客户端使用的用户名和密码、服务器支持的最大报文大小和 QoS,以及是否存在相应的会话。
以上是对 MQTT CONNECT 和 CONNACK 包的介绍。在后续的文章中,我们将继续研究像 PUBLISH 和 DISCONNECT 这样的包的结构和组成。
参考链接:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有