MQTT消息队列简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种基于发布/订阅模式的轻量级消息协议,专门为低带宽、高延迟或不稳定的网络环境设计。
核心思想:发布/订阅模式,实现消息的异步、解耦传输
1.1、协议特点
轻量级:协议头最小只有2字节
基于TCP/IP:保证数据可靠传输
双向通信:客户端可同时作为发布者和订阅者
支持多种QoS等级:满足不同可靠性需求
遗嘱消息:处理客户端异常断开情况
MQTT 核心架构与组件
2.1、架构组成
publisher -------------------- Broker ------------------- Subscriber
publisher publish broker
broker subscribe Subscriber
2.2、核心组件解析:
Broker(代理服务器):消息中转站,负责接收、过滤、路由消息
功能:
客户端认证和授权、主题管理和消息路由、会话持久化、QoS 级别实现
Client(客户端):
发布者:发送消息到特定主题
订阅者:订阅感兴趣的主题,接收消息
可同时担任两种角色
Topic(主题)
格式:分层结构的字符串,用/分隔,示例:vehicle/123/gps/location
主题通配符:
通配符 | 含义 | 示例 | 匹配主题 |
---|---|---|---|
+ | 单级匹配 | home/+/temperature | home/living-room/temperature |
# | 多级匹配 | factory/# | factory/line1/robot1/speed |
MQTT协议详解
3.1、连接建立过程
CONNECT:客户端发起连接请求
CONNACK:Broker 确认连接
认证机制:支持用户名/密码、客户端证书等
3.2、消息控制流转
# 典型的消息流程
client.connect() # 建立连接
client.subscribe("sensors/temp") # 订阅主题
client.publish("sensors/temp", "25") # 发布消息
3.3、服务质量(QoS)级别
Qos | 名称 | 传输保证 | 消息重复 | 性能 | 应用场景 |
---|---|---|---|---|---|
0 | 最多一次 | 可能丢失 | 消息重复 | 性能 | 应用场景 |
1 | 至少一次 | 不丢失 | 可能重复 | 中等 | 控制指令、状态更新 |
2 | 恰好一次 | 不丢失 | 不重复 | 最低 | 支付交易、关键配置 |
3.4、特殊消息类型
**1)、保留消息(Retained Message)**
Broker 为每个主题保存最新的消息
新订阅者立即收到最后一条保留消息
用途:设备状态同步、初始化数据
**2)、遗嘱消息(Last Will and Testament)**
客户端异常断开时,Broker 自动发布预设消息
用途:设备离线通知、状态清理
主流 MQTT Broker 对比
Broker | 类型 | 集群支持 | 性能 | 管理界面 | 学习曲线 | 推荐场景 |
---|---|---|---|---|---|---|
Mosquitto | 开源 | 需要三方 | 中等 | 基础 | 简单 | 开发测试、小规模部署 |
EMQX | 开源 | 原生支持 | 极高 | 丰富 | 中等 | 生产环境、大规模集群 |
HiveMQ | 商业 | 企业级 | 极高 | 丰富 | 中等 | 企业级关键应用 |
NanoMQ | 开源 | 轻量级 | 高 | 基础 | 简单 | 边缘测部署 |
AWS IoT Core | 云服务 | 自动扩展 | 极高 | 集成 | 简单 | 云原生架构 |
与其他协议对比
特性 | MQTT | AMQP | HTTP/HTTPS | CoAP |
---|---|---|---|---|
协议类型 | 消息协议 | 消息协议 | 请求/响应 | 类HTTP |
头部开销 | 2字节起 | 8字节起 | 100+字节 | 4字节 |
通讯模式 | 发布/订阅 | 多种模式 | 请求/响应 | 请求/响应 |
底层传输 | TCP | TCP | TCP | UDP |
适用场景 | IoT、机器人 | 企业消息 | Web服务 | 受限设备 |