现在,我们将介绍在断开连接时使用的控制报文:DISCONNECT。
MQTT 5.0 Packet Explained 05: DISCONNECT在 MQTT 中,客户端和服务器都可以在断开网络连接之前向对方发送 DISCONNECT 报文,以表明断开连接的原因。客户端发送的 DISCONNECT 报文还可以影响断开连接后服务器的行为,例如是否发送遗留(Will)消息,或者是否更新会话过期间隔。
Sample DISCONNECT PacketDisconnect样例报文我们使用 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 包。
Variable Header 变量头
DISCONNECT 包的可变头部按顺序包含以下字段:
Reason Code原因代码: 一个单字节值,用于向另一端指示断开连接的原因。下面的表格列出了 DISCONNECT 包中常见的 Reason Code。如需完整列表,请参阅 MQTT 5.0 Reason Code 快速参考指南。
Properties属性:以下列出了 DISCONNECT 报文的所有可用属性。
与其他之前介绍的包不同,DISCONNECT 包中的 Reason Codes 和 Properties 可以被客户端和服务器使用的范围不同。例如,Session Expiry Interval 属性只能在客户端发送的 DISCONNECT 包中使用,因此我们已经在上面的列表中列出了它们可用的范围。
Payload 载荷没有Payload。
图片Conclusion
结论
客户端和服务器都可以发送 DISCONNECT 包以表示它们准备好断开与网络的连接。包中的 Reason Code 可以向接收方指示连接关闭的原因。当 MQTT 连接意外断开时,我们可以首先检查是否接收到 DISCONNECT 包以及包中 Reason Code 的值。
虽然在 DISCONNECT 包中,客户端和服务器可以使用的 Reason Codes 和 Properties 有所不同,但我们不需要刻意记住它们。它们通常与相应的机制和行为相关。例如,Will Message 只会由服务器发布,因此当有正常断开连接的愿望但对方仍然需要发布 Will Message 时使用的 Reason Code 0x04 ,只会由客户端使用。
参考链接:
https://www.ids-sax2.com/understanding-mqtt-5-0-disconnect-messages-a-comprehensive-guide/https://www.emqx.com/en/blog/mqtt-5-0-control-packets-05-disconnect