MQTT学习从零到实战:一

1. 什么是MQTT?

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。

2. MQTT的优点和应用范围

最大优点:用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务

应用范围:广泛应用于物联网、M2M通信、智能家居、工业自动化、智能交通、智能农业、环境监测等领域。例如,在智能家居领域,MQTT可以实现各种智能设备之间的互联互通和远程控制

3. MQTT订阅与发布

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。

MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。

提供了一对多的消息分发机制,从而实现与应用程序的解耦。

MQTT 服务器是发布-订阅架构的核心 。目前主流的MQTT服务器有:Eclipse Mosquitto、EMQ X、HiveMQ CE、VerneMQ(下一篇将基于EMQ X进行实战讲解)

MQTT(Message Queuing Telemetry Transport)协议中的发布者、订阅者、代理和主题是其核心概念,它们共同构建了一个灵活且可扩展的消息传递系统。

发布者(Publisher)

发布者是MQTT协议中的消息发送方。它们负责创建并发布消息到MQTT代理(Broker)。发布者将消息发送到特定的主题(Topic),而不直接发送给特定的订阅者。这使得发布者无需知道哪些订阅者正在监听其发布的消息,从而实现了发布者和订阅者之间的解耦。

订阅者(Subscriber)

订阅者是MQTT协议中的消息接收方。它们向MQTT代理订阅感兴趣的主题,并接收该主题上发布的所有消息。订阅者可以根据需要订阅多个主题,以便接收来自不同源的消息。一旦订阅者接收到消息,它们可以根据自己的业务逻辑对消息进行处理。

代理(Broker)

MQTT代理是MQTT协议中的核心组件,负责在发布者和订阅者之间传递消息。代理接收发布者发送的消息,并根据订阅者的订阅信息将消息转发给相应的订阅者。代理还负责管理订阅关系,确保消息能够准确地发送给需要的订阅者。此外,代理还可以提供持久化存储功能,以便在订阅者离线时保存消息,并在订阅者重新上线时发送这些消息。

主题(Topic)

主题是MQTT协议中用于对消息进行分类的关键概念。它是一个UTF-8编码的字符串,可以包含多个层级关系(通过斜杠/表示)。发布者将消息发布到特定的主题,而订阅者则订阅感兴趣的主题以接收消息。主题的设计使得MQTT协议能够支持灵活的消息传递模式,允许不同的设备和应用程序通过共享的主题进行通信。

4. QoS(Quality of Service levels)

MQTT 协议中规定了消息服务质量(Quality of Service),它保证了在不同的网络环境下消息传递的可靠性,QoS 的设计是 MQTT 协议里的重点。

4.1 QoS 0 最多分发一次

这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即:<=1

4.2 QoS 1 至少分发一次

QoS 1 承诺消息将至少传送一次给订阅者。

4.3 QoS 2 只分发一次

使用 QoS 2,我们保证消息仅传送到目的地一次。为此,带有唯一消息 ID 的消息会存储两次,首先来自发送者,然后是接收者。QoS 级别 2 在网络中具有最高的开销,因为在发送方和接收方之间需要两个流。

如何决定QoS?

MQTT 发布消息 QoS 保证不是端到端的,是客户端与服务器之间的。订阅者收到 MQTT 消息的 QoS 级别,最终取决于发布消息的 QoS 和主题订阅的 QoS。

5. MQTT 数据包结构

固定报头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。

可变报头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。

有效载荷(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容。

整体MQTT的消息格式如下图所示;

5.1 MQTT固定头

每个MQTT控制包都包含一个固定报头

消息类型

标识位(bit0~3)

DUP1: 控制报文的重复分发标志

QoS2:PUBLISH报文的服务质量等级

RETAIN3: PUBLISH报文的保留标志

剩余长度

剩余长度是一个可变字节整数,表示当前控制报文中剩余的字节数,包括可变报头和有效载荷中的数据。

可变报头

可变报头位于固定报头和有效载荷之间,可变报头的内容根据报文类型的不同而不同。通常都包括一个2字节的数据包标识字段,这些类型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK

有效载荷

Payload有效载荷位于MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型包含有效载荷。

CONNECT有效载荷内容主要是:客户端的ClientID、遗嘱主题、遗嘱Message以及用户名和密码。

SUBSCRIBE有效载荷内容是主题过滤器指明需要订阅的Topic以及QoS。

SUBACK有效载荷内容包含一个返回码清单,每个返回码对应等待确认的SUBSCRIBE报文中的一个主题过滤器。UNSUBSCRIBE有效载荷内容是客户端想要取消订阅的主题过滤器。

相关推荐
车载诊断技术1 小时前
电子电气架构 --- 什么是EPS?
网络·人工智能·安全·架构·汽车·需求分析
KevinRay_1 小时前
Python超能力:高级技巧让你的代码飞起来
网络·人工智能·python·lambda表达式·列表推导式·python高级技巧
2301_819287122 小时前
ce第六次作业
linux·运维·服务器·网络
CIb0la2 小时前
GitLab 停止为中国区用户提供 GitLab.com 账号服务
运维·网络·程序人生
Black_mario2 小时前
链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 应用场景
网络·人工智能·web3
eybk2 小时前
Pytorch+Mumu模拟器+萤石摄像头实现对小孩学习的监控
学习
6.942 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
中科岩创3 小时前
中科岩创边坡自动化监测解决方案
大数据·网络·物联网
守护者1704 小时前
JAVA学习-练习试用Java实现“使用Arrays.toString方法将数组转换为字符串并打印出来”
java·学习
学会沉淀。4 小时前
Docker学习
java·开发语言·学习