MQTT (MQ 遥测传输) 是一种轻量级的开放消息协议,为资源受限的网络客户端提供了一种在低带宽环境中简单地分发遥测信息的方法。这种协议采用发布/订阅通信模式,用于机器到机器(M2M)通信。
为了适应带宽和CPU限制而设计的低开销协议,MQTT旨在运行在嵌入式环境中,提供可靠、有效的通信路径。适用于与小型代码占用的设备连接的MQTT,是无线网络的好选择,这些网络因偶尔的带宽限制或不可靠的连接而经常出现不同程度的延迟。该协议在从汽车到能源到电信的各个行业都有应用。
尽管MQTT开始作为一个专有协议用于与石油和天然气行业的监控控制和数据采集(SCADA)系统通信,但它已经在智能设备领域流行起来,如今是连接物联网(IoT)和工业物联网(IIoT)设备的领先开源协议。
虽然MQTT中的TT代表遥测传输,但MQ指的是一个名为IBM MQ的产品。尽管MQTT有时被解释为消息队列遥测传输,但在MQTT通信中没有消息队列。
MQTT是如何工作的?
为了最大化可用的带宽,MQTT的发布/订阅(pub/sub)通信模型是传统的客户端-服务器架构的替代方案,与端点直接通信。与此相反,在pub/sub模型中,发送消息的客户端(发布者)与接收消息的客户端或客户端(订阅者)是解耦的。因为发布者和订阅者之间没有直接联系,所以第三方——代理——负责他们之间的连接。
MQTT客户端包括发布者和订阅者,这些术语指的是客户端是发布消息还是订阅接收消息。这两个功能可以在同一个MQTT客户端中实现。当一个设备(或客户端)想要向服务器(或代理)发送数据时,称为发布。当操作反转时,称为订阅。根据pub/sub模型,多个客户端可以连接到代理并订阅他们感兴趣的主题。
如果订阅客户端到代理的连接断开,那么代理将缓冲消息并在订阅者在线时将其推出。如果从发布客户端到代理的连接在没有通知的情况下断开,则代理可以关闭连接并发送订阅者一个缓存的消息,其中包含来自发布者的指令。
IBM的一篇写作描述了pub/sub模型:“发布者发送消息,订阅者接收他们感兴趣的消息,代理将消息从发布者传递给订阅者。发布者和订阅者是MQTT客户端,只与MQTT代理通信。MQTT客户端可以是任何设备或应用程序(从Arduino这样的微控制器到托管在云中的完整应用服务器),只要它运行一个MQTT库。”
什么是MQTT代理?
MQTT代理充当发送消息的客户端和接收这些消息的订阅者之间的中间人。在邮局的类比中,代理是邮局本身。所有消息都必须通过代理才能传送给订阅者。
代理可能需要处理数
百万个同时连接的MQTT客户端,因此在选择MQTT代理时,企业应根据其可扩展性、集成性、监控和抗故障能力来评估它们。
MQTT消息的类型
MQTT会话分为四个阶段:连接、认证、通信和终止。客户端首先创建一个到代理的传输控制协议/互联网协议(TCP/IP)连接,使用标准端口或由代理的运营商定义的自定义端口。创建连接时,重要的是要认识到,如果提供了重用的客户端身份,服务器可能会继续旧会话。
标准端口是1883,用于非加密通信,和8883,用于加密通信 - 使用安全套接字层(SSL)/传输层安全性(TLS)。在SSL/TLS握手期间,客户端验证服务器证书并认证服务器。客户端还可以在握手过程中向代理提供一个客户端证书。代理可以使用这个来认证客户端。虽然这不是MQTT规范的明确部分,但代理支持用SSL/TLS客户端证书进行客户端认证已经成为惯例。
因为MQTT协议的目标是成为资源受限和IoT设备的协议,所以SSL/TLS可能不总是一个选项,而在某些情况下可能不被期望。在这种情况下,认证以明文用户名和密码的形式呈现,这些由客户端发送到服务器——这是作为CONNECT/CONNACK数据包序列的一部分。此外,一些代理,尤其是在互联网上发布的公开代理,将接受匿名客户端。在这种情况下,用户名和密码简单地留空。
由于MQTT协议被认为是一个轻量级协议,因为它的所有消息都有一个小的代码占用。每个消息由固定头部组成 - 2字节 - 一个可选的变量头部,一个消息负载,限制为256 MB的信息,和一个服务质量(QoS)级别。
在通信阶段,客户端可以执行发布、订阅、取消订阅和ping操作。发布操作发送一个二进制数据块 - 内容 - 到由发布者定义的主题。
MQTT支持最大256 MB大小的消息二进制大对象(BLOB)。内容的格式将是特定于应用程序的。主题订阅使用SUBSCRIBE/SUBACK数据包对进行,而取消订阅类似地使用UNSUBSCRIBE/UNSUBACK数据包对进行。
主题字符串使用特殊的分隔符字符,正斜杠(/),形成一个自然的主题树。客户端可以使用特殊的通配符字符订阅(和取消订阅)主题树中的整个分支。有两个通配符字符:单级通配符字符,加号字符(+);和多级通配符字符,井号字符(#)。一个特殊的主题字符,美元字符($),从任何根通配符订阅中排除一个主题。通常,$用于传输服务器特定或系统消息。
客户端在通信阶段可以执行的另一个操作是使用PINGREQ/PINGRESP数据包序列ping代理服务器。这个数据包序列大致翻译为ARE YOU ALIVE/YES I AM ALIVE。此操作除了保持活动连接并确保TCP连接没有被网关或路由器关闭外,没有其他功能。
当发布者或订阅者想要终止一个MQTT会话时,它向代理发送一个DISCONNECT消息,然后关闭连接。这被称为优雅的关闭,因为它给予客户端能够通过
提供其客户端身份轻松地重新连接并从中断的地方继续。
如果断开连接突然发生,没有时间让发布者发送一个DISCONNECT消息,代理可能会发送代理之前缓存的来自发布者的消息给订阅者。这条消息,被称为最后的遗嘱和遗言,为订阅者提供了如果发布者意外死亡应该做什么的指示。
MQTT的优势是什么?
MQTT协议架构的轻量级特性和最小的开销有助于确保在低带宽下的顺畅数据传输,并减少对CPU和RAM的负载。与竞争协议相比,MQTT的优势包括:
- 由于是轻量级协议,因此数据传输高效且易于实施;
- 由于数据包最小化,网络使用率低;
- 数据分发高效;
- 远程感测和控制的成功实施;
- 快速、高效的消息传递;
- 使用的电力少,对于连接的设备来说很好;
- 优化网络带宽。
MQTT的缺点是什么?
MQTT可能的缺点包括:
- 与Constrained Application Protocol (CoAP)相比,MQTT的传输周期较慢。
- MQTT的资源发现基于灵活的主题订阅,而CoAP使用稳定的资源发现系统。
- MQTT是未加密的。相反,它使用TLS/SSL (传输层安全/安全套接字层)进行安全加密。
- 创建全球可扩展的MQTT网络困难。
- 其他MQTT的挑战与安全性、互操作性和认证有关。
因为MQTT协议并没有考虑到安全性,所以该协议传统上被用于为特定应用目的在安全的后端网络中使用。MQTT的主题结构可以轻松形成一个巨大的树,没有明确的方法将树划分为可以联合的较小的逻辑域。由于主题树的大小增长,复杂性也增加,这使得创建一个全球可扩展的MQTT网络变得困难。
MQTT缺乏互操作性是其另一个负面方面。因为消息负载是二进制的,没有关于它们如何编码的信息,所以问题可能会出现——尤其是在不同制造商的不同应用应该无缝工作的开放架构中。
正如前面提到的,MQTT内置的认证特性最小。用户名和密码以明文发送,MQTT的任何形式的安全使用都必须采用SSL/TLS,不幸的是,这不是一个轻量级的协议。
使用客户端证书进行客户端认证不是一个简单的过程,在MQTT中没有方法来控制谁拥有一个主题以及谁可以在其上发布信息,除非使用专有的、非带外手段。这使得容易将有害的消息注入到网络中,无论是故意的还是错误的。
此外,消息接收者无法知道原始消息是谁发送的,除非该信息包含在实际消息中。必须在MQTT之上以专有的方式实现的安全特性增加了代码占用,并使实现变得更加困难。
MQTT协议的应用和用例
由于其轻量级特性,MQTT非常适合涉及远程监控的应用,包括以下内容:
- 同步传感器,如火灾探测器或用于盗窃检测的运动传感器,以确定危险是否有效;
- 使用传感器监测离开医院的病人的健康参数;
- 传感器提醒人们危险。
另一个应用是一个基于文本的消息应用,用于实时通信,利用MQTT的低数据和能源使用。例如,Facebook使用MQTT作为其Messenger应用,不仅因为该协议在手机到手机消息中节省电池
电量,而且因为该协议使消息在几毫秒内高效地传递,尽管全球范围内的互联网连接不稳定。
主要云服务提供商对MQTT的支持
大多数主要的云服务提供商,包括亚马逊网络服务(AWS)、谷歌云、IBM云和微软Azure,都支持MQTT。
MQTT非常适合使用M2M和物联网(IoT)设备的应用,例如在智能家居、医疗保健、物流、工业和制造环境中进行实时分析、预防性维护和监控。
MQTT在物联网中如何应用?
因为MQTT客户端很小,所以它们只需要很少的资源,因此可以在小的微控制器上使用,这是MQTT.org的观点。为了优化网络带宽,MQTT头部很小。此外,根据该组织的说法,MQTT“可以扩展到与数百万的IoT设备连接”。
因此,MQTT是物联网(IoT)和工业物联网(IIoT)基础设施中最常用的协议之一——例如,公用事业行业可以有效地在其服务、客户和设备之间传输数据。
MQTT在IoT或IIoT基础设施中的应用示例包括:
- 智能计量:MQTT协议可以用于传输数据,通过保证消息传送来实时提供准确的表读数。这有助于使计费更加准确。
- 收集环境传感器数据:在远程环境中使用的传感器通常是低功耗设备,因此MQTT非常适合于具有较低优先级数据传输需求的IoT传感器构建。
- 机器健康数据:Ably,一个提供发布/订阅消息平台的公司,举了一个风力涡轮机需要“在信息到达数据中心之前就确保将机器健康数据传送给当地团队”的例子。
- 计费系统:MQTT有助于消除计费或开票中的重复或丢失的消息包。
无论是用于智能计量、快速停电响应还是其他IoT和IIoT应用,MQTT使资源受限的IoT设备能够发送或发布关于特定主题的信息到一个充当MQTT消息代理的服务器。然后,代理将信息推送给那些之前已经订阅了该主题的客户端。
对于人类来说,主题看起来像一个分层的文件路径。客户端可以订阅主题层次结构的特定级别,或使用通配符字符订阅多个级别。客户端可以是场地上的IoT传感器,也可以是数据中心中处理IoT数据的应用。
例如,Carriots、Evrythng和ThingWorx物联网平台支持MQTT协议。
与MQTT竞争的协议
与MQTT竞争的其他传输协议包括:
- 受限应用协议(CoAP):它非常适合IoT,使用请求/响应通信模式。
- 高级消息队列协议(AMQP):与MQTT一样,它使用发布/订阅通信模式。
- 简单/流文本定向消息协议(STOMP):这是一个基于文本的协议。但是,STOMP不处理队列和主题;它使用带有目标字符串的发送语义。
- Mosquitto:它是一个开源的MQTT代理。
- 简单媒体控制协议(SMCP):用于嵌入式环境中的CoAP堆栈,基于C。
- **SSI(简单传感器接口)**:这是一种用于计算机和传感器之间数据传输的通信协议。
- 数据分发服务(DDS):对于实时系统,它是一个中间件标准,可以直接在嵌入式系统中实时发布或订阅通信。
服务质量等级
QoS指的是消息的发送者和消息的接收者之间的协议。它作为MQTT的一个关键特性,使客户端能够选择三个服务级别中的一个。
这三种不同的QoS级别决定了内容如何由MQTT协议管理。尽管更高级别的QoS更可靠,但它们的延迟和带宽要求更高,所以订阅客户端可以指定他们希望接收的最高QoS级别。
MQTT的服务质量(QoS)级别
最简单的QoS级别是未确认服务。此QoS级别使用PUBLISH数据包序列;发布者将消息发送给代理一次,代理再将消息传递给订阅者一次。没有确保消息正确接收的机制,代理也不保存消息。此QoS级别也可能被称为最多一次、QoS0或发射并忘记。
第二个QoS级别是确认服务。此QoS级别使用发布者和其代理之间以及代理和订阅者之间的PUBLISH/PUBACK数据包序列。确认数据包验证内容已被接收,如果未及时收到确认,则重试机制会再次发送原始内容。这可能导致订阅者收到同一消息的多个副本。此QoS级别也可能被称为至少一次或QoS1。
第三个QoS级别是确保服务。此QoS级别使用两对数据包传递消息。第一对称为PUBLISH/PUBREC,第二对称为PUBREL/PUBCOMP。这两对确保,无论重试次数如何,消息只会被传递一次。此QoS级别也可能被称为仅一次或QoS2。
MQTT协议的版本和历史
MQTT是由IBM的Dr. Andy Stanford-Clark和Arcom的Arlen Nipper于1999年创建的,现在是Eurotech。MQTT被创建为一种经济高效且可靠的方法,用于将石油和天然气行业中使用的监控设备连接到远程企业服务器。当面临在沙漠中的管道传感器与离站SCADA系统之间推送数据的挑战时,他们决定采用基于TCP/IP的发布/订阅拓扑结构,该结构是事件驱动的,以降低卫星链路传输成本。
尽管MQTT仍与IBM紧密关联,但现在它是一个开放的协议,由组织OASIS监督。
尽管名字如此,MQTT并不是原始IBM MQSeries的一部分;但从7.1版本开始,它可以在WebSphere MQ中使用。MQTT之前被称为SCADA协议、MQ Integrator SCADA Device Protocol (MQIsdp)和WebSphere MQTT (WMQTT),尽管所有这些变体都已不再使用。
MQTT根据特定版本有不同的规范。版本5.0取代了MQTT的最后一个版本3.1.1。OASIS定义的一些新规范包括:
- 使用发布/订阅消息模式;
- 当发生异常断开时,可以通知用户的机制;
- 三个消息传递级别:最多一次、至少一次和仅一次;
- 减少传输开销和协议交换以减少网络流量;
- 对有效负载内容的不可知消息传输。
进一步的规范可以在OASIS的官网上找到。
MQTT的更新
MQTT在2015年10月28日正式被批准为OASIS标准。在2016年1月底,它被接受为国际标准化组织(ISO)标准。该协议持续改进,现在支持WebSocket,这是另一个协议,允许客户端和代理实时进行双向通信。后来,著名的版本包括v3.1.1标准和v5.0标准,两者都被批准为OASIS标准。作为其更新的一些例子,版本5.0包括了更好的错误报告、在消息头中包括元数据、共享订阅、消息和会话到期以及主题别名。
您必须登录才能发表评论。