MQTT 连接参数设置
MQTT 连接参数设置
一、MQTT 连接的基本概念
MQTT 连接由客户端向服务器发起。建立流程如下:
- 客户端与服务器建立网络连接(通常基于 TCP/IP)
- 客户端发送 CONNECT 数据包给服务器
- 服务器回复 CONNACK 数据包给客户端
- 客户端收到 CONNACK 后,MQTT 连接建立成功
- 若超时未收到 CONNACK,客户端主动关闭连接
传输协议选择
| 协议 | 说明 | 默认端口 |
|---|---|---|
| MQTT over TCP | 基于 TCP/IP,面向连接、可靠传输,适合低带宽、高延时、资源受限环境 | 1883 |
| MQTT over TLS/SSL | 基于 TCP 的安全连接(mqtts) | 8883 |
| MQTT over WebSocket | 基于 WebSocket,适合浏览器端 Web 应用 | 8083 |
| MQTT over WSS | 基于 WebSocket 的安全连接 | 8084 |
📌 WebSocket 连接时,连接地址还需包含 Path,EMQX 默认 Path 为
/mqtt。
二、核心连接参数详解
1. 连接地址(Broker Address)
MQTT 的连接地址通常包含三部分:
- 服务器 IP 或域名
- 服务器端口
- 连接协议
示例:
mqtt://broker.emqx.io:1883— 普通 TCP 连接ws://broker.emqx.io:8083/mqtt— WebSocket 连接
2. 客户端 ID(Client ID)
服务器使用 Client ID 识别客户端,每个客户端必须具有唯一的 Client ID。
- 长度通常为 1~23 字节的 UTF-8 字符串
- ⚠️ 重复 Client ID 连接会导致已连接的客户端被踢下线
💡 最佳实践:在设备量产场景中,建议使用设备序列号、MAC 地址或 UUID 作为 Client ID,确保全局唯一性。
3. 用户名与密码(Username & Password)
MQTT 通过用户名和密码进行认证和授权。
- ⚠️ 默认情况下为明文传输,建议配合 mqtts/wss 加密协议使用
- 大多数 MQTT 服务器默认为匿名认证,此时用户名和密码设为空字符串即可
4. 连接超时(Connect Timeout)
收到服务器连接确认前的等待时间。
- 若在超时时间内未收到 CONNACK,则判定连接失败
- 具体超时值取决于客户端库的实现和网络环境
5. 保活周期(Keep Alive)
以秒为单位的时间间隔。
- 客户端在无报文发送时,按 Keep Alive 值定时向服务端发送心跳报文,防止连接被断开
- 若服务器在 Keep Alive × 1.5 时间内未收到任何客户端包,则会断开连接
📖 详细参考:MQTT 协议中的 Keep Alive 机制
💡 最佳实践:弱网环境下可适当增大 Keep Alive 值(如 60~300 秒),减少不必要的网络开销;但对实时性要求高的场景可适当减小(如 10~30 秒)。
6. 清除会话(Clean Session)
⚠️ 注意:此参数为 MQTT 3.1.1 及之前版本的用法,MQTT 5.0 中已被拆分为 Clean Start 和 Session Expiry Interval。
| 值 | 说明 |
|---|---|
false |
持久会话:客户端断开后会话保持,保存离线消息,直到会话超时注销 |
true |
临时会话:客户端断开时会话自动销毁 |
持久会话的优势:
- 避免掉线重连后消息丢失
- 免去重连后重复订阅的开销
- 特别适合带宽小、网络不稳定的物联网场景
⚠️ 持久会话恢复的前提:客户端使用固定的 Client ID 再次连接
7. 遗嘱消息(Last Will)
为可能出现意外断线的设备提供"遗言"能力——设备异常下线时,服务器自动发布遗嘱消息。
意外断线场景:
- 网络故障,连接被服务端关闭
- 设备意外掉电
- 设备尝试不被允许的操作而被服务端关闭连接
遗嘱消息包含的字段:
| 字段 | 说明 |
|---|---|
| Topic | 遗嘱消息发送的目标主题 |
| Payload | 待发送的消息内容 |
| QoS | 与普通 MQTT 消息的 QoS 一致 |
| Retain | 为 true 时表示保留消息 |
📖 详细参考:MQTT 遗嘱消息(Will Message)的使用
📖 QoS 参考:MQTT QoS(服务质量)介绍
📖 保留消息参考:MQTT 保留消息是什么?如何使用?
8. 协议版本
常用 MQTT 协议版本:
| 版本 | 说明 |
|---|---|
| MQTT v3.1 | 早期版本 |
| MQTT v3.1.1 | 广泛使用的稳定版本 |
| MQTT v5.0 | 推荐首选,功能更丰富 |
📖 参考:MQTT 5.0 系列文章
三、MQTT 5.0 新增连接参数
1. Clean Start & Session Expiry Interval
MQTT 5.0 将 Clean Session 拆分为两个独立参数:
| 参数 | 说明 |
|---|---|
| Clean Start | true:丢弃任何已存在的会话,创建全新会话false:尝试恢复与 Client ID 关联的会话(若不存在则创建新会话) |
| Session Expiry Interval | 网络连接断开后会话的过期时间 • 0 或未设置:断开即到期• >0:会话保持 N 秒• 0xFFFFFFFF:永不过期 |
2. 连接属性(Connect Properties)
MQTT 5.0 引入了连接属性概念,进一步增强了协议的可扩展性。
📖 详细参考:MQTT 5.0 连接属性
四、如何建立安全的 MQTT 连接
仅靠用户名/密码认证远远不够,基于 TCP 的明文传输存在窃听、篡改、伪造、冒充风险。
SSL/TLS 的优势:
- 非对称加密为主干,混合多种加密方式
- 保证消息以密文传输,避免窃听
- 通过签名防止消息被篡改
认证方式对比
| 方式 | 说明 | 适用场景 |
|---|---|---|
| 单向认证 | 仅验证服务器证书,保证通信加密,但不能验证客户端真伪 | 一般安全需求,配合用户名/密码使用 |
| 双向认证 | 服务端和客户端都提供证书,双方互相认证身份 | 高安全性要求的场景 |
📖 单向认证参考:EMQX MQTT 服务器启用 SSL/TLS 安全连接
📖 双向认证参考:EMQX 启用双向 SSL/TLS 安全连接
⚠️ 注意:浏览器端使用 MQTT over WebSocket 进行安全连接时,暂不支持双向认证。
五、总结
建立 MQTT 连接时,需要合理配置以下核心参数:
| 参数 | 关键要点 |
|---|---|
| 连接地址 | 协议 + IP/域名 + 端口 + Path(WS) |
| Client ID | 全局唯一,重复会导致踢线 |
| 用户名/密码 | 建议配合 TLS/SSL 加密传输 |
| 连接超时 | 根据网络环境合理设置 |
| Keep Alive | 平衡心跳频率与网络开销 |
| Clean Session | 根据是否需要离线消息选择 |
| 遗嘱消息 | 为意外断线提供"遗言" |
| 协议版本 | 推荐 MQTT 5.0 |
| SSL/TLS | 生产环境务必启用 |
📖 延伸阅读:MQTT 入门与进阶系列文章

浙公网安备 33010602011771号