首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MQTT代理是否支持持久订阅?

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

Stack Overflow用户
提问于 2017-09-24 13:12:38
回答 2查看 845关注 0票数 1

我在我的第一个IOT POC上工作,该设备通常每小时/天生成一次传感器数据。我计划这样的架构:-1传感器数据输入的共享主题(设备到后端方向)-每个设备最初将订阅自己的特定主题,也就是/设备/{id}/notification

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

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

EN

回答 2

Stack Overflow用户

发布于 2019-08-02 10:28:16

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

MQTT3.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节规定:

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

这确保了在重新连接时,客户端仅接收到有关给定主题的最新消息。

票数 2
EN

Stack Overflow用户

发布于 2017-09-24 13:18:46

很快我就自己找到了答案。持久会话是答案。我一直在寻找持久订阅,但最初并不成功……

下面是关于我的案例的最后一篇很棒的文章:http://www.hivemq.com/blog/mqtt-essentials-part-7-persistent-session-queuing-messages

所以,是的,持久订阅被称为持久会话,是的,这是可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46386801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档