目录
1.使用 持久会话(Clean Session=false)
C(嵌入式)使用 Eclipse Paho Embedded C:
MQTT 是构建于 TCP 之上的轻量级发布/订阅通信协议,适用于低带宽、不稳定网络的物联网设备通信。 断线重连机制:指客户端在与 Broker(消息服务器)断开连接后,自动重试连接、重订阅、恢复会话、补发消息等。
一、MQTT 重连机制概述
MQTT 是基于 TCP 的轻量级发布/订阅协议,具备以下重连相关特性:
特性 | 说明 |
持久会话(Clean Session=false) | 设备断线后重连,仍能收到之前未读的消息(QoS 1/2) |
遗嘱消息(Will Message) | 设备意外断线时 Broker 可通知其他客户端 |
心跳(Keep Alive) | 检测连接是否活跃,超时自动断开 |
自动重连机制(由客户端实现) | MQTT 库通常支持自动重连选项 |
二、核心原理与设计目标
1. MQTT 断线的常见原因
原因 | 描述 |
网络波动 | Wi-Fi、蜂窝网络不稳定或切换 |
Broker 重启 | 服务端重启或维护 |
NAT/防火墙 | 空闲连接被断开 |
客户端掉线 | 电池耗尽、程序崩溃 |
心跳失效 | keepalive 超时未响应(未在Keep Alive时间内发送心跳包(Ping)) |
2. 重连机制目标
-
快速恢复连接:在网络恢复后迅速重建连接。
-
保持会话状态:保留订阅主题、QoS级别等信息。
-
避免资源浪费:通过合理策略(如指数退避)防止频繁重连。
3.核心机制组成
3.1 KeepAlive 心跳机制
-
客户端设置
keepAlive
时间(例如 60 秒) -
在该时间内未收到任何数据,客户端会发送
PINGREQ
-
Broker 回复
PINGRESP
-
无响应则视为断线,触发重连
3.2. 自动重连机制
-
客户端捕捉连接断开事件(例如
ConnectionLostException
) -
启动重连线程或定时器
-
支持指数退避 + 最大重试次数
3.3. 会话恢复
-
cleanSession = false
(或 MQTT 5 中sessionExpiryInterval > 0
):-
重连后自动恢复订阅关系
-
消息队列中 QoS 1/2 的消息会继续传送
-
-
cleanSession = true
:-
重连后必须手动重新订阅 topic
-
3.4. 消息缓存补发
-
离线期间的待发消息本地缓存(QoS ≥ 1)
-
重连后补发这些消息
-
一般由 SDK 自动实现(如 AWS IoT Device SDK)