MQTT协议是用来做什么的?此协议常用的概念有哪些?

前言

本文适合刚刚学习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/temperaturehome/living_room/2/temperature 等。
    • 多层通配符(# :用于匹配主题中的多个层次。例如,home/# 可以匹配所有以 home 开头的主题,如 home/living_room/temperaturehome/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) :客户端和服务器之间可以通过心跳机制(如PINGREQPINGRESP消息)来保持连接的活跃状态。如果在指定的时间内没有收到对方的响应,客户端或服务器可以认为连接已经断开,并采取相应的措施,如重新连接。
  • 连接断开(Disconnect) :客户端可以通过发送DISCONNECT消息来主动断开与服务器的连接。服务器也可以在某些情况下(如客户端长时间未响应)断开客户端的连接。

7. 认证(Authentication)

MQTT支持客户端认证机制,以确保只有合法的客户端能够连接到服务器。常见的认证方式包括:

  • 用户名和密码认证:客户端在连接时需要提供用户名和密码,服务器验证用户名和密码的合法性。
  • 证书认证:客户端和服务器可以使用数字证书进行双向认证,确保通信的安全性。

8. Last Will and Testament(LWT,遗嘱消息)

遗嘱消息是客户端在连接时设置的一种消息。当客户端异常断开连接时(如网络故障、设备掉电等),服务器会将遗嘱消息发布到指定的主题,通知其他客户端该客户端已经离线。遗嘱消息通常用于设备状态监控场景,例如,当一个传感器设备掉线时,服务器可以将遗嘱消息发送给监控系统,提醒监控人员设备出现故障。

最后

可以先将上面的内容看熟练

这样项目中看到mqtt只会感到亲切,不会害怕这个技术。

收摊!🫏🫏🫏

相关推荐
学c真好玩几秒前
Django创建的应用目录详细解释以及如何操作数据库自动创建表
后端·python·django
Asthenia0412几秒前
GenericObjectPool——重用你的对象
后端
拉不动的猪6 分钟前
# 移动端与PC端全屏的处理
前端·javascript·面试
Piper蛋窝11 分钟前
Go 1.18 相比 Go 1.17 有哪些值得注意的改动?
后端
excel25 分钟前
招幕技术人员
前端·javascript·后端
盖世英雄酱5813642 分钟前
什么是MCP
后端·程序员
烛阴1 小时前
Promise无法中断?教你三招优雅实现异步任务取消
前端·javascript
小鸡脚来咯2 小时前
SpringBoot 常用注解通俗解释
java·spring boot·后端
前端张三2 小时前
vue3中ref在js中为什么需要.value才能获取/修改值?
前端·javascript·vue.js