MQTT:如何知道何时收到所有保留的消息

问题描述 投票:0回答:2

订阅 MQTT 主题(可能包含通配符)后,是否有办法确定已收到订阅主题的所有保留消息?

(更准确地说:订阅时在代理上存储的所有消息都保留了消息)

如果没有直接的方法,是否有任何黑客可以知道它(例如将具有特定 QoS 的新保留消息发送到订阅主题,这肯定是在旧消息之后收到的)?

我的问题的背景是我想要实现的这个功能请求(https://github.com/marvinroger/homie-esp8266/issues/313)。

因此,这将是带有 AsyncMQTT 库的 arduino (ESP8266) 的参考实现,但我的问题一般对于其他实现也有效(例如使用 paho-mqtt 等)。

mqtt iot
2个回答
4
投票

简短回答,否。

客户端无法知道哪些主题可能有保留消息在任何时候等待,更不用说订阅时了。

您唯一能做的就是确保您以 QOS 1 或 2 进行订阅,此时经纪人将尽一切努力将它们交付给您。

唯一的迹象是第一个无保留消息的到达,因为代理应该(我认为)在任何新消息之前传递所有保留消息。 但是考虑到该主题的任何更新都可能被标记为保留,这可能没有帮助,您将需要关于不同主题的(无保留)消息来获得感觉。 编辑:设置了保留位的消息当作为新订阅的一部分传递时,稍后的消息会被代理进行位条带化。


1
投票

如果您的经纪人支持

$SYS
主题,例如aedesmosca,您可以订阅
$SYS/+/new/clients
(针对Aedes),以便在您的客户端连接时收到消息,因此,根据@hardillb的回答,当您收到该消息时这意味着所有保留的消息都已收到,因为它会在所有保留后发送。

© www.soinside.com 2019 - 2024. All rights reserved.