一、MQTT协议简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅(publish/subscribe)模式的轻量级通讯协议。该协议构建于TCP/IP协议之上,由IBM于1999年首次发布。
MQTT的关键优势
MQTT的最大优点在于其能够以精简的代码和有限的带宽提供实时可靠的消息服务,因此在连接远程设备方面具有独特的优势。作为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备和移动应用等领域得到广泛应用。
MQTT与HTTP的对比
传统互联网应用通常广泛使用HTTP协议。然而,物联网环境下的挑战与传统互联网不同,这包括不稳定的网络连接和设备资源有限的情况。以下是MQTT相对于HTTP的优势:
- 网络适应性: MQTT在不稳定的网络环境中表现出色,适用于连接质量较差的情况。
- 资源效率: 由于物联网设备通常具有有限的计算和通信资源,MQTT的轻量级特性使其成为理想选择。
- 消息大小: 物联网传输的消息通常较小,相比之下,HTTP的请求-响应模式在这种情况下效率较低。
- 实时性: MQTT的发布/订阅模式允许设备订阅感兴趣的主题,实现实时消息推送,而HTTP通常需要设备主动轮询以获取数据,降低了实时性。
- 成本效益: MQTT在物联网应用中降低了数据传输成本,尤其是在大规模设备部署的情况下。
二、MQTT协议设计原则
MQTT协议的设计遵循一系列关键原则,这些原则使其成为物联网通信的理想选择:
- 精简而高效: MQTT坚决避免添加不必要的功能,使协议保持精简。这确保了它的性能出色,不浪费计算和带宽资源。
- 发布/订阅模式: MQTT采用发布/订阅(Pub/Sub)模式,这意味着设备可以轻松地发布和订阅消息,从而方便了消息在传感器之间的传递。
- 动态主题创建: MQTT允许用户动态创建主题,无需运维成本。这使得设备和应用可以根据需要自由定义消息主题,增加了灵活性。
- 最小传输量: MQTT致力于将传输数据的量降到最低,以提高传输效率。特别是对于低带宽、高延迟和不稳定的网络,这一点尤为重要。
- 会话控制: MQTT支持连续的会话控制,有助于维护设备的连接状态和通信的一致性。
- 适应性: MQTT理解到客户端的计算能力可能非常有限,因此协议的设计考虑到了这一点。
- 服务质量管理: MQTT提供了多种服务质量级别,允许在不同网络条件下选择适当的级别,以确保消息的可靠传递。
- 数据格式灵活性: MQTT协议不强求传输数据的类型和格式,保持了数据的灵活性,使其适用于各种数据类型和应用场景。
这些原则使MQTT协议在不同环境下都能够高效运作,并为物联网提供了可靠的通信基础。
MQTT协议的版本
目前,MQTT有两个主要版本:MQTT3.1.1和MQTT5。MQTT3.1.1于2014年10月发布,而MQTT5于2019年3月发布。MQTT5在MQTT3.1.1的基础上进行了升级,添加了更多功能并完善了协议规范。尽管如此,MQTT5仍然与MQTT3.1.1完全兼容,这意味着现有的应用可以无缝升级到新版本,而无需改动。
三、MQTT与消息队列MQ的区别
尽管MQTT和消息队列MQ在某些方面行为和特性相似,比如都采用发布订阅模式,但它们面向的场景存在显著差异:
- 消息队列MQ: 主要用于服务端应用之间的消息存储和转发,通常处理大量数据但接入量较少。
- MQTT: 针对物联网和移动互联网领域设计,重点是支持大规模设备的接入、管理和消息传输。
在实际应用中,这两者经常结合使用,例如,首先由MQTT Broker接收物联网设备上传的数据,然后通过消息队列MQ将这些数据转发到具体应用进行处理。
四、MQTT协议在车联网中的应用
在车联网领域,MQTT协议发挥着重要作用,特别是在Telematics Service Provider(TSP,汽车远程服务提供商)方面。TSP作为核心角色,连接着汽车制造商、车载设备制造商和网络运营商,同时提供服务给内容提供商。
TSP在车联网中扮演着关键的角色,需要与各个环节进行多种交互,其中包括与云平台和车载终端的消息接入。
MQTT作为一种基于发布/订阅模式的物联网通信协议,在车联网场景中展现出了诸多优势:
- 开放的消息协议,易于实现: 在市场上,存在着大量成熟的软件库和硬件模块,它们使得车机接入变得更加容易,降低了使用成本。
- 灵活的发布/订阅和主题设计: MQTT允许通过众多主题进行消息通信,适用于多种车联网业务,从而满足了不同场景的需求。
- 灵活的Payload格式: MQTT的报文结构紧凑,可以有效地携带各类业务数据,同时减少了车机网络流量的负担。
- 多种服务质量级别: MQTT提供了三个可选的服务质量级别,适应了车机设备在不同网络环境下的通信需求。
- 在线状态感知和会话保持: MQTT协议支持车机设备的在线状态感知,同时具备会话保持能力,方便管理车机的在线状态并保留离线消息。
这些优势使得MQTT在车联网中成为了一种理想的通信协议,能够满足海量车机系统的接入需求,并确保在复杂的网络环境下实现消息的实时性和可靠性。
五、MQTT协议特性介绍
1. 客户端与服务器
MQTT协议涉及到客户端和服务器之间的通信。在这个通信过程中,有三种关键角色:发布者(Publish)、代理(Broker,服务器)和订阅者(Subscribe)。
客户端是MQTT的基本组成部分,可以执行发布和订阅操作。发布者负责向服务器发布信息,而订阅者则负责订阅信息。此外,客户端还可以执行退订操作,取消对特定主题的订阅,以及断开与服务器的连接。
服务器端是MQTT的核心,通常被称为消息代理(Broker)。它位于发布者和订阅者之间,负责传递和管理MQTT消息。服务器接受客户端的网络连接、接收发布者的应用信息、处理客户端的订阅和退订请求,并将发布者的应用程序消息转发给订阅者。
2. 主题
在MQTT中,通信是基于主题(Topic)的。主题是消息的标识,用于控制消息的传递。
例如,假设有三个MQTT客户端:汽车、手机和电脑。如果我们需要手机和电脑获取汽车的速度信息,首先要让手机和电脑订阅名为“汽车速度”的主题。然后,当汽车发布速度信息到该主题时,服务器会检查哪些客户端订阅了该主题,然后将信息传递给手机和电脑客户端。
在不同主题下,MQTT客户端可以切换其角色,可能是发布者,也可能是订阅者,具体取决于其需求和所订阅的主题。
上图中的所有客户端都是围绕“空调温度”这一主题进行通讯的。
对于“空调温度”这一主题,手机和电脑客户端成为了MQTT信息的发布者,而汽车则成为了MQTT信息的
订阅者(接收者)。所以,针对不同的主题,MQTT客户端可以切换自己的角色。它们可能对主题A来说是信息发布者,但是对于主题B就成了信息订阅者。
这种基于主题的通信机制使得MQTT协议在物联网中非常灵活和适用于多种场景。
3. MQTT 发布/订阅 特性
MQTT通讯的核心枢纽是MQTT服务端。有了服务端对MQTT信息的接收、储存、处理和发送,客户端在发布和订阅信息时,可以相互独立,且在空间上可以分离,时间上可以异步。
相互独立
MQTT客户端是独立的个体,无需了解彼此的存在,仍然可以实现信息交流。举例来说,汽车客户端在发布“汽车速度”信息时,不需要知道有多少其他MQTT客户端订阅了同一主题。同样,订阅了“汽车速度”主题的手机和电脑客户端也不需要了解彼此的存在。只要它们都订阅了“汽车速度”主题,MQTT服务端会在每次收到新信息时,将信息发送给所有订阅了该主题的客户端。
空间可分离
MQTT客户端可以连接到同一个MQTT通讯网络,无论它们在世界的哪个角落,只要联网,就可以实现彼此间的通讯交流。
时间可异步
MQTT客户端在发送和接收信息时无需同步。这对物联网设备尤其重要,因为它们可能会因为网络不稳定而断开连接。例如,汽车在行驶中可能会突然进入隧道,导致断开与MQTT服务端的连接。在这种情况下,如果手机客户端向汽车客户端发布了信息,而汽车不在线,MQTT服务端可以暂时保存“空调温度”主题的新信息,直到汽车再次上线时将信息推送给它。
4. 会话
MQTT通讯的会话涵盖了从客户端向服务端发起连接请求,到连接中断,直至会话过期为止的消息收发序列。
会话可能仅持续一个网络连接,但如果客户端在会话过期前重新建立了连接,会话也可以跨越多个网络连接存在。
会话状态的使用
客户端因网络波动等原因导致连接短暂中断,但在会话过期前重新连接,会话状态的保存允许客户端沿用上次连接建立的订阅关系,避免了重新订阅的需求,降低了资源消耗。
在低带宽、不稳定的网络环境下,网络中断可能会频繁发生,会话状态的保存方式防止了每次连接都需要重新订阅,减少了客户端和服务端的资源消耗。
服务端在客户端脱机期间保留未完成确认的消息以及后续到达的消息,客户端重新连接后再一并转发,确保消息不会丢失,同时降低用户对网络变化的感知度。
5. QoS(服务质量)
在物联网系统中,某些信息非常重要,需要确保它们可以准确无误地发送和接收。其他信息可能对系统的运行不那么关键,即使在传输中丢失也不会产生重大问题。
MQTT服务质量(Quality of Service,缩写 QoS)用于告知物联网系统哪些信息是重要信息,需要准确传输,哪些信息可以容忍一定的丢失。
MQTT设计了3个QoS等级:
QoS 0: 消息最多发送1次,网络资源占用最少。发送端发送消息后,任务就完成了,不会检查消息是否被正确接收。
适用于信息传输不太关键的情况,但在网络不稳定时可能会导致消息丢失。
QoS 1: 消息至少发送1次,可能导致接收端多次接收同一消息。发送端在消息发送后等待接收端的确认,如果没有收到确认,会重复发送消息。
适用于对信息准确性要求较高的场景,但可能会导致消息的重复接收。
QoS 2: 消息保证只发送1次,最安全的服务级别。确保接收端只接收一次消息,但发送和接收过程更加复杂,需要两次确认。
适用于对信息传输要求非常高的情况,确保消息不会丢失且不会重复接收。
在发布和订阅消息的客户端之间,服务端会主动采用较低的QoS等级来提供服务。这意味着服务端将根据客户端的要求选择适当的QoS等级来确保信息的可靠传输。
例如,如果一个客户端使用QoS 2发布消息,而另一个客户端使用QoS 1订阅相同主题,服务端将使用较低的QoS 1来满足订阅客户端的需求。这种灵活的QoS等级适应了不同客户端的需求和网络条件。
服务质量降级
在发布和订阅消息的客户端之间,服务端会主动采用较低的服务质量级别(QoS)来实现消息传输,以适应订阅者的QoS设置。
场景1:
假设客户端A使用QoS = 2发布到主题1的消息,而客户端B在订阅主题1时选择了QoS = 1。
在这种情况下,服务端会自动采用较低的服务质量级别以提供服务。
尽管客户端A使用QoS 2发布主题1的消息,但由于客户端B订阅主题1时选择了QoS 1,因此服务端在将消息发送给客户端B时会降低消息的服务质量级别为1。
场景2:
考虑另一种情况,客户端A使用QoS 0发布主题1的消息,而客户端B在订阅主题1时选择了QoS 1。
尽管客户端B订阅主题1时使用了QoS 1,但由于客户端A使用QoS 0发布主题1的消息,因此服务端会将消息发送给客户端B时的服务质量级别降低为0。
这种服务质量降级机制确保了在不同订阅者之间灵活适应QoS设置,以确保消息传输在各种情况下的可靠性和效率。
6. 保留消息
想象一个智能家居物联网系统,其中一个MQTT客户端负责定时检测室温,并在每个整点时将当前室温发布到MQTT服务端。系统中还有另一个客户端,专门用于显示温度信息,它在启动后会立即订阅室温主题。
在正常情况下,假设室温检测客户端在上午7:00将最新的室温消息发布到服务端,那么订阅了室温主题的显示客户端会立刻获取并显示这个温度信息。
然而,在某一天的7:10,显示客户端的电源插头被意外拔掉,之后重新插上电源。客户端重新启动后,会立刻订阅室温主题。
问题出现了:室温客户端只在每个整点时发布一次温度信息,上一次发布是在7:00,下一次发布将在8:00。因此,在8:00之前的几十分钟内,显示客户端将无法获取到当前室温信息。
为了解决这个问题,我们可以让室温测量客户端在每次发布温度信息到室温主题时都使用保留消息模式。这样,无论显示客户端何时订阅室温主题,它都会立刻收到该主题中的保留消息,确保及时获取当前室温信息。
7. 心跳机制
MQTT引入了心跳机制,允许客户端定时向服务端发送一条心跳请求消息,以通知服务端客户端仍然在线。
心跳时间间隔
在客户端连接服务端时,可以设置心跳时间间隔。客户端会将这个间隔信息放入CONNECT报文的keepAlive字段中。
例如,如果设置心跳时间间隔为60秒,客户端会在60秒内不发布消息时发送心跳请求,以告知服务端它仍然在线。
客户端在心跳时间间隔内发布消息时,会直接发布消息而不发送心跳请求。
客户端掉线
如果服务端在1.5倍心跳时间间隔内没有收到客户端发布消息(PUBLISH)或心跳请求(PINGREQ),服务端会认为客户端已经掉线。
这个心跳机制让服务端随时了解客户端的连接状态。正常情况下,服务端会收到心跳请求并回复心跳响应,从而知道客户端仍然在线。如果心跳停止,服务端会检测到客户端断线。
8. 遗嘱机制
MQTT协议允许客户端在在线时设置遗嘱消息,以便在意外断线时将其发布。这样,即使客户端意外断线,服务端也能够公布客户端的遗嘱消息。
需要注意的是,客户端的遗嘱只在客户端意外断线时才会发布,如果客户端正常断开与服务端的连接,遗嘱机制不会触发,服务端也不会发布遗嘱消息。
意外断线的情况包括但不限于:
- 由于网络故障或波动,设备在保持连接周期内未能通讯,导致服务端关闭连接。
- 设备意外断电。
- 设备尝试进行不被允许的操作,导致服务端关闭连接,例如订阅自身权限以外的主题等。
9. 数据包结构
MQTT消息结构可分为三个部分:
- 固定报头 (Fixed header):存在于所有MQTT数据包中,用于表示数据包类型和数据包的分组类标识。
- 可变报头 (Variable header):存在于某些MQTT数据包中,其存在与否取决于数据包类型。
- 有效载荷 (Payload):包含实际传输的数据,也是某些MQTT数据包的一部分。
整体 MQTT 的消息格式如下图所示:
整体来看,MQTT消息的格式非常灵活,具有可扩展性,使其适用于各种不同的物联网应用场景。
希望这些说明能够帮助你更好地理解MQTT协议的关键特性和工作原理。
您必须登录才能发表评论。