新订阅时未使用 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
很确定这是一个可能总结了我对 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