目录
二、MQTT 客户端接管(Session Takeover)详解
4. MQTT 客户端接管机制时序图(Session Takeover)
6. 与持久会话(Persistent Session)的关系
三、综合示例:Keep Alive + Session Takeover 联合流程

TCP 半开连接问题:MQTT 基于传输控制协议(TCP)。该协议确保数据以“可靠、有序且经过错误校验”的方式在互联网上传输。然而,通信双方之间的传输有时可能会不同步。
例如,如果其中一方崩溃或出现传输错误。在TCP中,这种未完成的连接状态称为半开连接。需要记住一点是,通信的一方将继续运行,并且不会收到有关另一方故障的通知。仍然连接的一方将继续尝试发送消息并等待确认。
一、MQTT 保持连接(Keep Alive)详解
1. 定义
MQTT 保持连接:MQTT 包含一个保持活动功能,它为半开连接问题提供一种解决方法(或者至少可以评估连接是否仍然打开)
保持连接可确保代理与客户端之间的连接始终保持打开状态,并且代理和客户端均知晓已建立连接。当客户端与代理建立连接时,客户端会向代理发送一个时间间隔(以秒为单位)。此时间间隔定义了代理和客户端之间无法通信的最长时间。
Keep Alive 是 MQTT 协议中的一种 心跳机制,用于:
检测客户端与 Broker 之间的连接是否仍然存活。
它由客户端在 CONNECT 报文中通过 KeepAlive 字段声明,例如:
CONNECT {
ClientID = "smartlock-001",
KeepAlive = 60 # 秒
}
含义: 客户端承诺——在 60 秒内至少发送一条消息(包括 PINGREQ、PUBLISH、SUBSCRIBE 等任意 MQTT 控制报文), 否则 Broker 认为客户端“掉线”。
2. 工作机制
时间线流程:
1️⃣ 客户端连接 Broker 时,声明 KeepAlive = 60
2️⃣ 客户端在每隔 <= 60 秒内发送心跳(PINGREQ)
3️⃣ Broker 回复 PINGRESP
4️⃣ 若 Broker 超时未收到心跳或任何消息 → 关闭连接
5️⃣ 若设置了遗嘱消息(LWT),Broker 将触发遗嘱发布
保持活动流
保活功能使用两个数据包:
PING请求:
RINGREQ 由客户端发送,用于向代理表明客户端仍然处于活动状态。如果客户端未发送任何其他类型的数据包(例如,PUBLIST 或 SUBSCRIBE 数据包),则必须向代理发送PINGREQ 数据包。客户端可以在任何时候发送PINGREQ 数据包来确认网络连接仍处于活动状态。PINGREQ 数据包不包含有效负载。
PINGRESP:
当代理收到 PINGREQ数据包时,代理必须回复一个 PINGRESP 数据包,以向客户端表明它仍然可用。PINGRESP 数据包也不包含有效负载。
TiPS:
-
如果代理没有收到来自客户端的PINGREQ 或任何其他数据包,代理将关闭连接并发送遗嘱消息(如果客户端指定了LWT);
-
MQTT客户端负责设置合适的保活值。例如,客户端可以根据当前信号抢断调整保活间隔。
-
最大保持时间为18小时12分15秒;
-
如果保持活动间隔为0,则保持活动机制将被停用。
3. MQTT 保持活动机制时序图(Keep Alive)

说明:
-
KeepAlive 是客户端在 CONNECT 报文中声明的最大空闲时间(单位:秒)。
-
客户端必须在该时间内至少发送一次控制报文(如
PINGREQ、PUBLISH)。 -
Broker 如果在
1.5 × KeepAlive时间内未收到消息,则认为客户端掉线,关闭连接。 -
如果设置了 遗嘱消息(Last Will Message),Broker 会自动发布离线状态。
4. Keep Alive 超时规则
根据 MQTT 3.1.1 规范:
若 Broker 超过
1.5 × KeepAlive时间未收到任何客户端数据帧, 则认为客户端掉线,并关闭 TCP 连接。
例如:
-
KeepAlive = 60 秒
-
Broker 容忍超时 = 90 秒
-
超时未通信 → Broker 断开并触发遗嘱
只要频繁交换消息并且不超过保持活动间隔,就不需要发送额外的消息来确定连接是否仍然打开。
如果客户端在保持活动时间没有发送消息,它必须向代理发送PINGREQ数据包以确认它可用并确保代理仍然可用。
如果客户端在保持连接间隔的1.5倍时间内未发生任何信息或PINGREQ数据包,代理必须断开连接。同样,如果客户端在合理的时间内未收到代理的响应,也应该关闭连接。
5. Keep Alive 与网络优化建议
| 网络环境 | 推荐 KeepAlive | 说明 |
| 稳定网络(Wi-Fi、以太网) | 60 秒 | 常规 IoT 设备 |
| 蜂窝网络(4G/5G) | 120~300 秒 | 减少移动网络流量 |
| 超低功耗设备(电池供电) | 300~600 秒 | 延长续航时 |

MQTT 保持连接(Keep Alive)与客户端接管(Session Takeover)&spm=1001.2101.3001.5002&articleId=154021659&d=1&t=3&u=1ce0458850184697b4d2556d981a89ce)
3321

被折叠的 条评论
为什么被折叠?



