首页 文章

MQTT:没有收到离线消息

提问于
浏览
0

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

  • 清洁会话:错误

  • 客户ID:固定(每次都相同)

  • 已订阅QoS = 1

  • 使用QoS = 1发布的消息

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

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

这就是我测试的方法:使用上面提到的四个参数将客户端连接到代理 . 通过QoS = 1订阅感兴趣的主题断开客户端

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

Expected Result :一旦重新 Build 连接,客户端就会收到在脱机时发送给其主题的消息 .

Actual Result :客户端没有消息 . 它能够接收在连接后发送的任何新消息,但不会收到离线消息 . **

我已经使用 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

    这是一个行为不端的GUI客户端的案例 . 其中三个!

    我发布它,以便其他人不会浪费时间在类似的东西上 .

    我尝试了三个客户,所有客户都有不同的问题,如下所述:

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

    MQTT Spy :与MQTT.fx不同,它有一个catch all选项卡,因此如果代理在当前会话中发送未订阅的消息,它将在catch all选项卡中显示它 . 不幸的是,MQTT Spy的实施者已决定他们的应用程序将在断开连接之前取消订阅所有主题 . 由于客户端不再订阅该主题,因此borker不会为其排队任何消息 .

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


    最后,我用Paho Java库编写了一个测试程序,发现一切都按预期工作 .

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

相关问题