前言
本文适合刚刚学习MQTT协议的小白!(如果用途之类的描述不太清楚,可以直接从常用的概念处开始查看)
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)协议是一种轻量级的通信协议,广泛应用于物联网(IoT)、工业自动化、智能家居等领域。
主要用途
1. 实现设备与设备之间的通信
- 设备间消息传递:允许不同类型的设备(如传感器、控制器、执行器等)之间进行消息的发送和接收。例如,一个温湿度传感器可以将采集到的数据通过 MQTT 发送给一个空调控制器,控制器根据数据调整空调的工作状态。
- 分布式系统协调:在分布式系统中,多个设备可以使用 MQTT 协议进行协同工作。比如在智能家居系统中,智能门锁、智能灯、智能窗帘等设备可以通过 MQTT 协议相互配合,实现自动化场景控制。
2. 设备与服务器之间的数据传输
- 数据上报:设备可以将采集到的数据(如传感器数据、状态信息等)发送到服务器。例如,工业现场的传感器可以将生产过程中的温度、压力、流量等数据通过 MQTT 协议实时上传到服务器,供监控系统进行分析和处理。
- 指令下发:服务器也可以通过 MQTT 协议向设备发送指令,控制设备的行为。比如服务器可以向智能家电发送开关机指令、调整参数指令等。
3. 支持低带宽和高延迟网络环境
- 轻量级特性:MQTT 协议的报文结构简单,头部信息仅2字节,相比 HTTP 等协议,数据传输量小,适合在带宽有限的网络中使用。例如在偏远地区的物联网设备,通过低带宽的网络(如 NB-IoT)可以高效地传输数据。
- 高延迟容错:即使网络延迟较高,MQTT 协议也能保证消息的可靠传输。它通过消息确认机制(如 QoS 等级)确保消息不会丢失,适用于网络不稳定或延迟较大的场景。
4. 实现消息的发布/订阅模式
- 解耦设备与应用:设备作为消息的发布者,将数据发布到特定的主题(Topic)上;应用作为订阅者,订阅感兴趣的主题获取消息。这种方式使得设备和应用之间解耦,便于扩展和维护。例如,多个不同的应用可以同时订阅同一传感器发布的数据,而无需关心数据的来源。
- 灵活的消息分发:可以根据主题的层次结构进行消息的分发和过滤。例如,主题可以分为"家庭/客厅/温度"、"家庭/卧室/温度"等,订阅者可以根据需要订阅特定层次的主题,获取相关的消息。
5. 支持多种消息服务质量(QoS)等级
- QoS 0(最多一次):消息发送后不保证接收方一定收到,适用于对消息可靠性要求不高的场景,如设备状态更新等。
- QoS 1(至少一次):确保消息至少被接收方接收一次,可能会出现重复消息,适用于对消息可靠性有一定要求的场景,如设备控制指令等。
- QoS 2(恰好一次):确保消息被接收方接收一次且仅一次,适用于对消息可靠性要求极高的场景,如金融交易数据等。
6. 实现设备的远程监控和管理
- 实时监控:通过 MQTT 协议,服务器可以实时接收设备发送的数据,实现对设备的实时监控。例如,监控工业设备的运行状态、能源消耗等。
- 远程管理:服务器可以通过 MQTT 协议向设备发送指令,实现对设备的远程管理,如远程升级设备固件、配置设备参数等。
常用的概念
1. 客户端(Client)
客户端是MQTT通信中的一个实体,它可以是传感器、设备、应用程序或其他任何能够发送或接收消息的软件。客户端可以分为以下几类:
- 发布者(Publisher):负责向服务器(Broker)发送消息的客户端。发布者可以是传感器设备,将采集到的数据(如温度、湿度等)作为消息发送出去。
- 订阅者(Subscriber):负责从服务器接收消息的客户端。订阅者可以根据自己的需求订阅特定主题的消息,当有匹配的消息发布时,服务器会将消息推送给订阅者。
- 同时具备发布和订阅功能的客户端:在实际应用中,很多客户端既可以发布消息,也可以订阅消息。例如,一个智能家居设备可以将自身状态信息(如开关状态)发布出去,同时也可以订阅控制指令消息。
2. 服务器(Broker)
服务器是MQTT通信的核心组件,它负责接收客户端发布的消息,并将消息分发给订阅了相应主题的客户端。服务器的主要功能包括:
- 消息中转:接收发布者发送的消息,并根据消息的主题将其转发给订阅者。
- 客户端管理:管理客户端的连接、断开连接、认证和授权等操作。
- 主题管理:维护主题的订阅关系,确保消息能够正确地分发给订阅者。
3. 主题(Topic)
主题是MQTT中用于标识消息分类的字符串,它类似于消息的"地址"。客户端通过主题来发布和订阅消息。主题具有以下特点:
- 层次结构 :主题可以使用正斜杠(
/
)来分隔不同的层次,形成树状结构。例如,home/living_room/temperature
表示家庭客厅的温度主题。 - 通配符 :MQTT支持两种通配符:
- 单层通配符(
+
) :用于匹配主题中的单个层次。例如,home/living_room/+/temperature
可以匹配home/living_room/1/temperature
、home/living_room/2/temperature
等。 - 多层通配符(
#
) :用于匹配主题中的多个层次。例如,home/#
可以匹配所有以home
开头的主题,如home/living_room/temperature
、home/kitchen/humidity
等。
- 单层通配符(
- 主题过滤:订阅者可以根据主题过滤规则来订阅消息。服务器会根据订阅者的主题过滤规则,将匹配的消息推送给订阅者。
4. 消息(Message)
消息是客户端之间通信的载体,它由主题(Topic)和消息内容(Payload)组成。消息内容可以是任意格式的数据,例如文本、二进制数据等。消息具有以下特点:
- 消息质量(QoS) :MQTT定义了三种消息服务质量(QoS)级别,用于控制消息的传输可靠性:
- QoS 0(最多一次):消息最多被传输一次,不保证消息一定能够到达接收方。这种级别的消息传输效率最高,但可靠性最低,适用于对消息可靠性要求不高的场景,如传感器数据的快速上报。
- QoS 1(至少一次):消息至少被传输一次,接收方可能会收到重复的消息。这种级别的消息可靠性较高,适用于对消息可靠性有一定要求的场景,如设备状态更新。
- QoS 2(恰好一次):消息恰好被传输一次,接收方不会收到重复的消息。这种级别的消息可靠性最高,但传输效率相对较低,适用于对消息可靠性要求极高的场景,如金融交易数据传输。
- 消息保留(Retained Message):客户端可以将消息设置为保留消息。当新的订阅者订阅了该消息的主题时,服务器会将保留消息推送给订阅者,即使该消息是在订阅者之前发布的。保留消息通常用于向新订阅者提供最新的状态信息。
5. 会话(Session)
会话是指客户端与服务器之间的一次连接过程。MQTT支持持久会话(Clean Session = false)和非持久会话(Clean Session = true):
- 持久会话:客户端与服务器之间保持会话状态,即使客户端断开连接,服务器也会保留该客户端的订阅信息和未送达的消息。当客户端重新连接时,服务器会恢复会话状态,并将未送达的消息推送给客户端。这种会话方式适用于需要保持会话状态的场景,如设备长时间离线后重新连接。
- 非持久会话:客户端与服务器之间不保持会话状态,每次连接都是独立的。当客户端断开连接时,服务器会清除该客户端的订阅信息和未送达的消息。这种会话方式适用于对会话状态要求不高的场景,如临时设备连接。
6. 连接(Connection)
连接是指客户端与服务器之间建立的通信链路。MQTT使用TCP/IP协议来建立连接,客户端通过TCP连接与服务器进行通信。连接具有以下特点:
- 连接保持(Keep-Alive) :客户端和服务器之间可以通过心跳机制(如
PINGREQ
和PINGRESP
消息)来保持连接的活跃状态。如果在指定的时间内没有收到对方的响应,客户端或服务器可以认为连接已经断开,并采取相应的措施,如重新连接。 - 连接断开(Disconnect) :客户端可以通过发送
DISCONNECT
消息来主动断开与服务器的连接。服务器也可以在某些情况下(如客户端长时间未响应)断开客户端的连接。
7. 认证(Authentication)
MQTT支持客户端认证机制,以确保只有合法的客户端能够连接到服务器。常见的认证方式包括:
- 用户名和密码认证:客户端在连接时需要提供用户名和密码,服务器验证用户名和密码的合法性。
- 证书认证:客户端和服务器可以使用数字证书进行双向认证,确保通信的安全性。
8. Last Will and Testament(LWT,遗嘱消息)
遗嘱消息是客户端在连接时设置的一种消息。当客户端异常断开连接时(如网络故障、设备掉电等),服务器会将遗嘱消息发布到指定的主题,通知其他客户端该客户端已经离线。遗嘱消息通常用于设备状态监控场景,例如,当一个传感器设备掉线时,服务器可以将遗嘱消息发送给监控系统,提醒监控人员设备出现故障。
最后
可以先将上面的内容看熟练
这样项目中看到mqtt
只会感到亲切,不会害怕这个技术。
收摊!🫏🫏🫏