繁体   English   中英

新订阅时未使用 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 消息仅对已向代理注册的持久 session 的现有客户端进行排队。 这是一个具有固定 clientId 的客户端,并且在干净的 session 标志设置为 false 的情况下重新连接。

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

如果您运行以下命令:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM