MQTT:收不到离线消息
MQTT: Not receiving offline messsages
我的客户端使用以下参数连接:
- 清除会话:错误
- 客户端 ID:固定(每次都相同)
- 订阅 QoS=1
- 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
这是一个 GUI 客户端行为不当的案例。三个!
我发布它是为了让其他人不会在类似的事情上浪费时间。
我试了三个客户端,都有不同的问题,如下所述:
MQTT.fx: broker 确实在连接后立即传递消息,但当前会话中尚未订阅该主题,因此 MQTT.fx 没有任何指定的地方显示收到的消息。所以它不会在屏幕上显示消息。
MQTT.fx 还通过订阅 $SYS 日志主题使 Wireshark 调试复杂化,该主题会淹没 Wireshark,并且来自代理的主要消息在数据包泛滥中丢失。
MQTT Spy:与MQTT.fx不同,它有一个catch all选项卡,所以如果broker发送的消息在当前会话中没有被订阅,它将在捕获所有选项卡中显示它。不幸的是,MQTT Spy 的实施者决定他们的应用程序将在断开连接之前取消订阅所有主题。由于客户端不再订阅该主题,因此 borker 不会为其排队任何消息。
MQTT Lens:它有一个错误。它不会保存 Clean Session 的连接设置。即使您将 clean session 设置为 false,它始终会打开与 clean session=true 的连接。
最后,我用 Paho Java 库编写了一个测试程序,发现一切都按预期工作。
我想知道为什么没有 MQTT 的参考实现 GUI 客户端所有当前的实现要么被破坏要么不必要地 "smart" 以至于它们阻止您测试合法的测试用例。
我的客户端使用以下参数连接:
- 清除会话:错误
- 客户端 ID:固定(每次都相同)
- 订阅 QoS=1
- 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
这是一个 GUI 客户端行为不当的案例。三个!
我发布它是为了让其他人不会在类似的事情上浪费时间。
我试了三个客户端,都有不同的问题,如下所述:
MQTT.fx: broker 确实在连接后立即传递消息,但当前会话中尚未订阅该主题,因此 MQTT.fx 没有任何指定的地方显示收到的消息。所以它不会在屏幕上显示消息。 MQTT.fx 还通过订阅 $SYS 日志主题使 Wireshark 调试复杂化,该主题会淹没 Wireshark,并且来自代理的主要消息在数据包泛滥中丢失。
MQTT Spy:与MQTT.fx不同,它有一个catch all选项卡,所以如果broker发送的消息在当前会话中没有被订阅,它将在捕获所有选项卡中显示它。不幸的是,MQTT Spy 的实施者决定他们的应用程序将在断开连接之前取消订阅所有主题。由于客户端不再订阅该主题,因此 borker 不会为其排队任何消息。
MQTT Lens:它有一个错误。它不会保存 Clean Session 的连接设置。即使您将 clean session 设置为 false,它始终会打开与 clean session=true 的连接。
最后,我用 Paho Java 库编写了一个测试程序,发现一切都按预期工作。
我想知道为什么没有 MQTT 的参考实现 GUI 客户端所有当前的实现要么被破坏要么不必要地 "smart" 以至于它们阻止您测试合法的测试用例。