MQTT系列之初识MQTT

260 阅读22分钟

初识MQTT

数据为物联网、智慧化建设、工业智慧化和数字孪生等领域的发展提供了根本性的动力,我们从这些数据中获取信息,分析并处理这些数据然后得到设备、工厂和系统的运行状态以及环境状态的信息。每个物联网系统或者工厂的设备在经过物联网改造之后都可以产生和发送数据,包括设备本身的运行状态数据、环境数据、空间位置数据和气象温度数据等等。这些设备的采集数据与物联网系统的生命状态、运行状态等存在这重要关联。我们可以通过对这些数据的学习和分析来预测物联网系统可能会发生的危害,系统运行的健康状态以及通过历史数据来回溯过去的运行状态等。

尽管物联网系统的数据如此重要,但是由于设备上嵌入式系统或者芯片孱弱的数据处理能力,我们无法在单个设备上对数据进行必要的分析和处理。并且,对于大型的物联网系统而言,单个设备的数据对于整体的系统状态分析而言,显得杯水车薪。因此,我们需要将数据从生产源头移动、汇集到可以对其进行分析和处理的地方,如服务器、云服务器和数据中心等等。数据移动的过程完成得越高效,系统的响应就越敏捷,就能够更加专注于数据的分析和处理等核心功能。这就是为什么在物联网系统中,数据管道会成为关键性的组件。

1.1 发布与订阅消息系统

在正式介绍MQTT之前我们先了解一下什么是发布/订阅(Publish/Subscribe)模式,发布/订阅(Publish/Subscribe)是一种消息传递模式,也称为消息队列模式。在这种模式下,消息的发布者(Publisher)并不直接将消息发送给特定的订阅者(Subscribe)。发布者会将消息进行分类组织,并将消息发布到一个中间代理Borker来负责所有消息的路由和分发工作,订阅者可以自行从中间代理订阅感兴趣的消息。我们常说的生产者/消费者模型和观察者模式等概念与发布/订阅模型都有着相似的核心概念。这种模式有助于实现解耦和异步通信,特别适用于大规模和复杂的应用系统,它允许不同组件或服务在彼此之间以无状态的方式进行通信。

一般的发布订阅模式由4个部分组成:

  • 发布者(Publisher): 负责将消息发布到主题上,发布者一次只能向一个主题发送数据,发布者发布消息时也无需关心订阅者是否在线。

  • 订阅者(Subscriber): 订阅者通过订阅主题接收消息,且可一次订阅多个主题。

  • 代理(Broker): 负责接收发布者的消息,并将消息转发至符合条件的订阅者。另外,代理也需要负责处理客户端发起的连接、断开连接、订阅、取消订阅等请求。

  • 主题(Topic): 一个主题可以有多个订阅者,代理会将该主题下的消息转发给所有订阅者;一个主题也可以有多个发布者,代理将按照消息到达的顺序转发。

    发布订阅模式

发布/订阅模式的主要特点如下:

    发布者不知道订阅者的存在,订阅者也不知道发布者的存在。他们之间通过消息队列进行通信,降低了耦合度。

    消息队列通常支持多个订阅者,一个消息可以同时被多个订阅者接收。

    可以实现异步通信,让发布者和订阅者的处理逻辑解耦,提高了系统的可伸缩性和性能。

1.2 MQTT概述

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅(publish/subscribe)模式的“轻量级”消息传输协议,该协议构建于TCP/IP协议之上,专门针对低带宽和不稳定网络环境的物联网应用而设计,可以用极少的代码和有限的带宽为联网设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,MQTT 协议被广泛应用于物联网(IOT)、移动互联网、智能硬件、车联网、智慧城市、远程医疗、电力、石油与能源等领域。MQTT协议主要包括以下几个特点:

  • 轻量级协议

    MQTT是一种非常轻量级的协议,其设计目标之一是在资源受限的设备和网络环境中使用。MQTT协议头部非常小,使用简单的二进制编码,减少了网络带宽的占用和消息传输的延迟。这使得MQTT在各种设备上都能高效运行,包括嵌入式系统、传感器和其他低功耗设备。

  • 发布/订阅模式

    MQTT采用发布/订阅模式进行消息传递。在这种模式下,消息的发布者并不直接将消息发送给特定的接收者,而是将消息发布到一个主题(Topic)。订阅了相应主题的客户端(订阅者)将能够接收到该主题上发布的消息。这种松耦合的消息传递方式使得MQTT非常适合分布式系统和实时数据流的传输。

  • 主题(Topic)

    主题是MQTT中消息传递的中心概念。消息发布者通过选择一个特定的主题来发布消息,而消息订阅者则通过订阅相应的主题来接收感兴趣的消息。主题可以看作是消息的分类或通道,用于实现消息的过滤和分类。这种机制使得消息传递更具有灵活性和可扩展性。

  • QoS(Quality of Service)

    MQTT支持多种消息传递的质量服务等级,通常称为QoS级别。QoS级别包括0、1和2三个级别,用于控制消息的可靠性和传递保证。不同的QoS级别提供了不同程度的消息传递保证,使得开发者可以根据应用场景的需求选择合适的级别。

  • 持久性

    MQTT支持持久化会话,这意味着订阅者在断开连接后可以继续接收消息,而不会错过任何消息。持久性会话对于实时数据传输和设备状态监控非常重要,确保订阅者能够及时获取最新的消息,而不受网络连接的影响。

  • 订阅通配符

    MQTT支持使用通配符进行订阅,这使得订阅者能够更灵活地过滤消息。通配符可以用于订阅多个主题的组合,使得订阅者能够只接收到他们感兴趣的特定类型的消息。这种特性增强了MQTT的消息过滤和选择性接收的能力。

  • TCP/IP协议栈

    MQTT是基于TCP/IP协议栈的,这使得它适用于各种网络环境,包括有线和无线网络。由于TCP/IP协议栈的普及和稳定性,MQTT能够与大多数现代网络和设备兼容,为各种应用场景提供稳定可靠的消息传递服务。

总的来说,MQTT是一种轻量级的消息传递协议,最初由IBM开发,主要用于在低带宽、高延迟或不稳定网络环境中传递实时数据。协议采用发布/订阅模式,消息的发布者将消息发布到特定主题上,而订阅了相应主题的客户端将能够接收这些消息。MQTT的设计目标之一是在资源受限的设备和网络中高效运行,其轻量级的协议头部和简单的二进制编码降低了网络带宽的占用和消息传输的延迟。通过支持多种质量服务等级(QoS)、持久性会话和订阅通配符,MQTT提供了灵活性和可靠性,使得它成为物联网应用和实时数据传输的理想选择。同时,基于TCP/IP协议栈的MQTT能够与现代网络和设备兼容,为各种应用场景提供稳定可靠的消息传递服务。

1.3 为什么选择MQTT协议

在互联网领域有许多优秀的消息中间件产品,如Kafka,RabbitMQ和RocketMQ等,他们通常拥有着超高吞吐量、可用性和可靠性等特点,并且常常也支持分布式部署和拓展。那为什么在物联网系统中不去采用这些成熟的消息队列产品而是使用MQTT呢?

尽管 MQTT 与消息队列的很多行为和特性非常接近,比如都采用发布/订阅模式,但是他们面向的场景却有着显著的不同。消息队列主要用于服务端应用之间的消息存储与转发,这类场景往往数据量大但客户端数量少。MQTT 是一种消息传输协议,主要用于物联网设备之间的消息传递,这类场景的特点是海量的设备接入、管理与消息传输。通常IOT设备的计算能力和带宽资源都十分有限,而MQTT是一种轻量级的协议,其消息头部相对较小,有效减少了数据传输的开销。这使得MQTT在带宽有限的环境中表现出色,适用于连接数众多、带宽较小的IoT场景。 更详细的来说,在物联网(IoT)系统中选择使用MQTT协议而不是Kafka有以下一些原因:

    轻量级和低带宽消耗: IoT设备通常具有有限的计算能力和带宽资源。MQTT是一种轻量级协议,其消息头部相对较小,有效减少了数据传输的开销。这使得MQTT在带宽有限的环境中表现出色,适用于连接数众多、带宽较小的IoT场景。

    低能耗: IoT设备通常由电池供电,因此能耗是一个重要的考虑因素。MQTT的轻量级特性和较小的消息开销意味着在通信时消耗的能量相对较低,有助于延长设备电池寿命。

    实时性和即时通信: 许多IoT应用需要实时传输数据,如实时监控、告警通知等。MQTT支持发布/订阅模式,允许设备实时发布消息并广播给订阅者,满足了实时通信需求。

    易于部署和集成: MQTT协议相对较简单,容易在各种类型的IoT设备上部署和集成。它提供了适用于不同平台和编程语言的客户端库,使得开发人员能够轻松地在IoT设备上实现MQTT通信。

    保留消息和断线重连: MQTT支持保留消息和断线重连机制。设备可以发布保留消息,确保新的订阅者能够获取最新的信息。断线重连机制使得设备能够在网络恢复时重新连接到MQTT代理服务器。

    容易扩展和管理: 由于IoT系统可能涉及大量的设备,选择一个易于扩展和管理的协议非常重要。MQTT代理服务器可以水平扩展,以适应不断增长的设备数量。

其实在一些实际的应用场景中,MQTT 与消息队列往往会被结合起来使用,以使 MQTT 服务器能专注于处理设备的连接与设备间的消息路由。比如先由 MQTT 服务器接收物联网设备上报的数据,然后再通过消息队列将这些数据转发到不同的业务系统进行处理。

1.4 MQTT生态系统

MQTT生态系统包括一系列的组件、库和工具,用于支持MQTT协议的开发、部署和管理。以下是MQTT生态系统的一些关键组件:

    MQTT Broker(代理服务器): 代理服务器是MQTT生态系统的核心组件,负责消息的路由和分发。它接收从发布者发送的消息,并将其传递给订阅了相应主题的订阅者。常见的MQTT代理服务器包括Eclipse Mosquitto、EMQ、HiveMQ等。

    MQTT Client Libraries(客户端库): 客户端库是用于在设备和应用程序中实现MQTT通信的软件包。这些库提供了MQTT协议的实现,使开发人员能够在不同编程语言和平台上轻松地与MQTT代理服务器通信。常见的MQTT客户端库有Paho MQTT(Java、Python、C++等)、MQTT.js(JavaScript)、AsyncMqttClient(Arduino)等。

    MQTT Tools(工具): MQTT生态系统提供了一些有用的工具,用于开发、测试和监控MQTT通信。例如,MQTT.fx是一个图形化的MQTT客户端工具,用于测试和调试MQTT通信。MQTT Explorer是另一个用于管理MQTT代理服务器和监控主题的工具。

    IoT平台集成: 许多物联网平台集成了MQTT协议,使开发人员能够轻松地在物联网项目中使用MQTT。这些平台提供了设备管理、数据存储、规则引擎等功能,使MQTT在物联网应用中更加便于管理和扩展。一些著名的物联网平台,如AWS IoT、Google Cloud IoT、Microsoft Azure IoT等,都支持MQTT。

    安全性和认证机制: MQTT支持基于用户名和密码的认证,以及与TLS/SSL等加密协议结合使用,确保通信的安全性。在物联网应用中,安全性是一个重要的关注点,因此在使用MQTT时需要配置适当的认证和加密机制。

综上所述,MQTT生态系统提供了丰富的组件和工具,帮助开发人员在物联网设备和应用之间实现轻量级的消息传递。开发人员可以根据自己的需求选择适当的代理服务器、客户端库和工具,以构建可靠和高效的MQTT通信。

1.5 MQTT起源和发展历史

MQTT(Message Queuing Telemetry Transport)协议最早由IBM的Andy Stanford-Clark和Arlen Nipper于1999年开发,旨在通过卫星连接到石油管道的遥测系统,以便监测物联网(IoT)设备。以下是MQTT的起源和发展历史的关键时刻:

    MQTT的诞生(1999年)

    MQTT最早由IBM的Andy Stanford-Clark和Arlen Nipper在1999年开发。这一协议的设计初衷是连接遥感设备(如传感器)和仪器到低带宽、高成本的网络,以便有效地监测和控制这些设备。MQTT的设计重点是轻量级和高效性,以便在不稳定的网络环境中使用。

    OASIS标准化(2014年)

    在经历了多年的发展和广泛应用后,MQTT在2014年成为了一项开放标准,由OASIS(Organization for the Advancement of Structured Information Standards)标准化组织进行标准化。这一举措进一步推动了MQTT在物联网和各种应用领域的广泛应用。

    Eclipse Paho项目(2011年至今)

    Eclipse Paho是一个由Eclipse基金会维护的开源项目,旨在提供MQTT的客户端实现,以便在各种编程语言和平台上使用MQTT。该项目为开发者提供了一组开源的MQTT客户端库,使他们能够轻松地集成MQTT通信到自己的应用程序中。

    MQTT 3.1.1(2014年)

    MQTT的3.1.1版本是OASIS标准之后发布的版本,它修复了一些先前版本中的问题,并提供了更多的功能。这个版本对于MQTT的进一步推广和应用增加了可靠性和稳定性。

    MQTT 5.0(2019年)

    MQTT 5.0是最新的MQTT版本,于2019年发布。它引入了一些新的特性,如支持共享订阅、更丰富的属性支持、负载均衡等,使MQTT更加强大和灵活。

    广泛应用于IoT和M2M

    MQTT已经成为IoT(物联网)和M2M(机器对机器)通信的重要协议。它在各种场景中得到广泛应用,包括智能家居、工业自动化、农业、医疗保健等领域。

1.6 MQTT的应用场景和案例

1.6.1 MQTT应用场景

    物联网(IoT): MQTT最初设计用于物联网场景,适用于连接大量分布式设备的通信。它在IoT领域的应用包括智能家居、工业自动化、智能城市、农业监测等。设备可以通过MQTT协议向中央服务器发送数据、状态和控制信息。

    实时监控和远程控制: MQTT支持实时数据传递,使其在实时监控和远程控制应用中得到广泛应用。例如,远程传感器可以定期将数据传递到监控中心,从而实现实时数据监测和分析。

    移动应用: 移动应用可以利用MQTT协议实现实时通知、聊天和数据同步等功能。通过MQTT,移动应用可以接收推送通知、即时消息,并与后端服务器进行数据同步。

    智能设备通信: 无论是智能家居设备、智能穿戴设备还是智能工业设备,MQTT都可以作为它们之间通信的协议。设备可以通过MQTT传递传感器数据、状态信息和控制命令。

    传感器网络: 在传感器网络中,设备可以使用MQTT协议将数据上传到中央服务器,从而实现数据采集、监测和分析。这对于环境监测、气象预测等应用非常有用。

    车联网: 在车辆和道路基础设施之间,MQTT可以用于实现车辆定位、交通状况监测、远程诊断和车辆控制等通信。

    能源管理: MQTT可用于能源监测和管理系统,允许监控能源消耗、控制设备状态,并进行实时反馈和优化。

    农业和农村发展: MQTT可以在农业领域用于监测和控制灌溉系统、温室气候控制、动物追踪等。

1.6.2 案例一:针对大型制造业工厂数据采集的IOT平台

1.6.2.1 挑战

近年来,以钢铁制造为代表的工业产业设备传感器数据,几乎都停留在网关机层面,由各类软网关和硬网关采集。部分厂家配置了实时数据库作为数据缓存,可将现场数据保存 1 至 3 个月。在构建整体采集系统进行诸如炼铁、轧钢、煤气、氧气等各类数据的采集时,传统方式是由各自配套网关机单独采集,数据应用系统对接网关机直接获取数据。此方式形成了多对多的架构体系,无法形成统一的数据资产,成为集团数字化转型的痛点。针对大型制造业工厂面积大、数据汇聚难、集团数据难以统一存储的问题,金恒公司开始了自研 IoT 平台的建设。

1.6.2.2 解决方案

IoT 平台核心能力旨在数据采集、存储、分发,同时根据 OT 数据的特性,形成数据资产,支撑数据治理。产品对下支持协议 Modbus-TCP、OPC-UA、MQTT,其中 MQTT 是采集的核心协议,其优势在于平台被动接收数据,可以支持高频数据的采集,并且支持分布式横向拓展。对于 MQTT 协议的接入,我们采用了云原生分布式物联网消息服务器 EMQX 企业版,在保留原生 MQTT 的特性外,还增加了消息的持久化和消息的规则引擎,提高了数据的容灾能力,防止上游消费端故障造成数据丢失。数据的长期存储与实时分析采用了国产时序数据库 TDengine ,其可与 EMQX 完美集成。平台消费 EMQX 中的数据,实时与历史数据存储在 TDengine 中。

基于 EMQX 研发的 IoT 平台实现了如下功能:

  • 设备建模:通过设备树以及设备中测点的属性维护,梳理集团所有数采数据资产大盘,实现分散数据集中管控;

  • 采集配置:多协议、多种配置模式,支持一键导入模式;

  • 规则引擎:支持单点的自定义规则判断,并且判断信息可以被订阅,满足应用接收的时效性;

  • 数据分发:勾选式配置,点位与分发主题多对多的关系,满足了不同项目的独立要求。

智慧化工厂架构图

1.6.2.3 成果

IoT 平台目前已经落地实施,支撑了多个数字工厂与集团整体的智慧运营,满足大型制造业的集团化上层数采,同时也支持独立产线的定制化开发。在提供数据采集能力的同时,平台还输出 OT 数据治理的咨询指导,解决集团的 OT 数据入湖难、管理难、使用难的问题。在南钢投入使用的半年以来,为 6 个数字工厂提供了数据采集和数据服务能力。设备动作类跟踪数据采集频率低至 100ms,时延 200ms 以内。采用实时生产数据,使用状态模型驱动 3D 模型与生产现场同步,实现产线状态实时映射,使生产过程状态一目了然。通过对现场 OT 数据的整合,形成了集团 OT 数据资产,为数字化转型、数据治理奠定了坚实基础。

1.6.3 案例二:智慧车联网系统

汽大众在设计研发新一代智慧车联系统时,我们参考了大量的国内外主流新型车联网的系统架构,EMQX 基于 MQTT 协议的消息中间件具备大并发、低时延、高吞吐等特性,非常适配我们的车联网应用场景,实现了车联网系统和车机系统的松耦合,简化了系统与车机的交互过程。让我们的团队可以专注于上层车联网应用开发,同时 EMQX 产品也具备很好的功能扩展性和管理容量的水平扩展能力,为后续新车和其他车型的大规模接入提供了有力保障。

1.6.3.1 挑战

  • 海量的车机系统安全接入 新一代智慧车联系统将涵盖车机数据上报、POI 下发、推送文件、下发配置、推送消息、运营关怀等全新车联网业务,将产生海量消息 Topic 进行消息订阅和发布。如何实现基于 MQTT 协议海量车机系统的云端安全稳定的接入,是必须重视的问题。

  • 复杂网络环境下消息实时性、可靠性 针对复杂网络环境下的远程下发配置(远程控车)场景对消息的可靠性、实时性有很高的要求。

  • 项目时间紧、任务重,如何快速实现业务对接 新一代智慧车联系统开发周期时间短、任务重,需要快速解耦 TSP 系统和车机的交互过程,提供完善、稳定、可扩展的北向数据接口进行对接。

1.6.3.2 解决方案

EMQ 基于 EMQX 企业版的海量连接、高并发消息吞吐的车联网解决方案,提供了包括数据持久化、南向消息缓存、安全连接与安全认证等功能,满足了上汽大众在新一代车联网建设的需求。

  • 电信级分布式集群架构 通过 EMQX 的多节点分布式集群部署实现百万到千万级别的车联网车机连接和数据传递的能力;支持基于 TLS/DTLS 的安全接入。

  • 强大规则引擎,一键数据持久化 EMQX 提供丰富的北向数据存储能力,通过强大的规则引擎,实现对海量车机数据持久化存储,通过数据桥接到 Kafka 消息队列实现数据异步消费。

  • 多重保障机制确保消息实时、可靠 EMQX 通过提供心跳机制、遗嘱消息、QoS 消息控制、离线消息和安全管理实现在复杂的网络环境下对车机的实时、安全、可靠的消息传递。

  • 通用型总线能力集成,解耦设备与应用 通过 EMQX 的车联网接入网关总线能力,实现了对新一代智慧车联系统和车机的松耦合,上汽大众 SC 团队只需专注上层应用的开发,针对智慧车联系统与车机系统的交互只需要调用 EMQX 的标准接口能力。

1.6.3.3 成果

2020 年上汽大众新一代车联网平台顺利上线,平台车辆接入总量现已达数十万,2021 年底有望突破百万辆并仍在不断增长,而平台始终保持着稳定的运行状态。至此,上汽大众新型车联网以及新车机系统在接入层的业务需求已经借助 EMQX 基本得到了满足。在此基础上,上汽大众与 EMQ 下一步将联合优化现有规则引擎和编解码能力,考虑将更多业务规则过滤与分发实现在消息中间件层,为上层应用的开发提供更加便捷的数据接口。上汽大众新型车联网系统将满足未来几年的车联网发展,为上汽大众客户提供更加智能便利的人车交互体验。