【问题标题】:paho mqtt client broker connectionpaho mqtt 客户端代理连接
【发布时间】:2016-09-05 05:37:31
【问题描述】:

我的发布者和经纪人在不同的系统上工作。我正在使用 QOS=2 来传递消息。我正在使用 python paho mqtt 代理。它是 MQTT 的进一步扩展 - 有没有办法检查客户端是否仍然连接

1) 当我向连接的代理发布消息时,它通过调用 on_publish() 回调来确认我。但是当我断开在不同机器上运行的代理与网络的连接时,发布者将发布消息存储在本地机器上,当我将代理连接到网络时,它再次将所有先前的消息发布到代理。我认为这些消息存储为飞行消息(未确认),如果这些消息是飞行消息,那么这些消息存储在哪里,这些飞行消息是否有任何限制,因为我的代码中没有包含任何关于飞行消息的内容。

【问题讨论】:

标签: mqtt iot mosquitto


【解决方案1】:

未传递的 Mqtt 消息(客户端尚未收到 PUBREL 数据包)存储在其本地会话存储区域中。 .类似地,如果服务器没有收到它的 PUBREL 消息的 PUBCOMP 响应,它必须将该消息视为未确认并将相关会话状态存储在其本地会话存储区域中。

两侧(服务器和客户端)缓存的大小直接由客户端或服务器的配置决定。这在 OASIS 标准第 4.1 节开头的第一个非规范性评论中提到。

the OASIS standard 上有一个很好的描述(如果偶尔混淆)QoS 2 消息的这个过程描述

【讨论】:

  • 这个本地存储只有在我们的客户端不断连接到电源时才存在,如果客户端断开电源电压,所有数据都会丢失..如果我是正确的?如果是,有什么方法可以存储这些数据,当客户端再次连接到代理时发送给代理?
  • 确保在设备断开连接时不会丢失存储数据。在某些时候,您必须接受消息丢失,因为您无法执行“保存尚未发送的消息”之类的操作。但是如果消息已经发送,但没有完成确认过程,那么它应该在服务器的缓存中。至少对于 QoS 2 消息。但同样,如果在发送消息之前网络中断,然后您断电并且设备上没有持久存储,那么消息就会丢失。
  • 谢谢杰夫,我想再问一个问题。我的客户有什么办法可以立即检测到与代理断开连接。我正在使用 mosquitto python 库,有一个名为 on_disconnect() 的回调函数,当客户端在断开连接后再次连接到代理时调用它,它不会立即调用。还有一件事是 on_disconnect() 函数仅在我关闭代理时调用,当我断开代理与网络的连接时它不会调用。
  • 当您告诉客户端断开连接时,基本上应该调用 on_disconnect。您可以定期发送 ping 请求,如果您没有收到 ping 响应,您可以知道服务器不可用。但是 MQTT 协议旨在将客户端与网络状态隔离 - 这就是客户端和服务器缓存的全部意义所在。通过知道服务器已断开客户端连接,您想达到什么目的?
  • 我正在研究 GPS 跟踪系统,因为我正在使用树莓派和 mqtt。当我的客户端与代理断开连接并且客户端再次与代理连接时,我想将所有 GPS 数据存储到本地数据库中,它将存储在数据库中的所有消息发送到代理(类似于同步过程)。但是 mosquitto python 库函数 on_disconnect() 不会立即调用,它会在我的客户端再次可供代理使用时调用。
【解决方案2】:

Paho mqtt Python 客户端目前不提供磁盘缓冲。

对于 Paho Java 客户端,默认情况下,正在进行的消息保存在内存中 (1)。为了在断电后保留消息,您可以提交名为 MqttDefaultFilePersistence(2) 的持久性类

【讨论】: