MQTT:未收到离线消息

时间:2018-08-02 12:44:45

标签: mqtt iot mosquitto

我的客户端连接以下参数:

  1. 清洁会议:错误
  2. 客户端ID:固定(每次相同)
  3. 已订阅QoS = 1
  4. 以QoS = 1发布的消息

我正在尝试验证,如果代理在客户端脱机时接收到消息,则消息将在代理上排队并在再次联机时发送给客户端。

但是,我发现代理在重新连接时不会向客户端发送任何内容。

这是我测试的方式: 使用上述四个参数将客户端连接到代理。 以QoS = 1订阅感兴趣的主题 断开客户端连接

使用另一个客户端程序和另一个客户端ID,连接到代理 将消息发布到当前脱机客户端已订阅的同一主题。 等待几秒钟,现在使用与以前相同的连接设置重新连接脱机客户端。

预期结果:重新建立连接后,客户端将收到脱机时发送到其主题的消息。

实际结果:客户端未收到任何消息。它能够接收连接后发送的所有新消息,但没有离线消息。**

我已经使用 Wireshark 验证了发送到服务器的SUBSCRIBE和消息PUBLISH数据包的QoS = 1,并且CONNECT数据包中的干净会话标志为false。

经纪人:Mosquitto v1.4.11

MQTT配置文件:

pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log
log_type debug

listener 9001
protocol websockets

listener 1883
protocol mqtt

allow_anonymous false
acl_file /path/to/acl_file
password_file /path/to/password_file

1 个答案:

答案 0 :(得分:0)

这是GUI客户端行为异常的情况。他们三个!

我正在发布它,以便其他人不会在类似的事情上浪费时间。

我尝试了三个客户端,每个客户端都有不同的探测,如下所述:

MQTT.fx :代理确实在连接后立即传递了消息,但是该主题在当前会话中尚未订阅,因此MQTT.fx没有任何指定的位置来显示接收到的消息。因此它不会在屏幕上显示该消息。 MQTT.fx还通过订阅$ SYS logs主题使Wireshark调试复杂化,该主题使Wireshark泛滥,并且来自代理的主要消息在数据包泛滥中丢失。

MQTT Spy :与MQTT.fx不同,它具有“全部捕获”选项卡,因此,如果代理发送的消息在当前会话中未订阅,它将在“全部捕获”中显示标签。不幸的是,MQTT Spy的实现者决定在断开连接之前,其应用程序将退订所有主题。由于客户端不再订阅该主题,因此borker不会为此排队任何消息。

MQTT镜头:它有一个错误。它不会保存Clean Session的连接设置。即使将clean session设置为false,它也始终使用clean session = true打开连接。


最后,我用Paho Java库编写了一个测试程序,发现一切正常。

我想知道为什么没有用于MQTT的参考实现GUI客户端,否则所有当前的实现都被破坏或不必要地变得“聪明”,以至于它们阻止您测试合法的测试用例。