我的客户端连接以下参数:
我正在尝试验证,如果代理在客户端脱机时接收到消息,则消息将在代理上排队并在再次联机时发送给客户端。
但是,我发现代理在重新连接时不会向客户端发送任何内容。
这是我测试的方式: 使用上述四个参数将客户端连接到代理。 以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
答案 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客户端,否则所有当前的实现都被破坏或不必要地变得“聪明”,以至于它们阻止您测试合法的测试用例。