MQTT:如何知道何时收到所有保留的消息
MQTT: How to know when all retained messages have been received
订阅 MQTT 主题(可能包含通配符)后,有没有办法确定已收到订阅主题的所有保留消息?
(更准确地说:在订阅时在代理处存储的所有消息都保留了消息)
如果没有直接的方法,是否有任何黑客可以知道它(比如向订阅的主题发送具有特定 QoS 的新保留消息,这肯定是在旧消息之后收到的)?
我的问题背景是我想要实现的这个功能请求 (https://github.com/marvinroger/homie-esp8266/issues/313)。
所以这将是带有 AsyncMQTT 库的 arduino (ESP8266) 的参考实现,但我的问题通常对其他实现也有效(例如使用 paho-mqtt 等)。
简答,否
客户端在任何时候都无法知道哪些主题可能有等待的保留消息,更不用说在订阅时了。
您唯一能做的就是确保以 QOS 1 或 2 订阅,届时经纪人将尽一切努力将它们交付给您。
唯一的指示是第一个 none 保留消息的到达,因为代理应该(我认为)在任何新消息之前传递所有保留消息。但是考虑到对该主题的任何更新都可能被标记为保留,这可能无济于事,您需要关于不同主题的(none 保留)消息来获得感觉。
如果您的经纪人支持 $SYS
主题,例如 aedes or mosca,您可以订阅 $SYS/+/new/clients
(对于 Aedes)以在您的客户端连接时收到消息,因此,基于@hardillb 的回答, 当您收到该消息时,表示已收到所有保留的消息,因为它会在所有保留后发送。
订阅 MQTT 主题(可能包含通配符)后,有没有办法确定已收到订阅主题的所有保留消息?
(更准确地说:在订阅时在代理处存储的所有消息都保留了消息)
如果没有直接的方法,是否有任何黑客可以知道它(比如向订阅的主题发送具有特定 QoS 的新保留消息,这肯定是在旧消息之后收到的)?
我的问题背景是我想要实现的这个功能请求 (https://github.com/marvinroger/homie-esp8266/issues/313)。
所以这将是带有 AsyncMQTT 库的 arduino (ESP8266) 的参考实现,但我的问题通常对其他实现也有效(例如使用 paho-mqtt 等)。
简答,否
客户端在任何时候都无法知道哪些主题可能有等待的保留消息,更不用说在订阅时了。
您唯一能做的就是确保以 QOS 1 或 2 订阅,届时经纪人将尽一切努力将它们交付给您。
唯一的指示是第一个 none 保留消息的到达,因为代理应该(我认为)在任何新消息之前传递所有保留消息。但是考虑到对该主题的任何更新都可能被标记为保留,这可能无济于事,您需要关于不同主题的(none 保留)消息来获得感觉。
如果您的经纪人支持 $SYS
主题,例如 aedes or mosca,您可以订阅 $SYS/+/new/clients
(对于 Aedes)以在您的客户端连接时收到消息,因此,基于@hardillb 的回答, 当您收到该消息时,表示已收到所有保留的消息,因为它会在所有保留后发送。