Ⓜ️Mqtt
约 1313 字大约 4 分钟
MQTTEMQX
2025-04-30
什么是 MQTT?
MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模型的消息传输协议,专为低带宽、高延迟或不稳定的网络环境设计。它广泛应用于物联网(IoT)、传感器网络和移动应用等领域。
核心特点
- 轻量高效:协议开销小,适合资源受限的设备。
- 发布/订阅模型:解耦消息的生产者和消费者,支持一对多通信。
- QoS(服务质量):提供三种服务质量级别,确保消息传递的可靠性。
- 异步通信:支持实时消息传递,适合动态网络环境。
- 主题(Topic)机制:通过主题进行消息路由,灵活且可扩展。
MQTT 工作原理
MQTT 使用 发布/订阅 模型,核心组件包括:
- Broker(代理):消息的中转站,负责接收、过滤和分发消息。
- Publisher(发布者):发送消息到指定主题的客户端。
- Subscriber(订阅者):订阅特定主题以接收消息的客户端。
- Topic(主题):消息的路由标识,类似于文件路径(如
home/temperature)。
通信流程
- 客户端连接到 Broker(需要认证)。
- Publisher 发布消息到特定 Topic。
- Broker 将消息分发给订阅该 Topic 的 Subscriber。
- Subscriber 接收并处理消息。
graph TD
A[Publisher] -->|Publish: home/temperature| B[Broker]
B -->|Forward| C[Subscriber 1]
B -->|Forward| D[Subscriber 2]QoS(服务质量)级别
MQTT 提供三种 QoS 级别,以满足不同场景的可靠性需求:
| QoS 级别 | 描述 | 适用场景 |
|---|---|---|
| QoS 0 | 最多一次(At most once) 消息可能丢失,无确认机制。 | 日志数据、实时传感器数据(允许少量丢失)。 |
| QoS 1 | 至少一次(At least once) 确保消息送达,但可能重复。 | 重要通知、状态更新。 |
| QoS 2 | 恰好一次(Exactly once) 确保消息准确送达且不重复。 | 金融交易、关键指令。 |
主题(Topic)与通配符
MQTT 使用主题来路由消息,支持层次结构和通配符:
- 单层通配符(+):匹配单个层级。
- 示例:
home/+/temperature匹配home/kitchen/temperature和home/bedroom/temperature。
- 示例:
- 多层通配符(#):匹配多层级。
- 示例:
home/#匹配home/kitchen/temperature和home/bedroom/light/status。
- 示例:
提示
主题名称区分大小写,避免使用前导 / 或空格,以确保兼容性。
MQTT 消息结构
MQTT 消息包含以下关键部分:

1️⃣固定头部

- 报文类型
占4个bit位,是一个无符号的整数

- 标识位(flags)
占4个bit位,不过到 MQTT 5.0 为止,只有
PUBLISH报文的这四个比特位被赋予了明确的含义:
- Bit 3:
DUP,表示当前 PUBLISH 报文是否是一个重传的报文。- Bit 2,1:
QoS,表示当前 PUBLISH 报文使用的服务质量等级。- Bit 0:
Retain,表示当前 PUBLISH 报文是否是一个保留消息。
- 剩余长度

剩余长度指示了当前控制报文剩余部分的字节数,也就是可变报头和有效载荷这两个部分的长度。 MQTT 控制报文的总长度= 固定报头的长度 +剩余长度。
2️⃣可变报头
可变报头的内容取决于具体的报文类型。
举例:
CONNECT 报文的可变报头按顺序包含了协议名、协议级别、连接标识、Keep Alive 和属性这五个字段
PUBLISH 报文的可变报头则按顺序包含了主题名、报文标识符和属性这三个字段。

属性是 MQTT 5.0 引入的一个概念。属性字段基本上都是可变报头的最后一部分,由属性长度和紧随其后的一组属性组成,这里的属性长度指的是后面所有属性的总长度

所有的属性都是可选的,因为它们通常都有一个默认值,如果没有任何属性,那么属性长度的值就为0。属性通常都是为了某个专门的用途而设计的,不同的报文所支持的属
性都是不一样的,具体的对应情况可以查看官网地址:
https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901027
3️⃣有效载荷
有效载荷是用于实现对应报文的核心功能。
举例:
- 在
PUBLISH报文中,Payload 用于承载具体的应用消息内容,这也是 PUBLISH 报文最核心的功能。- 在
SUBSCRIBE报文中,Payload 包含了想要订阅的主题以及对应的订阅选项,这也是 SUBSCRIBE 报文最主要的工作。
快速入门示例
以下是一个简单的 MQTT 客户端示例(使用 JavaScript 和 paho-mqtt 库):
import Paho from 'paho-mqtt';
// 创建客户端
const client = new Paho.Client('broker.example.com', 8083, 'clientId-' + Math.random().toString(16));
// 设置回调
client.onMessageArrived = (message) => {
console.log(`收到消息: ${message.payloadString}`);
};
// 连接到 Broker
client.connect({
onSuccess: () => {
console.log('连接成功');
// 订阅主题
client.subscribe('home/temperature');
// 发布消息
const message = new Paho.Message('25.5°C');
message.destinationName = 'home/temperature';
client.send(message);
}
});注意
在生产环境中,建议启用 TLS/SSL 加密,并配置用户名和密码认证。
