mosquitto 经纪人未将离线消息发送到 adafruit 物联网门户

Offline messages not being send to adafruit iot portal by mosquitto broker

我有一个 raspberry pi,我在其中安装了 mosquitto 代理和 mqtt。 Pi 已连接到传感器,我需要将此数据发送到 adafruit IOT protal。当 pi 连接时我可以发送所有数据,但是当 pi 离线时,我只能传输 20-30 秒的数据。如果 pi 离线超过 2-3 分钟,则该数据不会传输到门户。

我创建了一个 bridge.conf 文件并添加了我的 mosquitto 使用的所有配置。内容如下:

connection iothub
address io.adafruit.com:1883
remote_username <username>
remote_password <password>
remote_clientid sensor1
bridge_cafile /etc/ssl/certs/ca-certificates.crt
try_private false
cleansession false
start_type automatic
bridge_insecure false
bridge_protocol_version mqttv311
bridge_tls_version tlsv1
notifications false
max_queued_messages 0
autosave_interval 5

topic # out 2 /sensors/sensor1
topic # in 2 /sensors/sensor1 

我已将 cleansession 设置为 false 并使用 QOS 2。我还将 max_queued_messages 设置为 0,这意味着最大值。我面临的问题是,如果 pi 仅离线 1-2 分钟,我能够获取所有离线数据,但如果离线超过 3-4 分钟,我将收不到任何数据。

在你的pi掉线的情况下,你在传感器端有什么样的持久化机制?

据我所知,默认情况下,如果代理离线,mqtt 仅在客户端存储少量数据。

事实上,我认为只要客户端仍然尝试向代理发送数据,它就会存储数据。换句话说,只要不超时。我认为默认情况下是 15 秒。

编辑

如果你想增加这个超时,你必须增加keep-alive时间。在 Paho Python 库中,它看起来像这样。

client.connect(host="localhost", port=1883, keepalive=60)

请记住,最大。保活时间为 18 小时 12 分 15 秒。

来自OASIS documentation

The Keep Alive is a time interval measured in seconds. Expressed as a 16-bit word, it is the maximum time interval that is permitted to elapse between two successive Control Packets sent by the Client.

当您将 65535s(16 位字的最大值)计算为更易读的格式时,您将得到 18 小时 12 分 15 秒。