物联网MQTT协议详解及其作用
老俊目前正在从事物联网行业,对MQTT有一定的了解,本文为您简述什么是MQTT,以及MQTT怎么使用
什么是MQTT
物联网 (IoT) 和机器对机器 (M2M) 通信对我们与技术交互的方式产生了持久影响。到 2022 年底,全球连接的物联网设备数量增长了 18%,达到 144 亿,到 2025 年估计连接的物联网设备将达到约 270 亿。随着这种增长,能够处理设备和处理系统(通常位于云端)之间实时、可靠和高效通信的消息传递协议至关重,因此,MQTT协议应运而生
MQTT的工作原理
Mqtt的工作原理可以概括为:MQTT 通过其两个主要组件来实现发布/订阅模型:客户端和代理
消息通过使用 MQTT 的代理与其他设备或软件共享。每条消息都有一个主题(Topic),Broker 可以根据该主题进一步处理消息。此外,每条消息都包含一个消息内容,即所谓的有效负载(payload)。 MQTT 负载不绑定特定结构,可以自由设计。然而,为消息内容指定一个特定的结构是有帮助的,这样它就可以被其他设备或软件读取。潜在的消息结构可以是 JSON、XML 或 OPC UA。只要所有设备和软件都使用相同的结构进行通信,定义的结构就可以实现顺畅的内部通信
当订阅客户端失去与代理的连接时,代理可以 根据用例和实现 – 保留任何旨在发送给订阅者的消息,然后在订阅者重新连接时立即传递它们。这确保订阅者不会错过任何消息并以正确的顺序接收它们,在国内简称遗嘱机制
MQTT服务质量等级(Qos)
QoS 是指消息的发送者和消息的接收者之间的协议。它是 MQTT 中的一项关键功能,使客户端能够在三个服务级别之间进行选择。三个不同的 QoS 级别决定了 MQTT 协议如何管理内容。尽管更高级别的 QoS 更可靠,但它们具有更多的延迟和带宽要求,因此订阅客户可以指定他们希望接收的最高 QoS 级别。
MQTT协议数据包结构
MQTT 是一种基于二进制的协议,控制元素是二进制字节而不是文本字符串
命令和命令确认格式由 MQTT 使用,这意味着每个命令都有一个伴随的确认。连接命令有连接确认,订阅命令有订阅确认,发布命令有发布确认,如上图所示。这种机制类似于 TCP 协议的握手机制
MQTT 消息格式由3字段组成
固定包头报文解析
固定包头包含 2 个字节,
第一个字节的前4位(Bit7Bit4)表示**消息类型**,后4位(Bit3Bit0)用于表示传输协议和Qos等级,
第二字节用于存储数据包长度,这个长度=可变包头长度+包体长度
MQTT Control Packet Types:
Name | Value | Direction of Flow | Description |
---|---|---|---|
Reserved | 0 | Forbidden | Reserved |
CONNECT | 1 | Client To Server | Connection Request |
CONNACK | 2 | Server To Client | Connection Acknowledgement |
PUBLISH | 3 | Client To Server Or Server To Client | Publish Message |
PUBACK | 4 | Client To Server Or Server To Client | Publish Acknowledgement |
PUBREC | 5 | Client To Server Or Server To Client | Publish Received |
PUBREL | 6 | Client To Server Or Server To Client | Publish Release |
PUBCOMP | 7 | Client To Server Or Server To Client | Publish Complete |
SUBSCRIBE | 8 | Client To Server | Subscribe Request |
SUBACK | 9 | Server To Client | Subscribe Acknowledgement |
UNSUBSCRIBE | 10 | Client To Server | Unsubscribe request |
UNSUBACK | 11 | Server To Client | Unsubscribe Acknowledgement |
PINGREQ | 12 | Client To Server | Ping Request |
PINGRESP | 13 | Server To Client | Ping Response |
DISCONNECT | 14 | Client To Server Or Server To Client | Disconnect Notification |
AUTH | 15 | Client To Server Or Server To Client | Authentication Exchange |
Flag Bit:
MQTT Control Packet | Fixed Header Flags | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
---|---|---|---|---|---|
CONNECT | Reserved | 0 | 0 | 0 | 0 |
CONNACK | Reserved | 0 | 0 | 0 | 0 |
PUBLISH | MQTT v5.0 | DUP | QoS | RETAIN | |
PUBACK | Reserved | 0 | 0 | 0 | 0 |
PUBREC | Reserved | 0 | 0 | 0 | 0 |
PUBREL | Reserved | 0 | 0 | 0 | 0 |
PUBCOMP | Reserved | 0 | 0 | 0 | 0 |
SUBSCRIBE | Reserved | 0 | 0 | 0 | 0 |
SUBACK | Reserved | 0 | 0 | 0 | 0 |
UNSUBSCRIBE | Reserved | 0 | 0 | 0 | 0 |
UNSUBACK | Reserved | 0 | 0 | 0 | 0 |
PINGREQ | Reserved | 0 | 0 | 0 | 0 |
PINGRESP | Reserved | 0 | 0 | 0 | 0 |
DISCONNECT | Reserved | 0 | 0 | 0 | 0 |
AUTH | Reserved | 0 | 0 | 0 | 0 |
可变包头(Variable Header)解析
可变标头组件作为可选字段包含在某些 MQTT 控制数据包类型中。在固定报头和有效载荷之间是这个字段。可变标头的内容由数据包类型决定。在可变报头中可以找到许多数据包类型中常见的数据包标识符字段。数据包标识符字段是一个 2 字节整数,包含在许多 MQTT 控制数据包类型的可变标头组件中。
数据包标识符字段在下面的列表中给出:
数据包标识符字段的特征:
- 如果 QoS(服务质量)的值设置为零,则 PUBLISH 数据包不应包含数据包标识符字段。这意味着如果 QoS 值大于零,则数据包标识符字段将仅出现在 PUBLISH 数据包中。
- 客户端在发送新的 SUBSCRIBE、UNSUBSCRIBE 或 PUBLISH MQTT 控制数据包时应分配一个当前未使用的非零数据包标识符。
- 服务器在发送新的 PUBLISH MQTT 控制数据包时应分配一个当前未使用的非零数据包标识符。
- PUBACK、PUBREC、PUBUREL、PUBREC是PUBLISH命令确认包,包标识符与PUBLISH包相同
- SUBACK和UNSUBACK分别是SUBSCRIBE和UNSUBSCRIBE确认包。 SUBACK 和 UNSUBACK 数据包与 SUBSCRIBE 和 UNSUBSCRIBE 数据包共享相同的数据包标识符
- 处理完相应的确认包后,包标识符可以重复使用。下面是一个定义:
A。如果 QoS 设置为 1,则 PUBLISH 的确认包将是 PUBACK。如果处理了 PUBACK,则可以重用 PUBACK 数据包标识符。
B.如果 QoS 值为 2,则 PUBLISH 确认包将是 PUBCOMP 或 PUBREC。
包体(payload)
包体是消息格式中的最后一个 MQTT 控制数据包。该字段保存将要发送的数据。
MQTT Control Packet | Payload |
---|---|
CONNECT | Required |
CONNACK | None |
PUBLISH | Optional |
PUBACK | None |
PUBREC | None |
PUBREL | None |
PUBCOMP | None |
SUBSCRIBE | Required |
SUBACK | Required |
UNSUBSCRIBE | Required |
UNSUBACK | Required |
PINGREQ | None |
PINGRESP | None |
DISCONNECT | None |
AUTH | None |
MQTT5.0新特性
MQTT 协议是当今世界上使用最广泛、最受欢迎的 TCP/IP 物联网协议。毫不奇怪,该协议的广泛采用导致对进一步开发 MQTT 规范的高需求。 MQTT 5 试图满足这种需求。在制造系统和物流领域,以及智能家居应用,以及企业物联网应用和移动应用,都是流行的 MQTT v5 用例
MQTT 5.0 版中的新功能旨在实现以下目标:
MQTT 5 与 MQTT 3 有什么不同?
MQTT v5.0 是 MQTT 3.1 的继任者。最重要的是,MQTTv5.0 不支持向后兼容性(如 v3.1.1 )。由于引入了如此多的新项目,因此必须重新审视当前的实施。以下是一些V5和V3不一样的地方:
对于大多数物联网用例,MQTT 5 规范已成为合乎逻辑的选择。 MQTT 5 的新特性成功解决了版本 3 的局限性,同时也为未来的发展开辟了道路。未来几年,协议的采用预计将在所有行业激增,包括工业、汽车、关键基础设施、物流、智慧城市等。 MQTT 即将成为连接到物联网的所有事物的行业标准。