MQTT(Message Queuing Telemetry Transport)协议是 IMB 于 1999 年发布第一个版本,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。该协议广泛用于 IoT(物联网)、智能家居、小型设备。
- Telemetry(təˈlemətri 遥感)
特点
- 基于 TCP/IP 协议族
- 适用于硬件性能低下、网络状况糟糕的场景
- 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合
- 有三种消息发布服务质量
- 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量
- 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制
- Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。
- Testament:遗嘱机制,功能类似于 Last Will。
服务质量定义
QoS 值 | Bit 2 | Bit 1 | 描述 |
---|---|---|---|
0 | 0 | 0 | 最多分发一次 |
1 | 0 | 1 | 至少分发一次 |
2 | 1 | 0 | 只分发一次 |
- | 1 | 1 | 保留位 |
基本结构
- MQTT 协议中有三种身份:发布者(Publish)、代理(Broker/服务器)、订阅者(Subscribe)
- Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
- payload,可以理解为消息的内容,是指订阅者具体要使用的内容
报文
报文 | 描述 | 流向 | 值 | 固定报头 | 可变报头 | 负载 |
---|---|---|---|---|---|---|
CONNECT | 客户端请求与服务端建立连接 | C->S | 1 | 有 | 有 | 有 |
CONNACK | 服务端确认连接建立 | S->C | 2 | 有 | 有 | 有 |
PUBLISH | 发布消息 | C<=>S | 3 | 有 | 有 | 有 |
PUBACK | 收到发布消息确认(QoS1) | C<=>S | 4 | 有 | 有 | 无 |
PUBREC | 发布消息收到(QoS2) | C<=>S | 5 | 有 | 有 | 无 |
PUBREL | 发布消息释放(QoS2) | C<=>S | 6 | 有 | 有 | 无 |
PUBCOMP | 发布消息完成(QoS2) | C<=>S | 7 | 有 | 有 | 无 |
SUBSCRIBE | 订阅请求 | C->S | 8 | 有 | 有 | 有 |
SUBACK | 订阅确认 | S->C | 9 | 有 | 有 | 有 |
UNSUBSCRIBE | 取消订阅 | C->S | 10 | 有 | 有 | 有 |
UNSUBACK | 取消订阅确认 | S->C | 11 | 有 | 有 | 无 |
PING | 发送心跳命令 | C->S | 12 | 有 | 无 | 无 |
PINGRSP | PING 命令回复 | S->C | 13 | 有 | 无 | 无 |
DISCONNECT | 断开连接 | C->S | 14 | 有 | 无 | 无 |