MQTT

MQTT 协议

相关技术栈:linux、http/https、web

MQTT 协议的概念

MQTT协议,全称 Message Queue Telemetry Transport 消息队列遥测传输协议 ,是一种基于发布/订阅的轻量级通讯协议

适用于条件较差的网络环境,如:网络延迟高、带宽低、通信讯号不稳定等情况。

MQTT协议的特点

  • 构建于 TCP/IP 协议之上

TCP/IP参考模型可分为四层:应用层、传输层、网络层、链路层。TCP、UDP 协议均属于传输层,MQTT 运行与 TCP 之上,属于应用层协议,只要支持 TCP/IP 协议栈的地方都可应用 MQTT。

  • 基于 C-S 架构的消息发布/订阅,提供一对多的消息发布,作为客户端之间的中间介质,解除应用程序的耦合。
  • 对负载内容屏蔽的消息传输
  • 使用 TCP 连接进行数据推送
  • 三种消息发布 QoS

QoS 0:至多一次。服务器只推送1次,至于客户端是否收到,收到的消息是否正确,数据是否有所丢失,都不管。
QoS 1:至少一次。客户端收到服务器的推送后要回复一个PUBACK告诉服务器已收到,否则服务器会认为Client未收到推送,隔一段时间后重新发送,直到对方回复PUBACK。
QoS 2:只发一次。保证数据包到达目的地,且不会出现重复。服务器发送数据包,客户端接收后回复PUBREC(收到发布消息)报文,服务器存储PUBREC中的报文标识符,发送PUBREL(释放发布消息)。

MQTT协议规范

消息类型

表1.报文类型值

名称 流向 说明
CONNECT 1 C -> S 客户端连接请求
CONNACK 2 S -> C 服务端确认连接
PUBLISH 3 C <-> S 发布消息
PUBACK 4 C <-> S QoS1消息确认
PUBREC 5 C <-> S QoS2收到消息(保证传输step1)
PUBREL 6 C <-> S QoS2释放消息(保证传输step2)
PUBCOMP 7 C <-> S QoS2完成消息(保证传输step3)
SUBSCRIBE 8 C -> S 订阅消息
SUBACK 9 S -> C 订阅确认
UNSUBSCRIBE 10 C -> S 取消订阅
UNSUBACK 11 S -> C 取消订阅确认
PINGREQ 12 C -> S 连接保活请求
PINGRESP 13 S -> C 保活回应
DISCONNECT 14 C -> S 断开连接

注: 值为 0 和 15 保留

MQTT控制报文

MQ控制报文由三部分组成:固定报头+可变报头+有效载荷

表2.报文格式

固定报头 所有控制报文都包含
可变报头 部分报文包含
有效载荷 部分报文包含

固定报头

表3.固定报头格式

Bit 7 6 5 4 3 2 1 0
Byte 1 MQTT控制报文类型 控制报文类型的标志位
Byte 2 剩余长度

注: 固定报头 Byte1 的高四位是表1中消息类型的值,以二进制数表示。低四位是报文类型的标志位。

可变报头

可变报头在固定报头和负载之间。可变报头的报文标识符字段存在于在多个类型的报文里。

很多控制报文的可变报头部分包含一个两字节的报文标识符字段。这些报文是 QoS > 0 时的 PUBLISH,PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE, SUBACK,UNSUBSCRIBE,UNSUBACK。SUBSCRIBE,UNSUBSCRIBE和PUBLISH(QoS大于0)控制报文必须包含一个非零的 16 位报文标识符。客户端每次发送一个新的这些类型的报文时都必须分配一个当前未使用的报文标识符。如果一个客户端要重发这个特殊的控制报文,在随后重发那个报文时,它必须使用相同的标识符。当客户端处理完这个报文对应的确认后,这个报文标识符就释放可重用。发送一个 QoS 0 的PUBLISH报文时,相同的条件也适用于服务端。

即 uuid,标识会话,当标识符一致时表示在同一会话中。

有效载荷

->Body.