Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MQTT Persistent Session or Clean Session持久会话或清洁会话(附示例)

MQTT Persistent Session or Clean Session持久会话或清洁会话(附示例)

作者头像
Hello工控
发布于 2025-05-17 06:42:54
发布于 2025-05-17 06:42:54
1280
举报
文章被收录于专栏:Hello工控Hello工控
不稳定的网络和有限的硬件资源是物联网应用需要面对的两大问题。由于网络波动和资源限制,MQTT 客户端与代理之间的连接可能会在任何时候异常断开。为了应对网络断开对通信的影响,MQTT 协议提供了持久会话(Persistent Session)。

持久会话在 MQTT 中允许客户端在多次连接之间维持其订阅和消息状态。当客户端与 MQTT 代理建立持久会话时,代理会存储客户端的订阅信息以及任何未送达给客户端的消息。这样,如果客户端断开连接并在以后重新连接,就可以无缝恢复通信。

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 消息已从客户端接收但尚未完成确认,遗愿消息,遗愿延迟间隔。

关于QoS的详细说明参考:MQTT中的QoS是什么???

图片
图片

怎样使用 Persistent Session or Clean Session

持久会话或清洁会话?

客户端可以通过在连接到代理时将 cleanSession 标志设置为 False 来启动持久会话。默认情况下,此值设置为 True。

在上述MQTT V3.1.1这个版本中,Clean Session 是一个标志位,用于控制会话状态的生命周期。值为 TRUE(1) 表示在连接时创建一个新的会话,并在客户端断开连接时自动销毁会话。如果值为FALSE(0),则在连接时会尝试重用之前的会话。如果没有对应的会话,则会创建一个新的会话,该会话在客户端断开连接后始终存在。

接下来,我们将使用 Clean Session 并通过开源跨平台 MQTT 5.0 桌面客户端工具 - MQTTX 来演示。

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

创建名为 Subscribe的连接,并将 Clean Session 关闭(即,设为 false),然后点击右上角的Connect 按钮。

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

订阅成功后,请点击右上角的 Disconnect 按钮。然后,创建一个名为 Publish 的连接,再次将 MQTT 版本设置为 3.1.1:

右上角点击Connect,在连接成功后向 clean_session_false 主题发布两条 QoS 1 的消息。

然后,选择Subscribe的连接并点击 Connect 按钮连接到服务器。您将成功接收到两条在离线期间发布的消息。

MQTT5.0会话的改进

在 MQTT 5.0 中,Clean Session 被分为 Clean Start 和 Session Expiry Interval。Clean Start 用于指定在连接时是创建新的会话还是尝试重用现有的会话。Session Expiry Interval 用于指定在网络连接断开后会话将保持多长时间。

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

会话过期间隔解决了由于 MQTT 3.1.1 中持久会话的永久存在而导致的服务器资源浪费问题。设置为 0 或未设置表示会话在断开连接时过期。设置为大于 0 的值表示在网络连接关闭后会话将保持多少秒。设置为 0xFFFFFFFF 表示会话永远不会过期。

最佳实践

为了使持久会话生效,您需要注意:

  • 代理使用客户端 ID 来识别持久会话中的客户端。因此,请确保为每个客户端使用唯一的客户端 ID。
  • 您需要以 QoS 级别 1 或 2 订阅主题。只有这样,代理才会发布未送达的消息。
  • 消息还必须以 QoS 级别 1 或 2 的形式发布到该主题。如果客户端以 QoS 级别 0 发布消息,代理将不会存储这些消息。
  • 如果发布消息时 retain 标志设置为 True,具有持久会话的客户端将仍然收到该主题发布的所有消息(而不仅仅是最后一条消息)。 下表展示了 QoS、清理会话标志和保留消息标志如何影响接收到的消息:
  • 根据服务器性能、网络条件和客户端类型适当评估会话过期时间。设置得太长会占用更多的服务器资源。设置得太短则会导致会话在成功重新连接之前过期。
  • 当客户端确定会话不再需要时,可以使用 Clean Session 为 true 重新连接,然后在成功重新连接后断开连接。在 MQTT 5.0 中,断开连接时可以直接将 Session Expiry Interval 设置为 0,表示会话将在断开连接时过期。

MQTT 中 Clean Sessions和Perssistent Sessions的常见问题

Q: MQTT 持久会话与非持久会话有何不同?

A: 一个持久会话在 MQTT 中允许客户端在断开连接后保持其会话状态,包括订阅和未送达的消息,从而确保消息的传递并保留客户端的状态。一个非持久会话或清洁会话会在断开连接时丢弃会话状态,要求客户端重新建立订阅,可能会错过断开连接期间发布的消息。在选择持久会话和非持久会话之间时,取决于应用程序对会话连续性和消息持久性的要求。

Q: 使用持久会话在 MQTT 中有哪些好处?

A: 使用持久会话在 MQTT 中可以带来多种好处。它增强了客户端的可靠性、状态保存能力和重连效率。它提供了不间断的消息传递,消除了重复设置任务的需要,并确保消息按顺序传递,从而提高 MQTT 通信的整体质量和稳健性。

Q: 客户端断开连接期间发送的消息在持久会话中会发生什么?

A: 在 MQTT 的持久会话中,客户端断开连接期间发送的消息会被 MQTT 代理存储,并在客户端重新连接时交付。

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

A: MQTT 协议从 v3.1.1 版本开始为 CONNACK 消息设计了一个 Session Present 字段。当服务器返回该字段值为 1 时,表示当前连接将使用服务器保存的会话。客户端可以使用该字段值来决定在连接成功后是否重新订阅。

Q: 代理可以排队多少条消息?

A: 代理将消息存储在主内存(RAM)中。因此,代理可以存储的最大消息数量取决于主内存。例如:Mosquitto 默认存储最多 100 条消息。这个设置可以更改。

Q: MQTT 是如何处理持久会话的重新建立的?

A: 如果客户端断开连接然后使用“clean session”标志设置为 false 相同的 ClientID 重新连接到代理,会话将被恢复。代理将交付其存储的任何消息,客户端可以继续发送任何未确认的出站消息。由于代理已维护订阅,客户端无需再次订阅主题。

Q: 在不稳定网络条件下,MQTT 是如何处理消息传递和会话恢复的?

A: MQTT 提供了三种消息传递质量等级(QoS),QoS 0(最多一次),QoS 1(至少一次),QoS 2(精确一次)。在网络故障情况下,MQTT 提供了一种机制来存储会话信息并通过持久会话从中断中恢复。

Q: 我能否配置会话保持由代理维护的时间长度?

A: 具体的消息队列 telemetry 协议(MQTT)代理可能会实现自己的会话过期策略,这可以超出标准 MQTT 协议的范围。例如,一些代理可能允许你在客户端断开连接期间配置一个会话过期间隔,在此期间会话仍然会被维护。

Q: MQTT 是如何处理多个客户端尝试使用相同的客户端 ID 建立持久会话的情况的?

A: 如果第二个客户端使用与已连接客户端相同的 Client ID 连接到代理,代理必须断开首先连接的客户端。新客户端随后将接管该 Client ID 及其关联的会话。然而,如果客户端使用与之前连接但当前未连接的客户端相同的 Client ID 连接到代理,新客户端将接管与该 Client ID 关联的会话,前提是该会话是持久会话。

Q: 当客户端的持久会话消息队列限制达到上限时会发生什么?

A: 当消息队列限制达到时的具体行为取决于特定的 MQTT 代理实现及其配置的策略。例如,代理可能会丢弃旧消息、丢弃新消息,或者断开客户端连接。

Q: 持久会话和自定义消息队列行为是否有可配置的参数或选项?

A: 是的,MQTT 代理通常允许配置与消息队列相关的某些参数,尽管这在不同的代理实现中可能会有所不同。可配置的参数可能包括最大队列大小、消息保留策略、会话过期间隔、最大报文大小和最大 QoS 级别。

Q: 持久会话中消息队列的大小如何影响代理的内存和处理资源?

A: 在 MQTT 代理中,每个客户端的消息队列(对于持久会话)存储在代理的内存中。这些内存用于保存尚未交付给客户端的消息,或者由于其 QoS 级别而保留以供将来交付的消息。因此,这些消息队列的大小直接影响代理的内存使用情况。

Q: MQTT 在持久会话的消息队列中如何处理超大消息?

A: MQTT 通过使用可配置参数最大包大小(Maximum Packet Size)来处理消息队列中的大消息。

参考链接:

  1. http://www.steves-internet-guide.com/mqtt-clean-sessions-example/
  2. https://www.emqx.com/en/blog/mqtt-session
  3. https://www.hivemq.com/blog/mqtt-essentials-part-7-persistent-session-queuing-messages/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hello工控 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​MQTT 持久会话与 Clean Session 详解
不稳定的网络及有限的硬件资源是物联网应用需要面对的两大难题,MQTT 客户端与服务器的连接可能随时会因为网络波动及资源限制而异常断开。为了解决网络连接断开对通信造成的影响,MQTT 协议提供了持久会话功能。
EMQ映云科技
2022/11/07
1.5K0
基于 RocksDB 实现高可靠、低时延的 MQTT 数据持久化
MQTT 协议标准中规定 Broker 必须存储离线客户端的消息。在之前的版本中,EMQX 开源版采用了基于内存的会话存储,企业版则在此基础上进一步提供了外部数据库存储方案,借此实现数据持久化。
EMQ映云科技
2022/08/08
1.1K0
mqtt会话介绍-mqtt会话演示
MQTT客户端和MQTT服务器之间的连接被称为会话。每个MQTT客户端都可以启动一个或多个会话,通过会话可以实现客户端和服务器之间的消息传递。
高久峰
2024/12/02
3040
MQTT 协议基本介绍
MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的“轻量级”消息协议,由 IBM 发布。
sunsky
2021/06/09
3.8K0
MQTT 协议基本介绍
什么是MQTT Last Will and Testament (LWT)遗嘱和遗言?
我们这期就针对LWT详细介绍和说明,大家看完有任何建议和指导留言区留言讨论哈!!!
Hello工控
2025/05/19
1370
什么是MQTT Last Will and Testament (LWT)遗嘱和遗言?
MQTT 客户端和MQTT 代理!!!
其中最重要的两个角色就是MQTT客户端和MQTT代理(中介)。对于这两个核心我们快速回顾下:
Hello工控
2025/05/04
3180
MQTT 客户端和MQTT 代理!!!
为什么最近每份 Android 简历都说 “熟悉 MQTT 协议”?
MQTT 是一种基于发布 - 订阅模型的消息传递协议,在物联网和移动应用有较广泛的应用。如果你的目标是冲击中高级工程师岗位,MQTT 或许是一个不错的亮点。最近,我还发现很多候选人会在简历中写自己 “熟悉 MQTT 协议”,但多数人只是停留在了解或用过的程度。
用户9995743
2022/12/22
4.6K0
为什么最近每份 Android 简历都说 “熟悉 MQTT 协议”?
MQTT Keep Alive 参数有什么用途?
在物联网网络中,有些设备的数量少,3台到5台,也可能很庞大,成千上万台。例如,传感器,包括磁性接触传感器、功率计、椅子占用传感器等。无论客户端的数量是多少,很可能并不是所有的设备都会持续传输数据。比如,如果冰箱内的温度发生变化,冰箱的传感器会发送一条关于这个变化的消息。在其他时间,这个客户端保持“沉默”。
Hello工控
2025/05/21
1060
MQTT Keep Alive 参数有什么用途?
MQTT 协议入门:基础知识和快速教程
本文是 MQTT 协议的入门指南,提供了实用的代码示例。物联网和 MQTT 的初学者可以通过本文掌握 MQTT 的基本概念,快速开启 MQTT 服务和应用的开发。
EMQ映云科技
2023/06/27
1.5K0
MQTT 协议入门:基础知识和快速教程
MQTT:To Retain or Not To Retain?
关于本期内容,涉及到Retain保留这个选项,在整理资料,下图有个提问很有代表性,我们的标题就是采纳他的:
Hello工控
2025/05/21
1350
MQTT:To Retain or Not To Retain?
MQTT 协议快速体验
全球物联网正在高速发展,专门针对低带宽和不稳定网络环境的物联网应用设计的 MQTT 协议也因此得到广泛应用。
EMQ映云科技
2022/10/09
1.6K0
Python 客户端类库之paho-mqtt学习总结
Eclipse Paho MQTT Python客户端类库实现了MQTT 协议版本 5.0, 3.1.1, 和3.1。
授客
2024/11/21
7130
车联网移动场景 MQTT 通信优化实践
随着智能化浪潮席卷全球,如今的车辆早已不再是单纯的交通工具,而是一个具备自主推理能力、能和云端交互进行车路协同的移动智能节点。
EMQ映云科技
2022/10/24
9340
Tsung MQTT协议简介及MQTT xml文档配置介绍
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。
授客
2019/09/11
2.2K0
Tsung MQTT协议简介及MQTT xml文档配置介绍
为什么智能硬件首选MQTT
前面讲了Android如何通过串口通信操作硬件,但实际业务场景大多是既可以屏幕操控硬件也可以远程下发操控,这时就需要MQTT协议来完成这一工作。本文将介绍MQTT协议及其在物联网设备通信中的应用。
Coder昊白
2023/11/22
8300
为什么智能硬件首选MQTT
MQTT协议学习总结
海量的设备接入和设备管理对网络带宽、通信协议以及平台服务架构都带来了很大挑战。对于物联网协议来
叫我阿杰好了
2022/11/07
3.9K0
MQTT协议学习总结
创建 MQTT 连接时如何设置参数?
建立一个 MQTT 连接是使用 MQTT 协议进行通信的第一步。为了保证高可扩展性,在建立连接时 MQTT 协议提供了丰富的连接参数,以方便开发者能创建满足不同业务需求的物联网应用。本文将详细讲解 MQTT 中各个连接参数的作用,帮助开发者迈出使用 MQTT 的第一步。
EMQ映云科技
2022/11/03
2.7K0
MQTT 5.0 Reason Code 介绍与使用速查表
Reason Code 在 MQTT 中的主要作用是为客户端和服务端提供更详细的反馈。比如我们可以在 CONNACK 报文中将用户名或密码错误对应的 Reason Code 反馈给客户端,这样客户端就能够知道自己无法连接的原因。
EMQ映云科技
2023/07/28
4080
MQTT 5.0 Reason Code 介绍与使用速查表
MQTT中的QoS是什么???
这期我们详细介绍下QoS,全称是Quality of Service (服务质量) 。(QoS) 是消息发送者和接收者之间的一个协议,定义了特定消息的交付保证级别。下面我们将更深入地探讨 MQTT 中不同的 Quality of Service (QoS) 级别。
Hello工控
2025/05/15
1280
MQTT中的QoS是什么???
【HarmonyOS 5】鸿蒙中如何使用MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级、基于发布 / 订阅(Publish/Subscribe)模式的即时通讯协议,专为资源受限的物联网(IoT)设备和低带宽、高延迟或不可靠网络环境设计。
GeorgeGcs
2025/04/09
3250
【HarmonyOS 5】鸿蒙中如何使用MQTT
相关推荐
​MQTT 持久会话与 Clean Session 详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档