MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于 TCP/IP 协议上,由 IBM 在1999年发布,现已是用于物联网 (IoT) 的 OASIS 标准消息传递协议。MQTT 最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。
MQTT 协议是轻量、简单、开放和易于实现的,这些特点使其在物联网、小型设备、移动应用等方面有较广泛的应用。MQTT 协议运行在传输控制协议/互联网协议 (TCP/IP) 堆栈之上,提供有序、无损、双向连接。MQTT 协议在处理网络连接不稳定、带宽有限的环境中有较强的适应性,常被用于智能家居、医疗设备、卫星通信等场景中。
为什么选MQTT?
MQTT 协议具有以下特点:
- 轻量且高效:MQTT 客户端的代码量非常小,对系统资源的需求也较低,因此非常适合在小型微控制器上使用。此外,MQTT 消息的头部字段较小,使得网络带宽得到优化,进一步提高传输效率。
- 支持双向通信:MQTT 协议支持设备到云端以及云端到设备之间的消息传递。这使得向大量设备广播消息变得相对简单。
- 可扩展性:MQTT 协议可以扩展以连接数百万个物联网设备,满足大规模设备部署和数据采集的需求。
- 可靠的消息传递:对于许多物联网应用来说,消息传递的可靠性至关重要。MQTT 协议为此提供了三个定义的服务质量级别:最多一次(QoS 0)、至少一次(QoS 1)和恰好一次(QoS 2),以满足不同场景下对消息传递可靠性的需求。
- 支持不可靠网络:许多物联网设备通过移动蜂窝网络进行连接,这种网络环境通常是不稳定的。然而,MQTT 协议通过持久会话的设计,减少了客户端与代理之间重新建立连接的时间和通信延迟,从而在不可靠网络环境下提供了较为可靠的消息传输。
- 安全:MQTT 协议可以轻松使用 TLS(传输层安全协议)对传输的消息进行加密,并支持 OAuth 等现代身份验证协议对客户端进行身份验证,确保了消息传输的安全性和客户端身份的合法性。
常见名词术语解释
1.MQTT Broker
MQTT Broker 是消息中间件,它负责接收发布者发送的消息,并根据订阅者订阅的主题将消息转发给订阅者。它管理客户端连接、处理订阅和退订,并保证按照指定的服务质量(QoS)级别发送消息。MQTT 是一种开放的轻量级机器对机器协议,专为物联网交互设计。在 MQTT 网络中,MQTT Broker 是协调所有 MQTT 代理之间的交互的服务器。MQTT 客户端可以是发布者,也可以是订阅者,或者两者都是。MQTT 架构可以是集中式的,也可以是分布式的,以适应不同的应用场景。
2.Bridge
Bridge在MQTT协议中是指桥接,是指将两个MQTT代理(Broker)连接起来,使得它们可以相互通信,以实现消息的互通。
当两个Broker被桥接后,它们可以作为接入节点提供服务,对外可配置一个虚拟IP或域名来访问。这种桥接方式可以实现负载均衡和故障转移,提高系统的可用性和稳定性。
在配置Bridge时,需要指定消息同步的Topic,而不是同步所有Topic来规避流量放大的问题,更推荐通过垂直切分的方案进行分流。
MQTT协议中的Bridge主要有以下特点:
- 可以实现两个MQTT代理之间的消息互通,保证消息的可靠性和稳定性。
- 可以配置虚拟IP或域名来访问,提高系统的可用性和可维护性。
- 可以实现负载均衡和故障转移,提高系统的可用性和稳定性。
- 可以指定消息同步的Topic,避免流量放大的问题。
- 更推荐通过垂直切分的方案进行分流,以进一步提高系统的可用性和稳定性。
3.MQTT Client
MQTT Client 是指运行MQTT库并通过网络连接到MQTT broker的设备,这些设备可以是微控制器,也可以是成熟的服务器,它实现了MQTT协议的客户端。在MQTT协议中,一个典型的客户端会有以下主要操作:发布消息到某个topic、从某个topic订阅消息、处理接收到的消息、对接收到的QoS 1或QoS 2消息进行确认。MQTT协议的客户端实现非常简单直接。
4.RSMB
RSMB(Very Small Message Broker)是IBM开发的一个轻量级消息代理,主要用于MQTT协议的C/S(客户端/服务器)架构中的消息传输服务。之后,Eclipse Foundation将RSMB接纳为其下的一个项目,并将其命名为Eclipse Mosquitto。
Eclipse Mosquitto是一个开源的消息代理,它实现了MQTT协议的版本3.1和3.1.1,被设计用于从低功耗的单板计算机到完整的服务器等各种设备。MQTT协议使用发布/订阅模型进行消息传递,这种模型被证明在许多场景下,特别是物联网(IoT)应用中,都非常有效。
5.LWT
Last Will and Testament (LWT) 是 MQTT 协议中用于处理非正常断开连接时的一种机制。
LWT 可以被理解为在连接到 MQTT Broker 时提到的遗嘱。当 Broker 检测到 Client 非正常地断开连接的时候,就会向遗嘱主题里面发布一条消息。遗嘱相关的设置是在建立连接的时候,在 CONNECT 数据包里面的 Variable header (可变头与) Payload (有效载荷) 中指定的。
6.M2M
机器对机器Machine to machine (M2M)是指数据从一台终端传送到另一台终端,也就是机器与机器的对话。M2M应用系统构成有智能化机器、M2M硬件、通信网络、中间件。M2M应用领域有家庭应用领域、工业应用领域、零售和支付领域、物流运输行业、医疗行业等。
7.IoT
物联网(Internet of Things,IoT)是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、连接、互动的物体或过程,采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息,通过各类可能的网络接入,实现物与物、物与人的泛在连接,实现对物品和过程的智能化感知、识别和管理。物联网是一个基于互联网、传统电信网等的信息承载体,它让所有能够被独立寻址的普通物理对象形成互联互通的网络。
8.QoS
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)中设计了保证消息稳定传输的机制,包括消息应答、存储和重传。在此机制下,提供了三种不同层次的服务质量(Quality of Service,QoS)等级:
- QoS0,即至多一次(At most once)。这种等级下,发送方(Sender)会尽力向接收方(Receiver)发送消息,但消息的传递流程只包括一次。如果发送失败,则不会重试。这种QoS等级适用于对消息传递可靠性要求不高,但对响应速度要求较高的场景。
- QoS1,即至少一次(At least once)。这种等级下,发送方会确保消息至少被传递一次到接收方。在某些情况下,消息可能会被多次传递。接收方可以通过消息ID或其他标识符来判断是否已经接收过某个消息,从而处理重复接收的情况。这种QoS等级适用于需要确保消息被至少传递一次的场景,但允许消息的重复传递。
- QoS2,即确保只有一次(Exactly once)。这种等级下,发送方会确保每个消息只被传递一次到接收方。在某些情况下,消息可能会被延迟传递。接收方可以依赖某种机制(如数据库事务)来确保某个消息的处理不会重复。这种QoS等级适用于需要确保每个消息只被传递一次的场景,并且对消息的延迟传递有一定的容忍度。
不同的QoS等级为MQTT的应用提供了不同的选择和灵活性,可以根据实际需求和网络环境来选择最合适的QoS等级。需要注意的是,QoS是Sender和Receiver之间的协议,而不是Publisher和Subscriber之间的协议。
常见问题
1.什么是 MQTT?
MQTT 是 IoT 连接的 OASIS 标准。它是一种发布/订阅、极其简单且轻量级的消息传递协议,专为受限设备和低带宽、高延迟或不可靠的网络而设计。设计原则是最大限度地减少网络带宽和设备资源需求,同时尝试确保可靠性和一定程度的交付保证。这些原则也使该协议成为连接设备的“物联网”世界以及带宽和电池电量非常宝贵的移动应用的理想选择。
2.MQTT 是谁发明的?
MQTT 由 IBM 的 Andy Stanley-Clark 博士和 Arcom(现为 Eurotech)的 Arlen Nipper 于 1999 年发明。
3.MQTT用在什么地方?
自 1999 年以来,MQTT 已在各个行业广泛实施。
4.MQTT 是标准吗?
v5.0 和 v3.1.1 现已成为 OASIS 标准(v3.1.1 也已获得 ISO 批准)。
5.是否有可供 MQTT 使用的标准端口?
是的。TCP/IP 端口 1883 已由 IANA 保留用于 MQTT。TCP/IP 端口 8883 也已注册,用于通过 SSL 使用 MQTT。
6.MQTT 支持安全性吗?
在协议 V3.1 中,您可以使用 MQTT 数据包传递用户名和密码。网络上的加密可以使用 SSL 进行处理,独立于 MQTT 协议本身(值得注意的是,SSL 不是最轻的协议,并且确实会增加大量的网络开销)。可以通过应用程序加密其发送和接收的数据来增加额外的安全性,但这不是协议内置的东西,以便保持简单和轻量级。