新订阅时未使用 Mosquitto 的 QoS 1 消息

Mosquitto's QoS 1 message not being consumed upon new subscription

很确定这是一个可能总结了我对 MQTT 的(缺乏)理解的问题,所以提前道歉。

我正在使用 MQTT 在两个设备之间进行通信,通过使用 QoS 1,我希望我可以随时发布消息,并且我的订阅设备可以在下次连接时随时获取该消息。

例如,我想发送以下消息:

mosquitto_pub -t switch/sign/switch -m "ahoy world!" --qos 1 -d

如果我有一个订阅者已经订阅了这个主题,那么它将使用消息(并且这个位工作得很好)。但如果我不这样做,消息将在新客户端订阅该主题后立即被使用(至少我是这样理解 QoS 的)。

我的理解是,我应该通过这样的订阅立即收到消息:

mosquitto_sub -t switch/sign/switch --qos 1 -d

然而,当我订阅时,我没有收到任何消息。

在此希望得到一些帮助。

谢谢

不会,无论您以何种 QOS 发布消息,都不会为新客户端排队。

高 QOS 消息只为在代理中注册了持久会话的现有客户端排队。这是一个具有固定 clientId 的客户端,并且重新连接时干净的会话标志设置为 false。

mosquitto_sub 命令将在每次 运行 时生成一个新的随机 clientId,因此它不会重新连接到代理持有的现有持久会话。它还默认为 clean session true。

如果您运行满足以下条件:

mosquitto_sub -c -i fixedClientId -t switch/sign/switch --qos 1  

然后在发布您的测试消息之前断开此客户端 (ctrl-c),然后再次 运行 mosquitto_sub 命令您应该看到代理已将任何已发布的消息排队到该主题特定客户。

您可以阅读有关高 QOS 消息队列和持久会话的更多信息here

另一种选择是发布保留消息。当保留标志设置为 true 发布消息时,代理将保留给定主题的最后保留,并在任何客户端订阅该主题时立即传递它。这只是一条消息,每次代理为该主题接收到一条设置了保留位的消息时,它都会被替换。您可以阅读有关保留消息的更多信息 here