什么是MQTT?您需要了解的一切
介绍
无论应用程序类型如何,两点之间的无缝信息交换都是关键的操作步骤。物联网或物联网应用程序开发正在兴起,并且离不开这一关键要求。这就是消息队列遥测协议发挥作用的地方。
它通常被称为 MQTT,是一种可靠的消息传递协议,可顺利推进 IoT 解决方案的对话。在本文中,我们将帮助您掌握与其相关的所有信息。
MQTT 是什么?它有什么用途?
MQTT 是一种广泛使用的消息传递标准,使发布者与订阅者之间的机器对机器通信成为可能。使用 MQTT 时,最终用户的设备和程序不会直接与服务器通信。相反,他们必须订阅代理发布的内容帮助。
大多数通信都是借助 IP 完成的。有时,需要不同的双向方式来协助。由于它是 OASIS 标准,因此 OASIS MQTT 技术委员会负责其规范管理任务。
由于其无与伦比的灵活性和实用性,它成为了物联网设备的标准通信方式。它获得了相当大的声誉,因为即使系统或网络的 CPU 和带宽受到限制,它也可以无缝运行。
由于该协议可以有效处理延迟,MQTT 在无线网络通信中得到广泛应用。它覆盖范围广泛,涵盖医疗保健、汽车和其他使用物联网应用的领域。
MQTT 历史
Andy Standford Clark 和 Arlen Nipper 是 MQTT 协议的发明者。该协议于 1999 年发明。MQTT 的首次使用记录是使用 SCADA 构建的石油管道监控解决方案。
由于控制系统是通过卫星连接的,因此该公司需要一种轻量级且节能的产品来完成这项工作。当 3.1 版发布时,IBM 将其称为 MQ Telemetry Transport。
当IBM于2013年向OASIS提交v3.1时,MQTT才成为标准名称。其3.1.1版本于2014年问世。
v5 于 2019 年问世。这个最新版本包含原因代码、消息过期和订阅共享等功能。尽管 MQTT 权利保留给 IBM,但它现在是一个开源资源。
MQTT 协议的特点
在现有的消息传递协议中,MQTT 被认为最适合物联网,因为它具有某些特性,使其非常适合物联网。这些独特的功能如下:
- 轻松出行
MQTT 易于使用,可部署在服务端。它提供无数可立即使用的预构建代理和客户端。这种专业构建的消息传递协议可大大缩短应用程序开发时间,使新手开发人员也能完成这项工作。
- 可靠的连接
使用无线电连接实现的连接并不总是可靠的。遗憾的是,大多数 IoT 设备仅以类似的方式传输数据。
MQTT 通过提供内置 QoS 功能来减少连接问题,该功能将消息排队,将其保存在 MQTT 代理中,并让它们等待,直到目标设备准备好接受它。这降低了消息错位的几率,因此消息注定会到达目的地。
- 它鼓励全方位的信息传递
借助 MQTT,消息传递变得无比便捷,因为传输可以在任何设备上进行,传输量可想而知。任何 IoT 解决方案都可以在无限长的时间内讨论某个主题。
- 扩大信息范围
开发人员可以根据需要扩展消息。无论您需要在一百万台设备还是一百台设备上广播消息,在任何情况下都可以轻松完成任务。
MQTT 如何工作?
MQTT 操作与传统的客户端-服务器模型完全相反,后者是直接进行通信。在 MQTT 模型中,通信是通过 PUSH/SUBSCRIBE 拓扑间接进行的。
客户端(例如 MQTT Explorer)连接到相关发布者,向其传输消息。现在,这些共享数据与发送者(即客户端)分离,并传递到下一阶段。
该流程中的代理接收此解耦的数据并将其转发给订阅者。
由于 MQTT 允许大量订阅者和发布者与经纪人携手合作。这样,他们就可以获得与有趣主题相关的消息。
如果代理与订阅者之间的连接出现中断,消息将保存在代理端,并在连接恢复时再次转发。但是,对于发布者而言,如果代理的连接在没有通知的情况下丢失,它会自行将消息缓存到相关订阅者。
MQTT 是事件驱动的,不支持连续数据传输,而是保持控制。只有在真正需要时才会传输数据。
MQTT 代理
MQTT 的运作主要基于 MQTT 代理,它是云端部署的计算机操作软件的前提。它可以由第三方运营,也可以自营。其实现可以是专有的,也可以是开源的。
一般来说,它扮演着 MQTT 邮局的角色,因为该协议不需要目标收件人的帮助来传递消息。它代替接收者的地址,将主题付诸行动。如果需要消息副本,目标用户必须订阅该主题。单个代理可以接收各种客户端发送的消息,就像各种发布者可以在中央订阅者上发布主题一样。
MQTT 代理负责使应用程序和设备结构更加安全和解耦。这是因为 MQTT 为用户名和连接启用了TLS加密。
代理能够将数据累积为保留消息并保留所有会话的记录。它在系统中的引入非常有用,因为它可以轻松消除客户端连接中的不安全性和漏洞,使消息扩展更容易,并减轻网络负担。
MQTT 会话的四个阶段
每个 MQTT 会话生命周期都有四个阶段,下面简要说明:
- 联系
此阶段在 MQTT 客户端代理建立 TCP/IP 连接时启动。如操作员所解释的那样,该任务使用标准或自定义端口完成。在此会话阶段要记住的关键点是确保没有旧会话在 TCP/IP 上运行。在这种情况下,连接将受到极大干扰。
- 验证
在完成连接之前,客户端使用 1883 或 883 端口验证服务器证书的真实性并批准。为此,客户端向验证服务器证书详细信息的代理提供 SSL/TLS 证书详细信息。
如果未提供 SSL/TLS 作为服务器证书,则通过以纯文本形式发送的用户凭据来验证用户或身份验证。如果开源代理接受匿名客户端,则用户名和密码部分不提供任何输入。
- 沟通
身份验证完成后,MQTT 会话将进入通信阶段,允许客户端订阅和 ping,以及发布消息/操作。在此阶段,发布者共享二进制数据块。数据块指的是发布者解释的主题。MQTT 最多可以传输 256 MB 的消息数据。
- 终止
最后,当任何人(订阅者或发布者)想要结束正在进行的 MQTT 会话时,就会发生终止。
断开连接消息从请求方发出,接收方(即代理)处理请求。由于代理已获悉会话终止,因此这被称为正常关闭。有时,终止是突然进行的,代理会将缓存的信息发送给相关订阅者。
MQTT 服务质量
使用 MQTT 可确保每个阶段消息传递的质量,因为它提供 QoS 功能。借助此功能,开发人员可以保证通信质量。各种 QoS 阶段或级别如下:
- QoS -1
MQTT 的负一阶段因其工作方式和性质而被称为“发射后不管”。此 QoS 级别适用于不优先考虑目标消息传递的应用程序。代理不会关心消息是否到达其理想目的地。由于没有建立用于准确传递的硬连接,因此功耗较低。它主要用于非关键应用程序。
主要特点
- 适用于使用MQTT-SN的设备
- 无需 MQTT 连接
- 消息发送者无法将其撤回
- 当消息到达代理并被其接收时,其 QoS 变为 0。
关键用例
- 将其用于低功耗物联网应用
- 当目标是降低信息传递成本时
2. QoS 0
此 QoS 仅用于将消息传递到特定目的地一次。成功后,它会直接停止。它仅在存在 MQTT 连接的情况下运行。这意味着它不是那么节能。
主要特点
- 它尽最大努力确保准确传递相关信息
- 传递信息后不要等待回应
- 发送者无法将其撤回
- 断开连接时,代理不会将消息排队
- QoS-1 效率较低
使用案例
- 适用于功率受限的物联网应用
3. QoS 1
QoS 1 是最后一个 QoS 级别,用于传递时间敏感型消息。它通过存储和排队消息来实现,直到订阅者完全准备好接收消息。
主要特点
- 至少确认一次文本/数据已成功发送(通过发送确认或类似信息)
- 发送方会保留该消息,只有当它请求收件人发出 PUBACK 命令时才继续执行下一步操作。
- 允许交换和传递相同的消息两次或更多次。
MQTT 用例
MQTT 的最佳用例是开发用于远程监控的应用程序。由于它很轻量,因此可以轻松与卫星通信。它可用于警告人们注意危险、火灾探测器、盗窃检测或在场所内或场所外跟踪目的等目的。
除此之外,MQTT协议适合开发基于文本的消息应用程序,支持实时通信。
这样的应用程序可以最大限度地利用 MQTT 的能源和数据效率特性。
使用 MQTT 开发的应用程序的真实示例之一是 Facebook Messenger。MQTT 是它轻量级、不消耗太多手机电量并快速传递消息的原因。
使用 M2M 开发的物联网应用也是 MQTT 的理想用例。与物流、智能家居、实时监控和医疗保健行业相关的应用都可以使用 MQTT 构建。
在物联网中使用 MQTT
物联网是 MQTT 消耗最多的地方,因为它需要的资源最少,并且能够在微控制器上无缝运行。物联网设备在互联网上运行,需要与网络保持持续连接。由于 MQTT 标头很小,因此可以优化网络带宽。
它可以根据需要随时扩展。它可以一次性连接一百万台设备,而无需任何额外资源。
以下是 MQTT 在物联网中的一些主要用例:
- 因为 MQTT 保证传递消息。它支持准确、快速的仪表读数,从而实现实时精确计费。用于远程监控的 IoT 应用程序在节能传感器上运行。由于 MQTT 对数据广播的要求较低,因此它是 IoT 远程传感器应用程序的最佳选择。
- MQTT 广泛应用于需要健康且有保障的机器数据传输的应用中。例如,Ably 声称使用 MQTT 开发了一款风力涡轮机,该涡轮机与当地团队共享有关涡轮机运行精度的精确数据。这些数据在到达数据中心之前进行交换。
- 涉及计费/发票的物联网设备能够减少数据重复和错放的可能性,因为代理可以确保消息到达目的地。
- 无论目的如何,物联网中的 MQTT 促进资源有限的物联网设备中的持续信息共享、发布和信息交换。
MQTT 的优点和缺点
部署 MQTT 协议进行物联网设备通信可带来多种好处,例如:
- 顺畅沟通
由于 MQTT 为特定主题提供了统一的通信连接,因此确保持续通信变得简单。无论来自哪个源的消息来自特定主题,它们都将集中在一个中心位置。消息交换的复杂性很大程度上归因于逻辑结构化的数据。数据基础设施没有混乱,设计灵活。
- 避免轮询
为了充分交换信息,每次向消息添加新信息时,消息消费者都必须进行轮询。这既耗时又加重了网络负担。MQTT 的引入减少了轮询需求,因为它支持基于推送的传递。此外,传递速度很快。因此,交换过程很快。
- 轻松的服务发现
使用 MQTT,服务发现是一项无缝且无错误的工作,因为发布者将负责发布与特定主题相关的消息。其他消息传递标准则不是这样,因为它们首先创建要传输的消息名册,然后处理消息。这很耗时,而且出错的可能性更高。
- 消息自定义
使用 MQTT 会更容易,因为它允许开发人员改变通信模式,而不会产生变化的后果波动。
尽管有这些优点,MQTT 仍不能称得上完美,因为还存在一些缺点:
- MQTT 的传输周期较慢,使数据传输时间略长。因此,它创建了一个可扩展的网络,而在全球范围内运行该网络是一项艰巨的任务。维护每个代理的身份验证和互操作性需要付出艰苦的努力。
- 它不是支持视频流的协议。虽然提供了 TLS 加密,但之后必须构建安全层。
- MQTT 的设计并未全心全意关注安全性。这就是为什么它的安全性并不令人印象深刻的原因。它具有有限的身份验证功能,仅适用于密码和用户名,同时以纯文本形式共享。如果添加 SSL/TLS 来增强其安全性,那么通信就会变得负担过重。
MQTT 安全吗?
一般来说,MQTT 是一种安全协议。但是,如果实施不当,它可能会面临严重的安全问题。如果这里留有任何漏洞,那么整个物联网应用程序的安全性都会受到损害。Avast 最近的一项研究表明,超过 49,000 个 MQTT 服务器可供所有人访问。其中,32,000 个 MQTT 服务器没有密码保护,这是最糟糕的情况。所有这些服务器上保存的数据都面临很高的安全风险。
众所周知,在 API 级别实施的安全措施能带来最佳保护。因此,必须采用可行的安全措施。然而,这是一项繁琐的工作,因为物联网应用程序开发需要数百万个 API。
Wallarm 是一个不错的选择,因为这个API 安全平台提供多层 API 安全解决方案,适用于各种云环境。它将帮助您避免 MQTT 消息带来的 OWASP 10 安全风险,并帮助您保护最终应用程序的安全。
该平台采用强大的 API 测试实践,帮助开发人员在早期阶段发现API 安全漏洞并尽可能减少损害。
就 MQTT 服务器安全性而言,访问控制、用户名和密码保护足以完成任务。此外,服务器实施应在DMZ中完成,防火墙应放置在服务器前面。
由于 MQTT 在 TCP/IP 上运行,如果这两个资源没有得到保护,MQTT 安全性就只是半成品。在 TCP/IP 上实施 SSL/TLS 可以解决此问题。但是,它会使原本轻量级的通信变得有点沉重。