工商局网站实名认证怎么做,深圳好看的公司网站,wordpress外贸教程,php做网站完整视频欢迎阅读 MQTT 5.0 报文系列 的第四篇文章。在上一篇中#xff0c;我们已经介绍了 MQTT 5.0 中的 SUBSCRIBE 报文和 UNSUBSCRIBE 报文。现在#xff0c;我们将介绍用于维持连接的控制报文#xff1a;PINGREQ 和 PINGRESP。
除了用于连接、发布和订阅的控制报文#xff0c;…欢迎阅读 MQTT 5.0 报文系列 的第四篇文章。在上一篇中我们已经介绍了 MQTT 5.0 中的 SUBSCRIBE 报文和 UNSUBSCRIBE 报文。现在我们将介绍用于维持连接的控制报文PINGREQ 和 PINGRESP。
除了用于连接、发布和订阅的控制报文MQTT 还有一类报文用于在客户端和服务端之间模拟心跳以达到保持连接的目的它们分别是 PINGREQ 报文和 PINGRESP 报文我们通常也会称它们为心跳报文。
客户端定期向服务端发送 PINGREQ 报文服务端可以由此得知连接良好且客户端仍然活跃。每收到一个 PINGREQ 报文服务端就会回复一个 PINGRESP 报文因此客户端也可以由此得知连接良好且服务端仍然活跃。
报文示例
我们使用 MQTTX CLI 向 公共 MQTT 服务器 发起一个客户端连接不发布消息也不订阅主题但我们仍然可以在 Wireshark 中看到客户端和服务端之间总是周期性地出现 MQTT 报文的往返这些报文就是 PINGREQ 和 PINGRESP 报文。
以下命令将创建一个 Keep Alive 为 5 秒的客户端连接这可以让我们尽快看到客户端发送 PINGREQ 报文
mqttx conn --hostname broker.emqx.io --mqtt-version 5 --keepalive 5我们会发现 PINGREQ 和 PINGRESP 报文总是只有 2 个字节的大小并且它们的内容似乎也永远不会发生变化
# PINGREQ
c0 00
# PINGRESP
d0 00这是因为这两个报文有着非常简单的报文结构。
PINGREQ PINGRESP 报文结构
PINGREQ 和 PINGRESP 报文的区别仅仅是固定报头中报文类型的不同120xC表示这是一个 PINGREQ 报文130xD则表示这是一个 PINGRESP 报文。
因为 PINGREQ 和 PINGRESP 报文均不包含可变报头和有效载荷所以它们的固定报头中剩余长度字段的值永远都是 0。 这种报文结构让 PINGREQ 和 PINGRESP 报文的大小降到了最低所以发送它们并不会占用太多的带宽。
总结
PINGREQ 和 PINGRESP 是 MQTT 中最简单的报文类型它们的内容固定不变。我们唯一可以改变的就是通过连接时的 Keep Alive 选项影响客户端发送 PINGREQ 报文的频率。
如果服务端没有在 1.5 倍 Keep Alive 时间内收到客户端发送的任何控制报文就会认为客户端处于非活跃状态或网络异常而断开连接。在本文的报文示例中我们在连接时 Keep Alive 设置为 5 秒那么对服务端来说超时时间就是 7.5 秒。
对于客户端来说如果在发送 PINGREQ 报文之后的一段时间内没有收到服务端返回的 PINRESP 报文那么它应该断开连接。这个时间的长短主要取决于客户端对网络延迟的预期以及各个客户端 SDK 的具体实现。
现在我们对 MQTT 报文的了解又更进了一步在下一篇文章中我们将继续介绍在断开连接时使用的 DISCONNECT 报文。