原文:Introducing the MQTT Protocol – MQTT Essentials: Part 1
本篇文章在翻译过程中,对相关内容进行了一些删减,比如文字超链接
作者:HiveMQ Team
发布时间:January 12, 2015
更新于:2023年5月18日
欢迎来到MQTT基础课程: 本课程共分10部,涵盖MQTT协议的核心特性,概念,优势。在MQTT基础系列课程中,我们会解释MQTT的基础概念,并且为不一样的用户提供MQTT易接入性的参考指导。MQTT是一个开源协议,我们坚信会开源所有关于如何使用MQTT的信息。
第一篇文章是关于学习MQTT协议的入门指南。文章涵盖所有你开始了解MQTT的基础。我们将回顾MQTT协议的核心功能,关键术语,与之相关的定义,它的有趣历史,解答学习MQTT过程中的大多数常见问题。无论你是一个MQTT的新手还是老手,我们的目标是带你更深层次的理解或者重新对这项技术产生期望和兴趣。我们希望这些文章将让你更容易理解并且快速使用MQTT。
首先,我们将探究一些MQTT的基础概念(publish/subcribe, client/broker)和 基础功能(Connect, Publish, Subscrbe)。然后,我们将介绍一些MQTT的特性,如QoS, RetainedMessages, Persistent Session, Last Will and Testament, Keep Alive等等。
这个基础系列课程是不包含安全信息部分的。安全是MQTT协议中非常大的一个主题。事实上,它也是我们已经开发完成的另外一个安全系列课程。
现在,让我们开始基础学习。
MQTT 是什么
关于开启MQTT最好的讨论方式,我们可以引用一段官方规范摘要:
“MQTT是一种客户端服务端 发布/订阅 消息的传输协议。它是一个轻量级的,开放性的,简单化的,并且被设计为容易使用的协议。这些特性使它更适合多种应用场景,包括受限环境,例如机器对机器 (M2M) 和物联网 (IoT) 环境中的通信,少量代码亦或少量的带宽占用都是非常优秀的。” Citation from the official MQTT 3.1.1 specification
当MQTT被描述为“轻量级”,意味它必须被设计为简单,非资源密集型的(即对硬件资源要求不高)。MQTT协议的聚焦点是基于受限的不可靠的网络能正常发送少量数据。对比其他协议,MQTT具有低代码,低开销,低功耗特性。由于它的最小化数据开销,MQTT在传输数据方面,相比HTTP协议更显优势。这也促使MQTT更适于一些对处理单元,内存,电池受限的设备,诸如传感器和其它IoT设备。
MQTT 用二进制消息格式在客户端和服务端之间通信,与其它基于文本格式传输的HTTP协议或SMTP协议正好相反。
MQTT 固定头样例,图片来源于:docs.oasis-open.org/mqtt/mqtt/v…
MQTT使用二进制数据格式是为了减少消息占用体积和提高通信效率。通过使用二进制格式,MQTT协议可以最大化的减少网络数据传输,并且可以减少消息对处理器的占用。这就使得MQTT协议更好的适用于低带宽,低能耗的环境,诸如受限于资源的IoT设备。MQTT可以用于企业级系统,因为企业级系统也需要实时数据传输。
该协议另外一个重要的原因是在客户端非常容易实现。在MQTT开发阶段,容易使用是一个核心关注点,它能完美的适配各种对硬件资源要求高的设备。
MQTT已经大面积应用于Iot,产业IoT, M2M应用领域。
举一些例子:
- 智能家居: MQTT可以在智能房屋中连接多样设备,包括智能恒温器,灯泡,安全摄像头,和其它设备。MQTT可以让用户通过一个移动应用来远程控制这些智能家居设备。
- 工业自动化: MQTT在工厂和其它产业场景中可用于连接机器和传感器。因此可应用于过程中的实时监控和控制,从而提高工作效率减少机器的空置时间。
- 农业: MQTT在未来农业中可用于监测土壤水分含量,天气状况,农作物生长。因此有助于农民优化灌溉和其他农作物管理。
- 健康看护: MQTT可以连接医疗类设备和传感器(比如血糖仪,心率器)用于监测需要被看护者的健康状态,因此对于患者的远程监测,可改善患者的就医结果和减少健康看护成本。
- 运输: MQTT用于联网汽车和其他运输系统,以实现对车辆的实时跟踪和监控。这可以提高安全性并有助于优化交通流量
现在我们已经对MQTT是什么,它的特性有了初步的了解,让我们深入了解一下它的历史,以及它是如何变成一个非常受欢迎的消息协议的。在学习完它的历史渊源后,我们将探索一些MQTT的要素和特征。
MQTT的起源
1999年,IBM的Andy Stanford-Clark 和 Arcom的Arlen Nipper共同研发了MQTT,当通过卫星连接石油管道时,能够使电池功耗和带宽做到最小化。他们还对协议指定了一些要求,包括:
- 可简单实现
- 有服务质量的数据传输
- 轻量且高效的带宽使用
- 对数据无感知
- 具有持续会话能力
这些目标一直是MQTT的核心。因此,协议的首要聚焦从专有的嵌入式系统到开放的Iot用法一直在改变。
在过去的10年里,IBM内部一直在使用这个协议,直到2010年, 他们才发布了royalty-free版本的 MQTT 3.1协议。这种从专有嵌入式系统到开放式IoT的聚焦转变也给看起来为首字母缩写的MQTT造成了混淆。MQTT之前全称为:MQ Telemetry Transport, 其中MQ涉及到了一个MQ系列产品(IMB为支持MQ 遥测传输而研发的产品),MQTT不再是一个首字母缩写的缩略词。它现在是一个简单的协议名字。
当Andy和Arlen在1999年创建这个协议时,他们是在IMB产品之后命名的协议名。尽管很多地方将MQTT标记为一种消息队列协议,但这种描述是不准确的。虽然在特定场景中时,它可能是用于队列消息协议,但MQTT绝不是一种传统消息队列的解决方案。
2011年,IBM 为Eclipse基金会新创建的Paho项目,贡献了MQTT客户端的实现,Eclipse基金会是一个为开源软件项目提供社区服务的独立的非盈利公司。对于MQTT协议来讲,本次事件意义重大,因为它为MQTT创建了一个更有利的生态系统。通过贡献MQTT客户端到开源项目(如Paho),IBM允许开发者接入协议并使用它创建应用程序。此举有助于提高 MQTT在开发者社区中的曝光率和使用率.
2012年,HiveMQ 开始了解MQTT协议,并且同年发布了他们的第一版软件,2013年,HiveMQ 对外公开发布了他们的软件。
MQTT的演变时间线 及 HiveMQ研发的MQTT Broker早期版本
OASIS在MQTT标准化中的角色
2014年,OASIS宣布,它将接手MQTT标准化工作,目标是使其成为一个开放的和供应商中立的协议。作为一个创建于1993年的非营利性组织,OASIS(Oragnizatin for the Advancement of Structured Information Standards)是一个为互联网和相关技术开发开放标准的国际联盟。
它为云计算、安全和IoT等行业开发了许多重要标准,包括 AMQP、 SAML 和 DocBook。标准化过程花了大约一年的时间,在2014年10月29日,MQTT 成为官方批准的 OASIS 标准。
对于MQTT协议能被广泛采用到IoT协议中,OASIS的参与至关重要。作为一个中立的第三方组织,OASIS 为确保该协议是作为一个开放标准来维护的,它允许何人都可以实现该标准且无需许可费用或专利限制。
另外,为了在一起合作改进协议,OASIS为社区提供了一个论坛,这也开启了对 MQTT 5.0 协议的的开发,MQTT协议最新版本具有提高可靠性和可扩展性的新功能。
2019年3月,OASIS 批准了新的 MQTT 5规范。此版本介绍了MQTT的新特性,比如满足IoT应用可以在云平台发布的要求,能提供更多的可靠性,能提供对关键任务消息的错误处理。
探索MQTT: 主题(Topics),订阅(Subscriptions),服务质量(QoS),持久化消息(Persistent Messaging)等等
MQTT 的消息收发模型: 它是如何工作的 && 为什么它对IoT和IIoT很重要
MQTT的消息收发模型基于“主题”和“订阅”。主题:能被发布到和订阅的字符串。 主题是可分层级的,即可以包含由斜杠分隔的多个级别,如下所示的文件路径。
myhome/kitchen/smartdishwasher
订阅:客户端可通过“主题”接收感兴趣的消息
当客户端订阅某个“主题”时,它实际上是告诉服务器它有兴趣接收任何发布的这个“主题”消息。服务器会跟踪订阅的“主题”消息,并将发布的“主题”消息转发给已订阅该“主题”的客户端。
例如:采用了MQTT协议的移动设备打开智能门
注意,一个客户端可以同时订阅多个“主题”,而一个“主题”也可以有多个订阅者。这使得消息传递系统具有灵活性和可伸缩性。
除了“主题”和“订阅”之外,MQTT 还支持通配符,即通过匹配特定模式订阅多个主题。通配符有两种:1.单级通配符(+) ,仅仅匹配一个层级的主题; 2.多级通配符(#) ,匹配指定层级之后的所有层级主题。
总的来说,MQTT 的消息收发模型提供了一种灵活的、可伸缩的方式来发布和订阅消息(基于 “主题” 和 "订阅" 的消息)。通配符的使用增加了额外的灵活性,允许使用单个“订阅”来订阅多个相关主题。
理解 MQTT 的消息收发模型至关重要,但是同样重要还有确保消息可靠传递的服务质量(QoS)级别。
理解IoT应用中的 MQTT QoS级别
MQTT 支持3个级别的QoS: QoS 0, QoS 1, QoS 2。分析一下每个级别:
- QoS 0: 此级别提供“最多一次”传递,消息发送之后是没有确认信息的,可能发生丢失情况。这是 QoS 的最低级别,通常用于可以接受消息丢失或消息不重要的情况。例如,QoS 0可能适合于发送传感器数据,因为偶尔的数据丢失不会显著影响总体结果。
- QoS 1: 此级别提供“至少一次”传递,息发送之后是确认信息的,必要时可以重新发送。对于QoS 1级别消息,发布者将消息发送给服务器,发布者需要等待确认消息的。如果服务器没在规定时间内响应,发布者将重新发送消息。这种 QoS 级别通常用于消息丢失是不可接受的,但消息复制是可以容忍的情况。例如,QoS 1可能适合于将命令消息发送到设备,在这些设备中,错过一个命令可能会产生严重的后果,但重复的命令不会产生严重的后果。
- QoS 2: 这个级别提供“精准一次”的传递,消息发送之后是有确认消息的,并且重发消息也需要订阅者精准的收到一次消息。QoS2是 QoS 的最高级别,通常用于消息丢失或重复完全不可接受的情况。对于 QoS 2,发布者和服务器有一个两步确认过程,其中服务器存储消息,直到消息接收并回复ACK。此级别的 QoS 通常用于关键消息,如金融事务或紧急警报。
注意,较高的 QoS 水平通常需要更多的资源,并可能导致延迟和网络流量增加。因此,根据你的应用特定需求选择适当的 QoS 级别非常重要。
除了服务质量的三个级别之外,MQTT 还支持消息持久性,这可以确保在网络或服务器出现故障时消息不会丢失。
理解MQTT消息持久特性在IoT通信中的可靠性
消息持久性在MQTT中是一个重要的功能。它能确保消息在一个网络事件发生或者服务失败情况下,永不丢失。在MQTT中,消息持久性是通过在服务器上存储消息,直到它们被订阅者收到
MQTT提供了3种类型的消息持久性选项:
- 非持久性: 这是MQTT中的默认选项。此模式下,消息不存储在服务器上,如果服务器或网络失败,消息将丢失。此模式适用于消息不重要且可以容易重产生信息的情况。
- 队列持久性: 这种模式下,消息存储在服务器上,直到订阅者收到消息。如果订阅者无法连接上,则消息将排队等待订阅方重新连接。当订阅者并不总是连接到网络时,或者当订阅者需要接收所有消息时,队列持久性非常有用,即使这些消息是在订阅者脱机时发送的。
- 确认持久性: 此模式提供了最高级别的消息持久性。这种模式下,在确认订阅者收到消息前,消息一直会存储在服务器上。如果没有收到订阅者ACK,则重新发送消息,直到订阅者确认收到。当需要确保消息被订阅者收到并且处理时,此模式非常有用。
为了在MQTT中配置消息持久性,用于处理MQTT连接的服务器软件必须支持所选择的持久性选项。配置可以通过服务器的配置文件或通过其网页入口完成。
注意,消息持久性伴随着性能和存储方面的权衡。消息越持久,服务器需要的存储和处理资源就越多。因此,根据你的应用应该根据自己的需求来选择适当的持久性级别。
MQTT 安全: 保护您的IoT设备免受网络攻击
在安全性方面,MQTT 支持 TLS 加密,用于客户端和服务器之间的安全通信。有几种保护MQTT部署的策略,比如加密通信、实现强身份验证和访问控制等。
MQTT 安全性是一个复杂的主题,超出了本篇文章的范围。如果您正在自己的应用程序中实现MQTT,那么咨询一个安全专家并遵循最佳实践来保护MQTT部署是非常重要的。
总的来说,MQTT 的体系结构、消息收发模型和特性使其成为IoT和M2M应用程序的一个强大而灵活的协议。它的轻量级设计和对QoS级别和消息持久性的支持使其成为受限设备和网络的理想选择。
结论
您现在已经了解到MQTT是一种轻量级和高效的协议,它已经成为IoT和M2M应用程序的最佳选择。通过其简单的发布/订阅消息收发模型,它允许在设备和系统之间进行灵活的通信。MQTT的历史表明,它从IBM对可靠消息传递协议的需求演变为现在由OASIS维护的广泛采用的标准。我们讨论了MQTT的功能和特性,包括其QoS级别和安全性考虑,并探讨了使用MQTT的实际应用程序。这就是我们第1部分的结尾。