0

我遇到了这个问题,在一个测试程序中,我正在为 MQTT 开发一个客户端,我订阅了一个主题,之后,我等待从服务器到我的客户端的“发布”消息。

在良好的接收(发布消息)或接收超时后,我向服务器发送一个 mqtt PINGREQ。

在 A PINGREQ 之后,我将等待 PINGRESP,然后我调用 recv,就像我在等待 PUBLISH 消息一样。

如果流程是这样的:

Client -> PINGREQ
Server -> PUBLISH
Server -> PINGRESP

比服务器发布消息丢失。如何解决这个问题?我在 QOS 0 上使用 MQTT,在这个 QOS 级别上解决这个问题是有意义的,还是在 QOS1 上检查这个案例是明智的?

4

1 回答 1

2

我认为你的事情有点混乱。当客户端和服务器之间没有任何其他网络流量通过时使用 PINGREQ/PINGRESP,以便让客户端和服务器都知道连接是否断开。

您的客户端应跟踪与服务器的最后一次传出或传入通信的时间,并在超过其 CONNECT 命令设置的保活计时器时发送 PINGREQ。如果没有收到通信,服务器将在 1.5*keepalive 断开客户端。如果客户端在发送 PINGREQ 的保活期间没有收到响应其 PINGREQ 的 PINGRESP,则客户端应假定服务器已断开连接。

QoS 级别并不那么重要,您必须确保保持活动超时。

我还想到,听起来您正在使用阻塞网络调用-如果可以获得更多灵活性,最好转向非阻塞。

于 2013-04-08T21:15:03.640 回答