MQTT:不接收脱机消息

MQTT:不接收脱机消息,mqtt,iot,mosquitto,Mqtt,Iot,Mosquitto,我的客户端使用以下参数连接: 清理会话:False 客户端ID:固定(每次相同) 以QoS=1订阅 以QoS=1发布的消息 我试图验证,如果代理在客户端脱机时收到消息,则消息将在代理上排队,并在客户端再次联机时发送给客户端 但是,我发现代理在重新连接时不会向客户端发送任何内容 我就是这样测试的: 使用上述四个参数将客户机连接到代理。 使用QoS=1订阅感兴趣的主题 断开客户端连接 使用另一个客户端程序和另一个客户端id,连接到代理 将消息发布到当前脱机客户端订阅的同一主题。 等待几秒钟,现在使用

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

  • 清理会话:False
  • 客户端ID:固定(每次相同)
  • 以QoS=1订阅
  • 以QoS=1发布的消息
  • 我试图验证,如果代理在客户端脱机时收到消息,则消息将在代理上排队,并在客户端再次联机时发送给客户端

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

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

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

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

    实际结果:客户端未收到任何消息。它能够接收连接后发送的任何新消息,但不能接收脱机消息**

    我已使用Wireshark验证发送到服务器的订阅和消息发布数据包的QoS为1,并且CONNECT数据包中的clean session标志为false

    经纪人:Mosquittov1.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
    

    这是一个GUI客户端行为不端的案例。三个

    我把它贴出来,这样别人就不会在类似的事情上浪费时间了

    我试过三位客户,他们都有不同的问题,如下所述:

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

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

    MQTT镜头:它有一个bug。它不会保存清理会话的连接设置。即使您将clean session设置为false,它也总是以clean session=true打开连接


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


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

    这是一个GUI客户端行为不端的案例。三个

    我把它贴出来,这样别人就不会在类似的事情上浪费时间了

    我试过三位客户,他们都有不同的问题,如下所述:

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

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

    MQTT镜头:它有一个bug。它不会保存清理会话的连接设置。即使您将clean session设置为false,它也总是以clean session=true打开连接


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


    我想知道为什么没有MQTT的参考实现GUI客户机—所有当前的实现要么都是坏的,要么是不必要的“智能的”它们阻止您测试合法的测试用例。

    您重新连接时是否重新订阅主题?我不应该这样做,因为代理应该记住我以前的订阅,因为以前的连接都是以cleanSession=false启动的。无论如何,我也尝试过重新订阅。我什么都没有。用你的mosquitto配置文件更新问题添加了问题中的配置重新连接时你是否重新订阅主题?我不应该这样做,因为代理应该记住我以前的订阅,因为即使以前的连接是以cleanSession=false启动的。无论如何,我也尝试过重新订阅。我什么都没有。用你的mosquitto配置文件更新问题添加了有问题的配置