如何知道持久性MQTT会话是否仍然可用?

如何知道持久性MQTT会话是否仍然可用?,mqtt,Mqtt,这是关于MQTT协议和使用MQTT客户机的一般问题。特别是,我使用Mosquito作为服务器,使用ruby mqtt作为客户端 MQTT提供了持久会话的概念,这意味着在断开客户端连接时,保留以前的订阅,并将qos>0的消息排队。这意味着对于我的客户机实现,我可以在连接到代理后跳过订阅,除非是第一次 问题是:我如何确保我的订阅仍然存在?我想可能会有这样一种情况:启动一台新服务器时,它没有关于我以前会话的信息,因此也没有关于我的订阅的信息。实现持久会话的代理应该将该信息存储到磁盘/db中,以便在重新

这是关于MQTT协议和使用MQTT客户机的一般问题。特别是,我使用Mosquito作为服务器,使用ruby mqtt作为客户端

MQTT提供了持久会话的概念,这意味着在断开客户端连接时,保留以前的订阅,并将qos>0的消息排队。这意味着对于我的客户机实现,我可以在连接到代理后跳过订阅,除非是第一次


问题是:我如何确保我的订阅仍然存在?我想可能会有这样一种情况:启动一台新服务器时,它没有关于我以前会话的信息,因此也没有关于我的订阅的信息。

实现持久会话的代理应该将该信息存储到磁盘/db中,以便在重新启动后仍然存在。企业代理(例如IBM MQ)甚至可以跨多个代理实例联合这些信息以提供故障转移


话虽如此,通过跳过再次请求订阅,您实际上保存了什么?

在MQTT协议规范中,无法知道您的订阅是否存在

这取决于代理:它可以支持永久存储来保存持久订阅,以避免在发生故障(关机)时丢失订阅

在客户端,根据协议,您知道,在连接消息中使用clean session=FALSE时,您不需要在下次重新连接时订阅。这不取决于你,而取决于经纪人


Paolo.

你不能确定,这就是为什么我建议每次在应用程序开始时订阅你感兴趣的主题,也可以在连接
clean\u session=False
时订阅,以反驳我的共同回答,MQTT v3.1.1为代理提供了一种机制,用于告知正在重新连接的客户端会话已恢复。这是CONNACK消息期间提供的“会话存在”标志

表示支持MQTT v3.1.1的客户机/代理应支持此标志。例如,Paho 1.0客户机都应该这样做(Python客户机当然会这样做),而即将发布的1.4版mosquitto在其现有的MQTT v3.1.1支持的基础上增加了对该标志的支持


还值得注意的是,这是一个有用的功能,因为MQTT v3.1.1要求在每个订阅上传输保留的消息,而不管以前是否存在订阅。

好的,我实际保存的是订阅消息的传输,这在定期重新连接客户端(例如,gsm上的低能跟踪设备)的情况下可能会有所帮助。但答案是thx@hardillb-经纪人现在可以放弃州政府,所以没有保证。谢谢你的回答。我已经想到了这一点,但我还是想知道这一功能是什么意思。如果你知道(通过某种OOB方法?)你的代理已经持久化了你的客户端(例如,你知道它是一个现有的带有存储的代理,等等),你可以通过不订阅来节省一些字节。即便如此,我还是觉得在应用程序启动时订阅更安全。在很多情况下,使用GSM/GPRS连接时,您需要支付传输的字节数,因此您必须避免无用的流量。我认为您必须选择正确的代理并信任它(如果它是容错的并提供持久存储),这样您就可以避免在每次重新连接时发送订阅消息,即使clean session=false。啊,谢谢,伙计,这就是我希望的答案。这并不是说我现在迫切需要保存这几个字节,而是我想确保有可能合理地使用持久性特性。在v3.1.1之前,我想知道将保留的消息发布到“私有”主题(如“会话//”)是否是一种解决方案。重新连接时,我将立即收到保留的消息,因此无需再次订阅。你认为这是一个合理的解决方法吗?不完全是,因为保留消息和持久客户端可以被区别对待。例如,MOSQUITO可以配置为删除旧的持久性客户端,但不能删除保留的消息。@ralight。。。我在CONNACK消息中丢失了此标志。我对MQTT 3.1.1的M2Mqtt支持正在开发中;-)