我在第一个物联网POC上工作,设备通常每小时/每天生成一次传感器数据。我计划有这样的架构: - 传感器数据输入的1个共享主题(设备到后端方向) - 每个设备最初都会订阅自己的特定主题aka / device / {id} / notification
现在,在传感器数据提交到共享主题之后,我计划将设备置于深度睡眠状态(设备只能通过wifi数据包或定时器唤醒),在此状态下,与代理的TCP连接将丢失。
问题:设备重新唤醒并重新建立到MQTT代理的TCP连接后,设备是否会收到服务器在服务中断期间生成的所有消息,否则这些消息将不可用?
答案 0 :(得分:1)
在客户端连接到代理程序期间,CleanSession
标志使代理程序可以排队丢失QoS 1或QoS 2的消息(存储QoS 0消息取决于实现)。
MQTT 3.1.1标准Section 3.1.2.4
指定:
如果CleanSession设置为0,则服务器务必根据当前会话的状态(由客户端标识符标识)恢复与客户端的通信。如果没有与客户端标识符相关的会话,则服务器必须创建一个新的会话。客户端和服务器断开连接后,客户端和服务器必须存储会话[MQTT-3.1.2-4]。在将CleanSession设置为0的会话断开连接后,服务器务必将与断开连接时客户端具有的所有订阅相匹配的其他QoS 1和QoS 2消息作为会话状态[MQTT-3.1.2- 5]。它还可以存储满足相同条件的QoS 0消息
持久会话的问题在于它可能使大量消息排队,因此重新连接时,客户端会被丢失的消息轰炸。如果您需要了解读数的全部顺序,那么这可能是合乎需要的;如果客户端运行在低功率,由电池供电的嵌入式设备上,则这是非常不希望的。
为解决此问题,MQTT提供了另一个功能:发布消息中的retained
标志。
MQTT 3.1.1标准第3.3.1.3节规定:
如果将RETAIN标志设置为1,则在客户端发送给服务器的PUBLISH数据包中,服务器必须存储应用消息及其QoS,以便可以将其传递给订阅与其主题名称匹配的将来的订阅者[MQTT-3.3.1-5]。建立新的订阅后,每个匹配主题名称上的最后保留消息(如有)必须发送给订阅者[MQTT-3.3.1-6]。如果服务器收到RETAIN标志设置为1的QoS 0消息,则它必须丢弃先前为该主题保留的任何消息。它应该将新的QoS 0消息存储为该主题的新保留消息,但是可以选择随时将其丢弃-如果发生这种情况,该主题将没有保留消息
这可确保重新连接后,客户端仅收到有关给定主题的最新消息。
答案 1 :(得分:0)
我很快就找到了答案。持久会话是anwer。我一直在寻找持久的订阅,但最初并没有成功......
这是关于我的案例的最后文章: http://www.hivemq.com/blog/mqtt-essentials-part-7-persistent-session-queuing-messages
所以是的,持久订阅被称为持久会话,是的,这是可能的。