我刚开始使用MQTT。我已经设置了一个Arduino将MQTT消息发布到ActiveMQ。我还有一个订阅了相同主题的Python脚本(使用paho),该脚本从代理获取数据并将其插入到数据库中。问题是如果这个Python脚本关闭或者由于任何原因失去连接,我会丢失所有在它关闭时发布的消息。我如何确保所有数据都插入到数据库中?我看到ActiveMQ有某种存储,是否可以从中检索历史数据?
t40tm48m1#
如果您想确保订阅持续存在并且即使订阅者断开连接也能接收消息,那么您需要在MQTT客户端上设置CleanSession=false(假设您使用的是MQTT 3.x),并在重新连接时使用相同的客户端ID。此外,如果您希望消息在代理重新启动或崩溃后仍然存在,则需要使用QoS 1发送它们。
x0fgdtte2#
我认为PubSubClient Arduino库只发布了“触发并忘记”(QoS 0)。我使用stomp.py库创建订阅同一主题的持久消费者。如果Arduino上没有连接,则将其保存到SD卡;如果有连接但没有客户端,则消息将由ActiveMQ存储,直到客户端处于活动状态。这解决了我的问题,但我仍在测试耐用性
2条答案
按热度按时间t40tm48m1#
如果您想确保订阅持续存在并且即使订阅者断开连接也能接收消息,那么您需要在MQTT客户端上设置CleanSession=false(假设您使用的是MQTT 3.x),并在重新连接时使用相同的客户端ID。
此外,如果您希望消息在代理重新启动或崩溃后仍然存在,则需要使用QoS 1发送它们。
x0fgdtte2#
我认为PubSubClient Arduino库只发布了“触发并忘记”(QoS 0)。我使用stomp.py库创建订阅同一主题的持久消费者。如果Arduino上没有连接,则将其保存到SD卡;如果有连接但没有客户端,则消息将由ActiveMQ存储,直到客户端处于活动状态。
这解决了我的问题,但我仍在测试耐用性