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有效载荷内容是客户端想要取消订阅的主题过滤器。

相关推荐
EasyCVR1 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
徐嵌1 小时前
STM32项目---畜牧定位器
c语言·stm32·单片机·物联网·iot
明月看潮生2 小时前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
cuisidong19972 小时前
5G学习笔记三之物理层、数据链路层、RRC层协议
笔记·学习·5g
Acrelhuang2 小时前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
南宫理的日知录2 小时前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
jjyangyou2 小时前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
龙哥说跨境2 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
数据与后端架构提升之路3 小时前
从神经元到神经网络:深度学习的进化之旅
人工智能·神经网络·学习
懒大王就是我3 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip