确保始终发送 MQTT 消息,即使在代理关闭时也是如此

Posted

技术标签:

【中文标题】确保始终发送 MQTT 消息,即使在代理关闭时也是如此【英文标题】:Ensuring MQTT messages are always sent, even when broker is down 【发布时间】:2022-01-17 10:24:19 【问题描述】:

当我向物联网平台发送 MQTT 消息时,我有一个应用程序,物联网平台有自己的代理。问题出现在经纪人宕机 2-3 天时,我丢失了 2-3 天的数据。

我想知道是否有一种方法可以确保存储所有数据点,然后在代理按顺序重新联机时发送。我一直在用 Mosquitto 对此进行测试,但我似乎无法让它工作。

这是使用服务质量 (QoS) 的问题吗?即使经纪人关闭,这也能工作,还是需要经纪人与之通信?还是我需要使用持久性或保留?

【问题讨论】:

这将是您正在使用的 MQTT 客户端库的属性,而不是代理(因为它已关闭,它无法执行任何操作)。 【参考方案1】:

是的,你在正确的轨道上,它需要QoS并且必须与其他设置一起使用,你可以在以下条件下测试:

    使用设置为 False 的干净会话标志和唯一的客户端 ID 来初始化您的 MQTT 客户端;

    这是一个使用 Paho python 库的示例,

    mqttc = mqtt.Client("specify_a_unique_client_id", clean_session=False)
    

    订阅一个 QoS >= 1 的主题;

    发布到 QoS >= 1 的主题;

注意:您必须指定唯一的客户端 ID,以便您的代理在重新连接时仍能识别之前的客户端会话。将客户端 ID 留空将自动生成一个新的。

红利,这里有一个很好的系列articles来解释MQTT中的所有配置,以防你想了解细节。

【讨论】:

以上是关于确保始终发送 MQTT 消息,即使在代理关闭时也是如此的主要内容,如果未能解决你的问题,请参考以下文章

如何从网站向不支持 Websockets 的 MQTT 代理发送消息?

即使网络中断,如何继续在 websockets 中发送消息?

使用 pem 证书向远程代理发送消息

mosquitto mqtt 代理不会向订阅者发送超过 20 个发布数据包

CSS:即使在滚动时也使页脚始终位于页面底部

如何在服务器端清理 mqtt 消息有效负载?