MQTT持久会话与Clean Session详解

更新时间:2025-05-11 22:47:57 阅读: 评论:0

<a href=http://www.ranqi119.com/ge/78/642905.html style=MQTT持久会话与Clean Session详解"/>

MQTT持久会话与Clean Session详解

黑板报简笔画 MQTT持久会话

不稳定的网络及有限的硬件资源是物联网应用需要面对的两大难题,MQTT客户端与服务器的连接可能随时会因为网络波动及资源限制而异常断开。为了解决网络连接断开对通信造成的影响,MQTT协议提供了持久会话功能。

MQTT客户端在发起到服务器的连接时,可以设置是否创建一个持久会话。持久会话会保存一些重要的数据,以使会话能在多个网络连接中继续。持久会话主要有以下三个作用:

避免动宾因网络中断导致需要反复订阅带来的额外开销。

避免错过离线期间的消息。

确保QoS 1和QoS 2的消息质量保证不被网络中断影响。

持久会话需要存储哪些数据?

通过上文我们知道持久会话需要存储一些重要的数据,以使会话能被恢复。这些数据有的存储在客户端,有的则存储在服务端。

客户端中存储的会话数据:

已发送给服务端,但是还没有完成确认的QoS 1与QoS 2消息。

从服务端收到的,但是还没有完成确认的QoS 2消息。

服务端中存储的会话数据:

会话是否存在,即使会话状态其余部分为空。

已发送给客户端,但是还没有完成确认的QoS 1与QoS 2消息。

等待传输给客户端的QoS 0消息(可选),QoS 1与QoS 2消息。

从客户端收到的,但是还没有完成确认的QoS 2消息,遗嘱消息和遗嘱延时间隔。

MQTT Clean Session的使用

Clean Session是用来控制会话状态生命周期的标志位,为 true 时表示创建一个新的会话,在客户端断开连接时,会话将自动销毁。为 false 时表示创建一个持久会话,在客户端断开连接后会话仍然保持,直到会话超时注销。

注意: 持久会话能被恢事故英语复的前提是客户端使用固定的ClientID再次连接,如果ClientID是动态的,那么连接成功后将会创建一个新的持久会话。

如下为开源MQTT服务春天的四字词器EMQX 的Dashboard,可以看到图中的连接虽然是断开状态,但是因为它是持久会话,所以仍然能被查看到,并且可以在Dashboard中手动清除该会话。

同时,EMQX也支持在Dashboard中设置Session相关参数。

展开全文

MQTT 3.1.1没有规定持久会话应该在什么时候过期,如果仅从协议层面理解的话,这个持久会话应该永久存在。但在实际场景中这并不现实,因为它会非常占用服务端的资源,所以服务端通常不会完全遵循协议来实现,而是向用户提供一个全局配置来限制会话的过期时间。

比如EMQ提供的 免费的公共MQTT服务器 设置的会话过期时间为5分钟,最大消息数为1000条,且不保存QoS0消息。

接下来我们使用开源的跨平台 MQTT 5.0桌面客户端工具-MQTT X 演示Clean Sessio肉炒饼n的使用。

打开MQTT X后如下所示,点击 New Connection 按钮创建一个 MQTT连接。

创建一个名为 MQTT_V3 的连接,Clean Session为关闭状态(即为false),MQTT版本选择3.1.1,然后点击右上角的 Co卡塔尔首都nnect 按钮。

连接的服务器默认为EMQ提供的免费的公共MQTT服务器。

连接成功后订阅 clean_session_false 主题,且QoS设置为1。

订阅成功后,点击右上角的断开连接按钮。然后,创建一个名为 MQTT_V3_Publish 的连接,MQTT版本同样设置为3.1.1,连接成功后向 clean_session_false 主题发布两条QoS 1消息。

然后选中MQTT_V3连接,点击连接按钮连接至服务器,将会成功接收到两条离线期间的消息。

MQTT 5.0中的会话改进

MQTT 5.0中将Clean Session拆分成了Clean Start与Session Expiry Interval。Clean Start用于指定连接时是创建一个全新的会话还是尝试复用一个已存在的会话,Session Expiry Interval用于指定网络连接断开后会话的过期时间。

Clean Start为 true 时表示必须丢弃任何已存在的会话,并创建一个全新的会话;为 false 时表示必须使用与Client ID关联的会话来恢复与客户端的通信(除非会话不存在)。

Session Expiry Interval解决了MQTT 3.1.1中持久会话永久存在造成的服务器资源浪费问题。设置为0或未设置,表示断开连接时会话即到期;设置为大于0的数值,则表示会话在网络连接关闭圣诞传说后会保持多少秒;设置为 0xFFFFFFFF 表示会话永远不会过期。

关于MQTT会话的Q&A

当会话结束后,保留消息还存在么?

M写鱼的诗句QTT保留消息不是会话状态的一部分,它们不会在会话结束时被删除。

客户端如何知道当前会话是被恢复的会话?

MQTT协议从v3.1.1开怎样爱自己始,就为CONNACK报文设计了Session Present字段。当服务器返回的该字段值为1时,表示当前连接将会复用服务器保存的会话。客户端可通过该字段值决定在连接成功后是否需要重新订阅。

使用持久会话时有哪些建议?

不能使用动态Client ID,需要保证客户端每次连接的Client ID都是固定的。

根据服务器性能、网络状况、客户端类型等合理评估会话过期时间。设置过长会占用更多的服务端资源,设置过短会导致未重连成功会话就失效。

当客户端毛笔草书字帖欣赏确定不再需要会话时,可使用Clean Session为true进行重连,重连成功后再断开连接。如果是MQTT 5.0则可在断开连接时直接设置Session Expiry Interval为0,表示连接断开后会话即失效。

结语

至此,我们完成了对MQTT持久会话的介绍,并通过桌面客户端演示了Clean Session的使用。大家可参考本文借助MQTT持久会话实现离线消息的接收及降低订阅开销。

本文发布于:2023-07-14 16:16:21,感谢您对本站的认可!

本文链接:http://www.ranqi119.com/ge/78/540290.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:详解   持久   MQTT   Session   Clean
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 站长QQ:55-9-10-26|友情:优美诗词|电脑我帮您|扬州装修|369文学|学编程|软件玩家|水木编程|编程频道