2013-04-08 38 views
0

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

一个好的recv(发布消息)或recv超时后,我发送一个mqtt PINGREQ到服务器。

A PINGREQ后,我要等待PINGRESP,然后我打电话给recv,就像我在等待PUBLISH消息一样。

如果流程是这样的:

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

不是服务器发布消息丢失了。如何解决这个问题?我在QOS 0上使用MQTT,在这个QOS级别解决这个问题是合理的,或者在QOS1上检查这种情况很明智吗?

回答

2

我想你已经有些困惑了。 PINGREQ/PINGRESP用于在客户端和服务器之间没有任何其他网络流量通过时,为了让客户端和服务器知道连接是否断开,使用PINGREQ/PINGRESP。

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

QoS级别并不重要,您必须确保Keepalive超时保持不变。

对我来说,听起来好像你正在使用阻塞网络呼叫 - 如果你能获得更多的灵活性,最好转移到非阻塞。

+0

谢谢,我正在转移到非阻塞呼叫。通过这种方式,我的客户可以接收PINGREQ,并且有一个PUBLISH传入,对吗?这是好处吗? – andrea 2013-04-10 20:42:09

+0

我现在正在测试发布所有数据到达后,在接收期间没有发现更多数据,服务器似乎关闭连接。似乎在从服务器发布到客户端时,计时器未被重置。 – andrea 2013-04-11 11:22:20

+0

非阻塞呼叫具有显着的优势,即您在呼叫recv()后不必等待传入数据到达。 – ralight 2013-04-11 14:08:54