MQTT Packet详解【05】:DISCONNECT断开连接报文

MQTT Packet详解【05】:DISCONNECT断开连接报文

现在,我们将介绍在断开连接时使用的控制报文: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

相关文章

条幅用什么颜色
365beatapp官方下载

条幅用什么颜色

📅 07-21 👁️ 1572
如何找到cache文件?不同浏览器cache文件位置详解!
365beatapp官方下载

如何找到cache文件?不同浏览器cache文件位置详解!

📅 09-21 👁️ 8883