MQTT官方文档的定义是:MQTT是一个基于客户端、服务端的发布/订阅消息传输协议。它的特点包括轻量级、开放、简单,如此设计是为了方便应用。这些特性使之成为很多应用场景的理想选择,包括很多受限环境,比如机器之间(Machine to Machine, M2M)通信、需要一小段脚本空间的IoT内容和网络带宽很昂贵的场景。
MQTT的一个特点“轻量级”,意味着它在被设计时,简单、高效并且不是资源密集型的。MQTT被设计时,重点关注在不稳定、带宽有限的网络上发送小量数据。和其他协议相比,MQTT拥有更少的代码量、开销低、功耗低。由于其最小的数据包开销,与HTTP相比,MQT在通过网络传输数据时表现出色。这也使之非常适合用于处理能力、内存和电池寿命有限的设备,比如传感器和其他IoT设备。
MQTT使用二进制消息格式在客户端和代理之间通信,这和其他以文本格式为基础的协议形成鲜明对比,比如HTTP或SMTP。
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
byte 1 |
MQTT Control Packet type |
Flags specific to each MQTT Control Packet type |
||||||
byte 2… |
Remaining Length |
MQTT Version 3.1.1 (oasis-open.org)
MQTT之所以使用二进制格式,是为了减小消息的大小,并增加通信的效率。通过使用二进制,可以将需要传输的数据最小化并降低消息处理所需的功耗。这使MQTT刚好适用于低带宽或低功耗场景,比如资源有限的IoT设备。同样被用在需要实时数据传输的企业系统中。
另一个重要的方面就是该协议在客户端非常容易实现。易用性是MQTT在发展过程中的一个关键方面,使其非常适合资源有限的受限设备。
MQTT在IoT、工业IoT(IIoT)和M2M应用中使用非常广泛。比如:
现在我们对MQTT及其特点有了一个基本的了解,接下来让我们对其进行深入的了解,看其如何发展成为流行的通信协议。当我们对其发展历程有一个了解之后,会对MQTT的各方面及特点有更好的认识。
1999年,当通过卫星连接输油管道时,为了能够最小化电量流失和带宽使用,IBM的Andy Stanford-Clark和Arcom的Arlen Nipper开发了MQTT协议,他们为该协议定义了几个要点,包括:
这些目标依旧是MQTT的核心。但是,协议的重点已从原来的嵌入式系统变了开发的IoT应用场景。
在之后的10年间,IBM一直在内部使用该协议,直到2010年,他们发布了MQTT3.1作为免费版本。重点从专有的嵌入式系统到开放的IoT应用,使人们对MQTT这个简称开始产生疑惑。起初它代表MQ Telemetry Transport,其中MQ代表IBM开发的用来支持MQ telemetry transport的一系列产品,MQTT并不是简称。但现在它简单的只是该协议的名称。
当Andy Stanford-Clark和Arcom的Arlen Nipper在1999年创建这个协议时,他们以IBM产品命名。虽然许多资源将MQTT打上消息队列协议的标签,这并不完全准确。虽然在某些场景中可以作为消息队列,MQTT并不是一个传统的消息队列解决方案。
2011年,IBM将MQTT的客户端实现贡献给了Eclipse基金会新建的Paho项目,一个独立的、非营利性的向社会提供开源软件的组织。这对该协议是一个有意义的发展,因为这将为MQTT创造更多生态系统。通过将MQTT客户端实现贡献给一个像Paho的开源项目,IBM允许开发者接入该协议,在其上构建他们自己的应用。这一步有助于提高MQTT在开发者社区的知名度和采用率。
2014年,OASIS宣布将接管MQTT的标准化,目标是建立一个开放、中立的协议。创建于1993年,作为一个非营利的组织,OASIS(Organization for the Advancement of Structured Information Standards)是一个国际性组织,为互联网和相关技术开发开放标准。
它已经为工业开发了很多重要的标准,比如云计算、安全和IoT,包括AMQP、SAML、DocBook。MQTT的标准化进行了一年时间,在2014年12月29日,MQTT成为被OASIS承认的官方标准。
OASIS参与MQTT,对其作为广泛采用的物联网协议的成功至关重要。作为一个中立、第三方的组织,OASIS确保该协议作为一个开放的标准被维护起来,任何人都可以实现它,而无需授权费用,没有专有的限制。
另外,OASIS为社会提供了一个论坛,能够让大家聚在一起,合作改进该协议,进而发展出了MQTT5,该协议的最新版本,提供了一些新的功能改进协议的稳定性和扩展性。
2019年3月,OASIS批准了新的MQTT 5规范。此版本为MQTT引入了部署在云平台上的物联网应用程序所需的新功能,以及实现关键任务消息传递需要更多可靠性和错误处理的案例
MQTT的消息模型基于主题和订阅。主题是供订阅和发布消息的字符串。主题是分层的,可以包含以斜杠分割的多个层级,类似一个文件路径,如:
myhome/kitchen/smartdishwasher
订阅是用来指定客户端感兴趣的主题来接收信息。
当客户端订阅一个主题,实际是告诉代理它有兴趣的接收该主题发布的消息。然后代理会跟踪这个订阅,推送发布到该主题的任何消息到这个客户端。
要注意的是一个客户端可以同时订阅多个主题,一个主题可以有多个订阅者。这样就是一个灵活、可扩展的消息系统。
除了主题和订阅,MQTT也支持通配符,可用于订阅与特定模式匹配的多个主题。两类通配符,一类是单层级的+
,在一个主题中匹配一个层级,另一类是代表多层级的#
,在一个主题中匹配其后的所有层级。
总之,MQTT的消息模型通过主题和订阅提供了一个灵活、可扩展的方式来发布和订阅消息。通配符的使用增加了额外的灵活性,允许通过一个订阅来订阅多个相关的主题。
理解MQTT的消息模型非常关键,同样关键的还有服务质量(QoS)等级,用来保证消息传输的可靠性。
MQTT支持有三个QoS等级:QoS 0,QoS 1,QoS 2:
需要注意的是越高的QoS等级,通常需要更多的资源,可能会导致延迟和网络流量增加。所以,要结合你自己应用的需要选择合适的QoS等级。
除了三个等级的QoS,MQTT同样支持消息持久化,确保在网络或服务器出问题时,消息不会丢失。
消息持久化是MQTT的一个重要功能,确保在网络或服务器出问题时,消息不会丢失。在MQTT中,消息持久化是通过将消息存储到服务器上,直到被发送到订阅者。
MQTT提供三种消息持久化选择:
在MQTT中为了配置消息持久化,用来做代理的处理MQTT连接的软件必须支持选择持久化选项,可以通过配置文件或接口进行配置。
需要注意的是,消息持久化需要在性能和存储方面进行权衡。持久化的消息越多,代理就需要越多的存储和处理资源。所以,根据应用的需要选择合适的持久化等级很重要
对于安全,MQTT支持TLS加密来确保客户端和服务端的通信安全。有几种策略可以保护MQTT部署,比如加密通信,实施强身份验证和访问控制等。
MQTT安全是一个复杂的主题,这里不再详谈。如果你在自己的应用中使用了MQTT,咨询一个安全专家非常重要,遵守最佳实践来确保MQTT安全实施。
现在知道 MQTT 是一种轻量级且高效的协议,已成为IoT和 M2M 应用的热门选择。凭借其简单的发布/订阅消息传递模型,它允许设备和系统之间的灵活通信。MQTT 的历史表明,它从 IBM 对可靠消息传递协议的需求演变为现在由 OASIS 维护的广泛采用的标准。上面已经介绍了 MQTT 的功能和特性,包括其 QoS 级别和安全注意事项,并探讨了使用 MQTT 的实际应用。后续将介绍 “MQTT 的发布和订阅模式”。