现在,我们将介绍在断开连接时使用的控制报文:DISCONNECT。
在 MQTT 中,客户端和服务器都可以在断开网络连接之前向对方发送 DISCONNECT 报文,以表明断开连接的原因。客户端发送的 DISCONNECT 报文还可以影响断开连接后服务器的行为,例如是否发送遗留(Will)消息,或者是否更新会话过期间隔。
我们使用 MQTTX CLI 与指定的 Client ID 连接到公共 MQTT 服务器,并设置 --reconnect-period
为 0 以禁用自动重连:
然后在另一个终端中运行相同的命令以使用相同的 Client ID 创建客户端连接。
在我们发起第二次连接后,Wireshark 将捕获公共 MQTT 服务器返回给第一次连接的 DISCONNECT 包:
这四个十六进制字节对应以下包内容:
我们接下来详细介绍DISCONNECT 包结构。
DISCONNECT Packet Structural
DISCONNECT包结构
Fixed Header固定头
Packet Type 字段的值位于固定报头的第一字节的高 4 位,其值为 14(0b1110),低 4 位均为 0,表示这是一个 DISCONNECT 包。
DISCONNECT 包的可变头部按顺序包含以下字段:
与其他之前介绍的包不同,DISCONNECT 包中的 Reason Codes 和 Properties 可以被客户端和服务器使用的范围不同。例如,Session Expiry Interval 属性只能在客户端发送的 DISCONNECT 包中使用,因此我们已经在上面的列表中列出了它们可用的范围。
没有Payload。
Conclusion
结论
客户端和服务器都可以发送 DISCONNECT 包以表示它们准备好断开与网络的连接。包中的 Reason Code 可以向接收方指示连接关闭的原因。当 MQTT 连接意外断开时,我们可以首先检查是否接收到 DISCONNECT 包以及包中 Reason Code 的值。
虽然在 DISCONNECT 包中,客户端和服务器可以使用的 Reason Codes 和 Properties 有所不同,但我们不需要刻意记住它们。它们通常与相应的机制和行为相关。例如,Will Message 只会由服务器发布,因此当有正常断开连接的愿望但对方仍然需要发布 Will Message 时使用的 Reason Code 0x04
,只会由客户端使用。
参考链接:
扫码关注腾讯云开发者
领取腾讯云代金券
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. 腾讯云 版权所有