Asynchronous MQTT代理是否支持持久订阅?

Asynchronous MQTT代理是否支持持久订阅?,asynchronous,mqtt,iot,messagebroker,Asynchronous,Mqtt,Iot,Messagebroker,我的第一个物联网POC工作时,该设备通常每小时/天生成一次传感器数据。我计划采用这样的架构: -1传感器数据输入共享主题(设备到后端方向) -每个设备将首先订阅自己的特定主题aka/device/{id}/notification 现在,在传感器数据提交到共享主题后,我计划让设备进入深度睡眠(设备只能通过wifi数据包或计时器唤醒),在这种状态下,到代理的TCP连接丢失 问题:在设备被唤醒并重新建立到MQTT broker的TCP连接后,该设备是否会接收服务器在停用期间生成的所有消息,或者这些消

我的第一个物联网POC工作时,该设备通常每小时/天生成一次传感器数据。我计划采用这样的架构: -1传感器数据输入共享主题(设备到后端方向) -每个设备将首先订阅自己的特定主题aka/device/{id}/notification

现在,在传感器数据提交到共享主题后,我计划让设备进入深度睡眠(设备只能通过wifi数据包或计时器唤醒),在这种状态下,到代理的TCP连接丢失


问题:在设备被唤醒并重新建立到MQTT broker的TCP连接后,该设备是否会接收服务器在停用期间生成的所有消息,或者这些消息将不可用?

我很快找到了答案。持久会话是解决方法。我正在寻找持久订阅,但最初没有成功

下面是关于我的案例的最后一篇精彩文章:


因此,是的,持久订阅称为持久会话,是的,这是可能的。

在客户端连接到代理时,
CleanSession
标志使代理能够将丢失的QoS 1或QoS 2消息排队(存储QoS 0消息取决于实现)

MQTT 3.1.1标准第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提供了另一个特性:
在发布消息中保留
标志

MQTT 3.1.1标准第3.3.1.3节规定:

如果RETAIN标志设置为1,则在客户端发送到服务器的发布数据包中,服务器必须存储应用程序消息及其QoS,以便将其发送给订阅与其主题名称匹配的未来订户[MQTT-3.3.1-5]。建立新订阅时,必须将每个匹配主题名称上的最后保留消息(如果有)发送给订阅服务器[MQTT-3.3.1-6]。如果服务器接收到保留标志设置为1的QoS 0消息,则必须放弃以前为该主题保留的任何消息。它应该将新的QoS 0消息存储为该主题的新保留消息,但可以随时选择放弃它-如果发生这种情况,则该主题将没有保留消息

这样可以确保在重新连接时,客户端只接收到关于给定主题的最新消息