订阅 MQTT 主题(可能包含通配符)后,是否有办法确定已收到订阅主题的所有保留消息?
(更准确地说:订阅时在代理上存储的所有消息都保留了消息)
如果没有直接的方法,是否有任何黑客可以知道它(例如将具有特定 QoS 的新保留消息发送到订阅主题,这肯定是在旧消息之后收到的)?
我的问题的背景是我想要实现的这个功能请求(https://github.com/marvinroger/homie-esp8266/issues/313)。
因此,这将是带有 AsyncMQTT 库的 arduino (ESP8266) 的参考实现,但我的问题一般对于其他实现也有效(例如使用 paho-mqtt 等)。
简短回答,否。
客户端无法知道哪些主题可能有保留消息在任何时候等待,更不用说订阅时了。
您唯一能做的就是确保您以 QOS 1 或 2 进行订阅,此时经纪人将尽一切努力将它们交付给您。
唯一的迹象是第一个无保留消息的到达,因为代理应该(我认为)在任何新消息之前传递所有保留消息。 但是考虑到该主题的任何更新都可能被标记为保留,这可能没有帮助,您将需要关于不同主题的(无保留)消息来获得感觉。 编辑:设置了保留位的消息当作为新订阅的一部分传递时,稍后的消息会被代理进行位条带化。