paho mqtt客户机代理连接

paho mqtt客户机代理连接,mqtt,iot,mosquitto,Mqtt,Iot,Mosquitto,我的出版商和经纪人在不同的系统上工作。我使用QOS=2传递消息。我使用python paho mqtt代理。它是MQTT的进一步扩展-是否有方法检查客户端是否仍然连接 1) 当我将消息发布到连接的代理时,它通过调用_publish()回调来确认我。但是,当我将运行在不同机器上的代理与网络断开连接时,发布者会将发布消息存储在本地机器上,当我将代理连接到网络时,它会将以前的所有消息发布到代理。我认为这些消息存储为机上消息(未确认),如果这些消息是机上消息,那么这些消息的存储位置是否有任何限制,因为我

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


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

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

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


Paho-mqtt-Python客户机目前不提供磁盘缓冲,对QoS 2消息有一个很好的描述(如果偶尔混淆的话)


对于Paho Java客户端,默认情况下,机上消息保存在内存()中。为了在电源故障后保留消息,您可以将名为MqttDefaultFilePersistence()的持久性类作为mqtt规范的额外文件归档。

您可能需要查看源代码第142行,它在发布时将消息存储到本地列表。只有当我们的客户端不断连接到电源时,此本地存储才会存在,如果客户机断开电源电压,所有数据将丢失。。如果我是对的话?如果是,我们是否有任何方法可以存储这些数据,请在客户端再次连接到代理时发送到代理?确保在设备断开连接时不会丢失存储数据。在某些情况下,您必须接受消息丢失,因为您无法执行“保存尚未发送的消息”之类的操作。但是,如果消息已经发送,但没有完成确认过程,那么它应该在服务器的缓存中。至少对于QoS 2消息。但是,同样,如果在消息发送之前网络中断,然后您失去电源,并且设备上没有持久性存储,那么消息就会丢失。谢谢jeff,我想再问一个问题..我的客户端有没有办法立即检测到与broker的意外断开连接。我使用的是mosquitto python库,其中有一个回调函数在_disconnect()上调用,该函数在客户端断开连接后再次连接到代理时调用,它不会立即调用。还有一件事是on_disconnect()函数只在我关闭代理时调用,而在我从网络断开代理时不调用。on_disconnect基本上应该在你告诉客户端断开连接时调用。您可以定期发送ping请求,如果没有收到ping响应,您可以知道服务器不可用。但是MQTT协议的设计目的是将客户机与网络状态隔离开来——这就是客户机和服务器缓存的全部要点。通过知道服务器已断开客户端连接,您试图实现什么?我正在使用raspberry pi和mqtt开发GPS跟踪系统。当我的客户端与代理断开连接时,我想将所有GPS数据存储到本地数据库中,当客户端再次与代理连接时,它会将数据库中存储的所有消息发送到代理(类似于同步过程)。但_disconnect()上的mosquitto python库函数不会立即调用,它会在我的客户机再次对代理可用时调用。