一、引言

在物联网蓬勃发展的今天,各类设备之间的通信变得愈发关键。你是否想过,当我们操控智能家居设备,或者远程监控工业传感器时,背后的通信协议是如何运作的呢?其中,MQTT 协议以其独特的优势,在物联网通信领域占据着重要地位。从智能家居中的智能灯泡、智能插座,到工业自动化里的各种设备,再到车联网中的车辆实时位置追踪,MQTT 协议无处不在,为设备间的高效通信提供了有力支持。那么,MQTT 协议究竟经历了哪些版本的更迭,每个版本又有怎样的改动呢?接下来,就让我们一同深入探究。

二、MQTT 协议初印象

MQTT,全称 Message Queuing Telemetry Transport,即消息队列遥测传输协议 ,是一种基于发布 / 订阅模式的轻量级消息传输协议,基于 TCP/IP 协议族实现。它就像是一个高效的 “信使”,负责在各种设备之间传递信息。在 MQTT 的世界里,有三个重要的角色:发布者(Publisher)、订阅者(Subscriber)和代理服务器(Broker)。发布者就像是信息的 “源头”,它将消息发送到特定的主题(Topic);订阅者则是信息的 “接收方”,它通过订阅感兴趣的主题来获取消息;而代理服务器则扮演着 “中间枢纽” 的角色,负责接收发布者的消息,并将其转发给相应的订阅者。这种发布 / 订阅模式,就好比我们在社交媒体上关注感兴趣的博主,博主发布内容(消息)后,关注他们的粉丝(订阅者)就能收到推送,而社交媒体平台则类似于代理服务器,负责管理和分发这些消息。

MQTT 协议凭借其独特的优势,在众多领域得到了广泛应用,尤其是在物联网领域,更是发挥着举足轻重的作用。在智能家居系统中,我们可以通过手机 APP(作为 MQTT 客户端)向 MQTT 代理服务器发送指令(消息),控制家中的智能灯泡(发布者)改变亮度或颜色,而智能灯泡的状态信息(如当前亮度值)也可以通过代理服务器发送给订阅了相应主题的手机 APP,实现实时监控。在工业自动化场景中,传感器(发布者)不断采集设备的运行数据(如温度、压力等),并通过 MQTT 协议将这些数据发送到代理服务器,工厂的监控系统(订阅者)订阅相关主题后,就能实时获取这些数据,一旦发现数据异常,及时发出警报,保障生产安全。在车联网中,车辆(发布者)的位置、速度等信息通过 MQTT 协议上传到代理服务器,交通管理中心(订阅者)可以实时掌握车辆的动态,进行交通流量调控,而车主也可以通过手机应用(订阅者)随时了解自己车辆的位置等信息。

之所以 MQTT 协议在物联网领域如此重要,是因为物联网设备通常具有数量众多、分布广泛、资源有限等特点。MQTT 协议的轻量级特性,使其占用的网络带宽和系统资源极少,非常适合在这些资源受限的设备上运行;它的发布 / 订阅模式,能够实现一对多的消息传输,高效地满足了物联网设备之间复杂的通信需求;此外,MQTT 协议还提供了多种消息服务质量等级(QoS),可以根据不同的应用场景,确保消息可靠、及时地传输 。比如在智能家居中,对于一些对实时性要求不高的设备状态更新消息,可以采用 QoS 0 级别,减少网络开销;而对于控制指令等关键消息,则可以选择 QoS 1 或 QoS 2 级别,保证消息准确无误地到达。

三、各版本发布时间梳理

(一)1999 年 - 协议诞生

MQTT 协议最初由 IBM 公司的安迪・斯坦福 - 克拉克(Andy Stanford-Clark)及 Cirrus Link 公司的阿兰・尼普(Arlen Nipper)于 1999 年撰写 ,旨在为受限设备和低带宽、高延迟或不可靠的网络而设计。它最初的应用场景是将石油管道上的传感器与卫星相链接,实现数据的传输。在当时,石油行业面临着管道分布广泛、传感器设备资源有限以及通信环境复杂等问题,传统的通信协议难以满足需求。MQTT 协议的出现,就像是为这些困境量身定制的解决方案。它采用发布 / 订阅模式,大大减少了设备之间的直接通信需求,降低了系统的复杂性;其轻量级的设计,使得在有限的带宽条件下,也能高效地传输数据,为石油管道的远程监测提供了可靠的通信保障。

(二)2010 年 - 免费发布

在 2010 年之前,MQTT 协议虽然已经诞生,但使用范围相对有限。2010 年,IBM 发布了 MQTT 3.1 作为免版税版本,这一举措犹如一颗投入平静湖面的石子,激起了层层涟漪,对 MQTT 的发展产生了巨大的推动作用。免费发布使得更多的开发者和企业能够无门槛地使用 MQTT 协议,降低了开发成本和技术门槛。一时间,MQTT 协议在物联网领域迅速传播开来,各种基于 MQTT 协议的应用如雨后春笋般涌现。智能家居企业开始尝试将 MQTT 协议应用于设备通信,实现了设备的远程控制和状态监测;工业领域也逐渐引入 MQTT 协议,用于工厂设备之间的数据交互和监控,提高了生产效率和管理水平。

(三)2014 年 - MQTT v3.1.1 成为标准

2014 年 10 月 30 日,MQTT 3.1.1 规范正式发布,并且成为 OASIS(结构化信息标准促进组织)开放物联网消息传递协议标准。这一版本具有极其重要的地位,它就像是 MQTT 发展历程中的一座里程碑。成为国际标准意味着 MQTT 协议得到了更广泛的认可和支持,其规范性和通用性得到了极大的提升。众多的硬件设备厂商开始在产品中集成 MQTT 3.1.1 协议,软件开发者也能够基于统一的标准进行开发,大大促进了物联网生态系统的互联互通。像一些知名的物联网平台,纷纷采用 MQTT 3.1.1 作为设备接入的标准协议,使得不同厂商的设备能够在同一个平台上协同工作,推动了物联网产业的规模化发展。

(四)2018 年 - MQTT v5.0 发布

2018 年,MQTT v5.0 正式发布,这是 MQTT 协议发展中的一次重大变革。随着物联网设备数量的爆炸式增长和应用场景的日益复杂,对 MQTT 协议提出了更高的要求。MQTT v5.0 应运而生,引入了一系列新特性,如改进的错误报告机制,让开发者能够更准确地定位和解决问题;规范通用模式,包括能力发现和请求响应等,进一步拓展了 MQTT 的应用范围;支持共享订阅,使得多个客户端可以订阅同一个主题,提高了消息分发的效率;新的扩展机制,如用户属性,让开发者可以根据自己的需求自定义消息属性,增强了协议的灵活性。这些新特性使得 MQTT v5.0 能够更好地适应复杂多变的物联网环境,为物联网的发展注入了新的活力 。

四、MQTT v3.1 及 v3.1.1 版本改动点

(一)MQTT v3.1 概述

MQTT v3.1 在 2010 年随着 IBM 的免费发布而开始崭露头角,逐渐在物联网领域被广泛采用 。它基于发布 / 订阅模式,有着小巧、开放、轻量级并容易实现的特点,非常适合在受限环境中使用,比如网络昂贵、低带宽、不可靠的网络环境,以及运行在嵌入式设备中受限于处理器和内存资源的情况 。在这个版本中,已经具备了 MQTT 协议的一些核心特性,像发布 / 订阅消息模式,提供了一对多消息分发,将应用程序解耦;消息传输内容负荷不可知性;消息传递提供三种服务质量,分别是 “最多一次”“至少一次”“恰好一次”;小的传输头部,固定长度的头部仅占 2 个字节,减少了网络流量 。例如在智能家居系统中,智能传感器(发布者)可以通过 MQTT v3.1 协议将温度、湿度等数据发布到代理服务器,智能音箱(订阅者)订阅相关主题后,就能实时获取这些数据并进行语音播报,实现了设备之间的高效通信。

(二)v3.1.1 相对 v3.1 的改动

  1. Session Present Flag:当客户端使用持久会话进行连接(即不使用 “clean session” 标记清除已有会话标志 )时,在 CONNACK 中会新增一个 “Session Present” 标志(逻辑值为 true 或 false) 。这个标志表明 MQTT 服务器是否已经拥有当前客户端上次连接的会话信息,如订阅的主题、排队信息等 。若标志为 true,客户端可减少一次发送订阅 SUBSCRIBLE 的交互步骤,因为服务器已经保存了之前的订阅信息,这有助于更有效的数据通信;若为 false,客户端则需要再次发送订阅 SUBSCRIBLE 消息 。比如在工业监控场景中,传感器设备周期性地向服务器发送数据,当设备重新连接时,如果 Session Present Flag 为 true,就可以快速恢复数据传输,无需重新订阅主题,大大提高了通信效率。
  2. 失败订阅的附加错误码:在 MQTT 3.1.1 之前,客户端无法得知其发送的订阅主题是否被 MQTT 服务器接受 。而在 3.1.1 版新规范中,在 MQTT SUBACK 消息中新增了一个错误码 0x80 。在权限管理严格的 MQTT 主题管理场景中,如果客户端没有权限订阅某个主题,服务器会把错误代码 (0x80) 附加在 SUBACK 中,客户端就能知道订阅失败 。这在企业级物联网应用中非常重要,例如在智能工厂中,不同的设备和用户可能具有不同的权限,通过这个错误码可以确保只有授权的订阅请求才能被接受,保障了系统的安全性和稳定性。
  3. 匿名 MQTT 客户端:在 3.1.1 版本中,如果使用场景需要临时的或匿名的 MQTT 客户端,客户端只需在发送 CONNECT 时把客户端标识符(client identifier)置空(零长度),MQTT 服务器会为此类请求生成一个随机、唯一的客户端标记符 。不过,这要求客户端必须设置 Clean Session 标记为 1,否则服务器端会直接返回包含 0x02 (Identifier rejected) 代码的 CONNACK,同时关闭连接 。这种匿名客户端适用于一些后端程序(不需要维护会话状态)向终端发送消息的场景,MQTT 服务器程序可对其区别对待 。比如在一些公共的物联网数据采集平台中,允许用户临时匿名接入,获取一些公开的数据,而无需进行复杂的身份认证和会话管理。
  4. 即时发布或不等待响应的突发 MQTT 消息:3.1.1 版为 MQTT 客户端设计了一个新功能,客户端可以在发送 CONNECT 之后,无须等待 MQTT 服务器返回的 CONNACK,根据需要即刻发送 PUBLISH、SUBSCRIBLE、DISCONNEECT 等消息 。这非常适用于微型、受限的 MQTT 客户端做连接 CONNECT、发布 PUBLISH、断开 DISCONNECT,而不需要处理来自 Broker 的响应的情况 。同时,也适用于只关心尽可能发送数据而不维持长时间 TCP 连接的处于突发模式的客户端 。例如在一些环境监测设备中,当检测到异常数据时,需要立即将数据发送出去,此时就可以利用这个特性,快速发布消息,而不用等待服务器的响应,提高了数据传输的及时性。
  5. 客户端 ID 可以很长:MQTT 3.1 针对客户端标识符(client identifier)的限制是 23 个字节,在实际环境下,这常常会带来不便。比如一些遗留系统可能使用 UUID 作为客户端的标识符,UUID 通常长度较长,使用 23 字节的限制就需要服务器端做一些彼此之间的 MAP 映射 。在 MQTT 3.1.1 中,上限提升为 65535 个字节,这使得 MQTT 能够更好地兼容大量的遗留设备和基础设施 。现在,像使用 UUID 作为客户端 ID 的情况,就可以直接使用,无需额外的转换或映射操作,为系统的升级和扩展提供了更大的便利。
  6. 其他低级别的更改:一是 CONNECT 消息可变头部协议名称从 MQIsdp 改为 MQTT,语义更准确,同时还节省了两字节的开销 ;二是所有字符串明确规定使用 UTF-8 编码,包括客户端标识符 (Client Identifier),统一编码避免了字符编码不一致带来的问题,增强了协议的通用性 ;三是 CONNECT 消息可变头部协议版本号由 0x03 变成了 0x04 ;四是明确规定 QoS 0 类型 PUBLISH 消息 DUP 标记必须被设置为 0 ;五是定义了 MQTT Over WebSocket,互联网地址编码分配机构(Internet Assigned Numbers Authority)分配标识符为 mqtt ,使得 MQTT 可以在 WebSocket 通道上进行通信,拓展了 MQTT 的应用场景,比如在 Web 应用中,可以更方便地使用 MQTT 进行实时通信。

五、MQTT v5.0 相对 v3.1.1 的改动点

(一)消息属性的引入

MQTT v5.0 引入了丰富的消息属性,这是一个非常重要的改进。在之前的版本中,消息的元数据信息相对有限,而 v5.0 新增的内容类型属性,允许发布者指定消息的内容类型,比如是 JSON 格式的数据、XML 格式的数据,还是纯文本等。这使得订阅者在接收到消息后,能够更清楚地知道如何解析消息内容。响应主题属性则为实现请求-响应模式提供了便利,当客户端发布一个请求消息时,可以同时指定一个响应主题,服务端在处理完请求后,就可以将响应消息发布到这个指定的主题上,方便客户端接收响应。例如在智能家居的场景中,手机 APP 向智能家电设备发送控制指令时,可以通过响应主题属性,让设备将执行结果反馈到指定主题,APP 订阅该主题后就能及时获取设备的执行状态。这些新增的属性大大增加了消息的可扩展性,开发者可以根据具体的应用场景,灵活地利用这些属性来传递更多的元数据信息,满足复杂业务的需求 。

(二)会话管理功能增强

在会话管理方面,MQTT v5.0 也有显著的改进。它引入了会话到期通知功能,客户端可以在连接时设置会话过期时间,当会话过期时,客户端和服务器都能得到通知,这有助于合理管理资源,比如服务器可以及时清理过期会话相关的资源,避免资源浪费。消息过期时间功能允许发布者为消息设置一个过期时间,在这个时间之后,消息将不再被传递或处理。在一些实时性要求较高的场景,如股票行情数据的推送,设置消息过期时间可以确保订阅者不会接收到过时的行情信息。在实际应用中,通过合理设置会话过期时间和消息过期时间,可以优化会话管理,提高系统的性能和资源利用率 。

(三)连接灵活性提升

MQTT v5.0 让客户端在连接时可指定更多参数,极大地提升了连接的灵活性。客户端可以在 CONNECT 报文中指定最大报文长度,告知服务器自己能够处理的最大报文大小,这样服务器在发送消息时就可以根据这个参数来调整报文大小,避免因为报文过大导致客户端无法处理。还可以指定接收最大值,即客户端能够同时处理的未确认消息的最大数量,这在网络不稳定或客户端处理能力有限的情况下非常有用。在车联网中,车辆在移动过程中网络信号可能会不稳定,通过指定这些参数,可以确保车辆与服务器之间的通信更加稳定可靠,适应不同的网络环境 。

(四)通信可靠性增强

v5.0 对通信可靠性的增强也十分明显,它定义了多种错误码,相比 v3.1.1 版本,错误码更加丰富和细化,并且在所有确认报文中都增加了原因码和可选的原因字符串 。当通信出现问题时,比如连接失败、消息发送失败等,客户端和服务器可以通过这些错误码和原因字符串,更清晰地了解断开连接或发生故障的原因。如果客户端连接服务器失败,服务器返回的原因码可以明确指出是因为用户名密码错误、服务器资源不足,还是其他原因导致的连接失败,这对开发者排查问题提供了极大的帮助,能够快速定位问题所在,提高开发和维护的效率 。

(五)消息到达确认和精确控制

MQTT v5.0 在消息到达确认和精确控制方面有了进一步的提升。它增强了对 QoS(服务质量)的支持和管理,通过更精确的消息传递控制,确保消息能够可靠地到达目标客户端 。在 QoS 1 和 QoS 2 级别下,消息的确认机制更加完善,减少了消息丢失或重复接收的可能性。在工业自动化场景中,设备之间的控制指令和状态反馈等消息对可靠性要求极高,MQTT v5.0 的这一特性能够很好地满足这种需求,保证生产过程的稳定和安全 。

(六)协议扩展性规范

MQTT v5.0 在协议扩展性方面做了规范,它引入了用户属性等扩展机制,允许客户端和服务器在不改变协议核心的基础上,添加自定义的属性 。这使得协议能够更好地适应未来不断变化的需求,无论是新的应用场景出现,还是现有业务的功能扩展,都可以通过这些扩展机制来实现。对于长期的物联网发展来说,这种扩展性为物联网设备和系统的持续创新提供了有力支持,确保 MQTT 协议在未来的物联网领域中始终保持竞争力 。

六、版本选择建议

(一)根据应用场景选择

在智能家居场景中,设备种类繁多,网络环境相对稳定,但对设备的功耗和资源占用较为敏感。如果智能家居系统中设备数量较少,且对功能要求不是特别复杂,MQTT v3.1.1 版本就能够满足基本的控制和状态监测需求,其轻量级的特性可以有效降低设备的资源消耗。但如果智能家居系统规模较大,需要实现更复杂的功能,如设备之间的联动、场景模式的自定义等,MQTT v5.0 则更为合适。它丰富的消息属性和强大的会话管理功能,可以为智能家居系统提供更灵活、更高效的通信支持,方便实现各种复杂的业务逻辑 。

对于工业监控场景,设备通常分布在不同的区域,网络环境复杂,对数据传输的可靠性和稳定性要求极高。MQTT v3.1.1 在工业监控中已经得到了广泛应用,它的多种 QoS 级别能够满足不同数据的传输需求,比如对于一些实时性要求不高的设备状态信息,可以采用 QoS 0 级别,减少网络开销;而对于关键的控制指令和设备故障信息,则可以选择 QoS 1 或 QoS 2 级别,保证消息准确无误地到达。然而,随着工业物联网的发展,对工业监控系统的功能和性能提出了更高的要求。MQTT v5.0 增强的通信可靠性和精确的消息控制功能,使其在处理大规模工业设备监控时更具优势。它能够更好地应对网络波动和设备故障等情况,通过丰富的错误码和原因字符串,快速定位和解决通信问题,保障工业生产的安全和稳定 。

(二)考虑兼容性问题

在升级现有项目时,一定要充分考虑兼容性问题。如果项目中已经存在大量使用 MQTT v3.1.1 的客户端和服务器,贸然升级到 MQTT v5.0 可能会导致兼容性问题。因为不同版本的 MQTT 协议在报文格式、语义等方面存在差异,可能会使旧版本的客户端无法理解新版本服务器发送的消息,或者新版本的服务器无法正确处理旧版本客户端的请求。所以,在升级之前,需要对项目中的设备和系统进行全面评估,确定哪些部分可以直接升级,哪些部分需要进行改造或替换。可以先在小范围内进行试点升级,观察系统的运行情况,确保兼容性问题得到妥善解决后,再逐步推广到整个项目 。

在开发新项目时,如果需要与现有的 MQTT 系统进行集成,也需要考虑版本兼容性。要了解现有系统所使用的 MQTT 版本,选择与之兼容的版本进行开发。如果现有系统使用的是 MQTT v3.1.1,而新项目中使用 MQTT v5.0,可能需要在中间增加一层协议转换层,将不同版本的 MQTT 协议进行转换,以实现系统之间的互联互通。但这种方式会增加系统的复杂性和开发成本,所以在条件允许的情况下,尽量选择统一的 MQTT 版本,以简化系统架构,提高开发效率和系统的稳定性 。

七、总结

回顾 MQTT 协议的发展历程,从 1999 年诞生之初专为受限设备和复杂网络环境设计,到 2010 年免费发布开启广泛应用的大门,再到 2014 年 MQTT v3.1.1 成为标准,以及 2018 年 MQTT v5.0 带来的重大变革,每一个版本的发布都见证了物联网行业的发展需求和技术进步。MQTT v3.1.1 在基础特性上不断完善,如改进连接机制、增强错误处理等,使其在物联网领域得到了广泛应用;MQTT v5.0 则通过引入丰富的消息属性、增强会话管理和连接灵活性等,满足了日益复杂的物联网应用场景的需求 。

展望未来,随着物联网技术的持续发展,MQTT 协议有望在多个方面取得进一步突破。在安全性方面,面对物联网设备数量的爆发式增长和数据安全的重要性日益凸显,MQTT 协议将加强对数据加密、身份认证等安全机制的支持,确保设备间通信的数据安全和隐私保护。在性能优化上,为了应对大规模物联网场景下对通信效率和可靠性的更高要求,MQTT 协议将不断优化算法和传输机制,提高消息的传输速度和稳定性 。同时,随着边缘计算技术的兴起,MQTT 协议也可能会更好地支持边缘设备之间的通信和数据交换,实现更灵活、高效的物联网应用 。相信在未来,MQTT 协议将继续在物联网领域发挥重要作用,推动物联网技术不断向前发展。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐