网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

消息队列遥测传输协议(MQTT)简介

更新时间:2026年03月27日   作者:spoto   标签(Tag):

消息队列传输协议,简称MQTT,是一种专为具有极低延迟且带宽有限的物联网设备设计的通信协议。由于MQTT协议特别适用于低带宽、高延迟的环境,因此它是实现机器对机器通信的理想选择。

什么是消息队列遥测传输协议(MQTT)?

MQTT这是一种简单、轻量级的消息传递协议,用于实现多个设备之间的通信。它基于TCP协议,采用发布-订阅模型来传递数据。这种通信协议非常适合在带宽有限且功耗要求较低的设备上传输数据。因此,这种消息传递协议被广泛用于各种场景中的通信需求。物联网框架/体系结构

发布-订阅模型

该模型涉及多个客户端之间的互动,它们之间并没有直接的连接关系。所有客户端都通过一种被称为“经纪人”的第三方来与其他客户端进行通信。

MQTT客户端与代理

客户们会向经纪人发布各种主题的消息。 该经纪人是一个中央服务器,负责接收这些消息,并根据它们的主题对其进行筛选处理。 然后,这些消息会被发送给那些订阅了相应主题的客户端。任何发布/订阅协议的核心部分,就是MQTT代理。 根据具体的实现方式,该经纪人能够同时处理数千个连接到MQTT协议的客户。 所有通信信息都必须被经纪人收到。之后,经纪人会对这些信息进行整理,确定谁订阅了哪些信息,然后将这些信息传递给那些已经订阅了这些信息的客户。 所有持续存在的客户会话信息,包括未读的消息以及订阅信息等,同样会被经纪人保存下来。

发布-订阅模型

因此,订阅了特定主题的客户端会收到该主题上发布的所有消息。

在这里,经纪人是信息的中心枢纽。它负责接收各种信息,对其进行筛选,然后将其分发给相应的客户。这样一来,无论是信息的发布者还是订阅者,都成为了该系统的客户端。

MQTT的工作原理

MQTT的发布/订阅通信模式,旨在最大限度地利用可用的带宽。这种模式是一种替代传统客户端-服务器架构的方案,因为传统架构需要直接与某个端点进行通信。 相比之下,发送消息的客户端(即发布者)以及接收消息的多个客户端(即订阅者)在pub/sub模式中并不处于同一连接状态。 第三方——也就是那些经纪人——负责处理出版商与订阅者之间的关系。因为他们之间并不直接进行沟通和交流。

“发布者”和“订阅者”指的是客户端是负责发送消息还是接收消息的。这些都是MQTT客户端的例子。同一个MQTT客户端可以同时用于实现这两种功能。当客户端或设备想要向服务器或代理发送数据时,就发生了“发布”行为。

“订阅”这一术语指的是相反的操作过程。多个客户可以通过发布/订阅模式与经纪人连接,从而订阅他们感兴趣的议题或信息。

MQTT

当经纪人与订阅客户失去联系时,经纪人会将消息存储在缓冲区中,待其重新连接后,再将这些消息发送给订阅客户。如果发布客户端突然与经纪人断开连接,那么经纪人有权中断与订阅客户的通信,并向他们发送包含发布方指令的缓存消息。

根据IBM的文档描述,出版者发送消息,订阅者则接收他们感兴趣的消息。而中间代理则负责将消息从出版者传递给订阅者。MQTT客户端,无论是出版者还是订阅者,都只能与MQTT代理进行通信。任何使用MQTT库的设备或程序都可以作为MQTT客户端,这些设备可以是像Arduino这样的微控制器,也可以是部署在云端的整个应用程序服务器。

MQTT的特性

  • 重量轻:MQTT的设计旨在实现轻量级通信,因此非常适合在那些对网络带宽和处理能力有严格要求的环境中使用,比如嵌入式系统和低性能设备上。该协议能够最大限度地减少带宽和处理负担,从而即使在受限的网络环境中也能实现高效的通信。
  • 发布-订阅模型:在发布-订阅模式中,客户端(即发布者)向目标对象发送消息,而不同的客户端(即订阅者)则从感兴趣的目标对象那里接收消息。这种生产者和消费者的分离方式,使得通信方式更加灵活且富有动态性。
  • 服务质量(QoS)等级:MQTT支持多种不同的消息传递保证机制,这些机制被称为……服务质量(QoS)QoS等级从0到2不等,根据实际需求提供不同级别的可靠性和消息传输保障。
  • 保留的消息:MQTT允许代理在主题上存储已保存的消息,这样,新的订阅者就能在订阅后立即获取该主题上最新的消息。这一特性对于消息更新和配置设置的传递非常有用。
  • 最后遗嘱/遗言:MQTT客户端可以指定一个“最后遗言”消息,以便在用户突然断开连接时由代理发送出去。这一功能有助于检测用户的失败情况,并妥善处理相关问题。
  • 安全性:MQTT有助于各种保护机制的实施,这些机制包括:传输层安全协议(TLS)这些加密和认证机制包括用户名/密码以及消费者证书。这些功能确保了通过MQTT连接传输的消息的保密性、完整性和真实性。

MQTT的优势

该模型并不局限于客户端之间的单向通信。 虽然发布者客户端只发送一条关于特定主题的消息,但中间件会向所有订阅了该主题的客户端发送多条消息。 同样地,多个发布者客户端在多个不同的主题上发送的消息,也会被发送到所有订阅了这些主题的客户端。因此,使用这种模型可以实现一对多、多对一以及多对多的通信方式。 此外,客户可以发布数据,同时也可以通过这种双向通信协议来接收数据。 因此,MQTT被认为是一种双向通信协议。 用于数据传输的默认未加密MQTT端口为1883。 用于安全传输的加密端口为8883。

  • 这是一种轻量级的协议,其创建过程非常快速,同时还能实现高效的数据传输。
  • 数据包的使用量极小,因此网络使用率也很低。
  • 有效的数据分散性
  • 有效利用遥感技术进行控制
  • 及时且有效的信息传达
  • 最大限度地减少功耗,这对连接到的设备来说是非常有益的。同时,还能最大化网络的容量。
  • 数据传输的速度快、效率高且占用资源少,因为MQTT消息的编码方式非常简洁。这些控制消息的头部固定为2字节大小,而消息的有效载荷则最大可达256兆字节。

MQTT的缺点

  • 与受限应用协议(Constrained Application Protocol, CoAP)相比,MQTT的发送周期较慢。
  • 在MQTT中,资源发现是基于灵活的主题订阅来实现的;而在CoAP中,资源发现则基于一种可靠的系统来实现。
  • MQTT并不具备加密功能。实际上,其安全性是通过TLS/SSL协议来实现的。
  • 构建一个能够在国际范围内广泛应用的MQTT网络是一项具有挑战性的任务。

什么是主题呢?

在MQTT协议中,主题是一个UTF-8格式的字符串,Broker使用这个字符串来为每个连接的客户端过滤消息。每个主题由多个子主题组成。每个子主题之间用斜杠分隔,这种分隔符也被称为“主题级别分隔符”。无论是主题还是其子主题,都区分大小写。

主题示例 –

家/厨房/桌子

在这里,“家”、“厨房”和“桌子”都是不同层次的主题。

Wildcard是一种附加功能,它在MQTT协议中被使用,旨在使主题及其层次结构更加灵活且易于使用。

MQTT主题包含两种类型的通配符:

单级模式:“+”
用“+”符号表示的单层通配符可以替代主题中的单层结构。

例如——
如果客户想要获取关于房屋内所有表格的信息,那么他就需要订阅该主题。

home/+/表格

因此,关于厨房、客厅、卧室等场所中的各种表格的相关信息,都可以在这一主题下找到。

图/图片 –MQTT中的单层主题

2. 多层结构:“#”
以“#”符号表示的多级通配符可以替换主题中的多个层级内容。

例如——
如果客户想要获取关于一楼厨房、客厅、卧室或任何其他房间内所有物品的信息,那么他们就需要订阅“topic:”这个主题。

家/底层住宅

因此,关于厨房用品、卧室用品以及客厅用品的相关信息,都可以在这一主题下找到。在这种情况下,可以获取到多个层面的信息。

以下程序展示了如何用JavaScript实现MQTT协议。

JavaScript
//用于实现发布-订阅模型的JavaScript程序/* JSHint 版本:6 */使用“严格模式”;//导入MQTT相关模块变量MQTT=需要(‘mqtt’);//创建客户端的一个实例变量客户端=MQTT.连接({clientId:“001”});//定义常量变量主题/话题=家/厨房/餐桌;变量信息/消息=“厨房内的餐桌”;变量选项={保留:错误的/不正确的,QoS:1};//连接成功时客户/用户.on(“连接”,功能/作用(){控制台.日志/记录(连接成功后:,客户/用户.连接/关联);//如果客户端已连接,那么就在该主题上发布消息。if(客户/用户.连接/关联){控制台.日志/记录(关于该主题的出版物:,主题/话题);客户/用户.发布/发表(主题/话题,消息,选项);}});//在连接出现错误时客户端.on(“错误”,功能/作用(错误/失误){控制台.日志/记录(连接错误:“,错误/失误);});//在接收到消息后客户/用户.on(“消息”,功能/作用(主题/话题,消息/信息){控制台.日志/记录(收到消息:”,消息.转换为字符串(),主题相关的内容:,主题/话题);客户/用户.结束();});功能/作用初始化(){//订阅该主题控制台.日志/记录(“订阅该主题”);客户/用户.订阅(主题/话题,{QoS:1});}//程序的开始部分初始化();
              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料