深入浅出地学习MQTT协议

电子说

1.3w人已加入

描述

IBM公司的安迪·斯坦福-克拉克及Cirrus Link公司的阿兰·尼普于1999年撰写了MQTT协议的第一个版本。在2013年IBM公司向结构化资讯标准促进组织提交了MQTT 3.1版规范,并附有相关章程,以确保只能对规范进行少量更改。MQTT可以说2017年以后就成为了所有的物联网模块的标配。最早的物联网模块实现MQTT都是通过TCP方式来实现的。

首先我们要了解MQTT是什么,为何它会如此受到青睐。需要说明的是MQTT的前身就是TCP,他是基于TCP基础做的一些协议开发。本质上的数据传输是离不开TCP的。所以说TCP的稳健可靠才衍生出来这么好用的协议。MQTT(消息队列遥测传输)协议是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。

百度百科有下面的这样定义: MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。 MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

MQTT的设计规范和特性

由于物联网环境具有一定的特殊性,所以MQTT设计都需要遵守以下规范:

① 精简,不添加可有可无的功能;

② 发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递;

③ 允许用户动态创建主题,零运维成本;

④ 把传输量降到最低以提高传输效率;

⑤ 把低带宽、高延迟、不稳定的网络等因素考虑在内;

⑥ 支持连续的会话控制;

⑦ 理解客户端计算能力可能很低;

⑧ 提供服务质量管理;

⑨ 假设数据不可知,不强求传输数据的类型与格式,保持灵活性。

MQTT协议工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

① 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。

② 对负载内容屏蔽的消息传输。

③ 使用TCP/IP提供网络连接。

④ 有“至多一次”“至少一次”“只有一次”三种消息发布服务质量。

⑤ 小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。

⑥ 使用Last Will和Testament特性通知有关各方客户端异常中断的机制。

MQTT协议适合场景:

客户端数量众多;

每次消息传输的数据量不大;

协议占用资源小,能够方便移植到单片机等硬件上;

提供不同等级的“服务质量Qos”;

在低带宽、高延迟、不可靠的网络和资源有限的硬件环境下,进行相对可靠的数据传输;

支持一对多的消息分发。

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker,服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

客户端

在MQTT中,主要有三个角色:

角色说明

发布者(Publish)发送消息的一方,可以为一个应用程序或一台设备

代理(Broker,服务器)管理消息队列的一方,位于消息发布者和订阅者之间

订阅者(Subscribe)订阅主题的一方,主要用于接收消息

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分 :Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

MQTT客户端是指使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以是:(1)发布其他客户端可能会订阅的信息;(2)订阅其它客户端发布的消息;(3)退订或删除应用程序的消息;(4)断开与服务器连接。

MQTT服务器称为"消息代理"(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:(1)接收来自客户的网络连接;(2)接收客户发布的应用信息;(3)处理来自客户端的订阅和退订请求;(4)向订阅的客户转发应用程序消息。

客户端

其实对用户需要明白一点的就是,它就是客户端和服务器之间的数据交互。MQTT的应用存在于我们身边的方方面面。上面图告诉我们, MQTT是需要有一个服务器的,左边有设备进行数据发布,右边是有数据接收。 简单来讲,我们扫码付款吃饭,首先我们先扫二维码信息,手机会将我们的二维码信息和付款信息金额发布到MQTT的服务器。MQTT服务器收到你的付款金额后,会推送给你收钱方的商家,所以你会听到付款消息的声音,在商家的支付宝里面也会多出你转过来的费用了。

客户端

上图演示的是发布数据消息,然后在手机和电脑端接收消息。可以看到,发布数据里面不但有数据内容还有个TOPIC。所以为何刚才上面提及到付款的时候,不但有付款金额还有二维码信息,也是一个道理。

TOPIC主题如何理解,比如我们收发快递的时候,快递盒子上面的收件人信息机会可以理解为主题,因为只有收件人信息核实清楚,快递才不会拿错。 所以上图演示的温度信息就是因为手机端先订阅了“temp”这个参数。 所以当发布者发布消息的时候,有这个主题的时候,服务器就会推送这样的数据包括主题给订阅者进行接收。所以在MQTT里面最为重要的信息就是主题。相对TCP而言,它只是收发数据信息,没有主题概念。所以对于TCP而言,是很难做客户端与客户端之间的通讯测试的,因为数据没法分清谁是谁。

大家只要理解MQTT是TCP的上层封装,只是比TCP发数据的时候多一个TOPIC即可。 我们使用MQTT.fx的软件给用户测试下MQTT的使用概念。

客户端

打开MQTT.fx软件,用户需要先配置链接的服务器,他既可以用作发布者也可以用作订阅者。

客户端

上图是MQTT的服务器配置,用户如果没有服务器,使用我们所提供的免费服务器进行测试也是可以的。

客户端

配置完成后,点击下connect按钮,进行连接。如果服务器存在,那么就会显示绿色灯,如果不存在是连接不上的。

客户端

左边有一个按钮是发布消息的英文名称,首先在第一个框中输入发布主题,下面的大白空页输入发布数据。

客户端

然后发布的右边的按钮是订阅的按钮英文名称,同样第一个框需要用户输入订阅主题。这点之前明确过,如果要订阅到消息,必须和发布数据的主题名称一样才可以。

我们在发布页面发送数据,看下订阅端是否可以收到数据。

客户端

可以看到订阅端订阅到了发布端发来的消息内容了,这样一个模拟的MQTT测试流程就结束了。

与OneNET服务器连接初体验

MQTT协议采用发布/订阅(Publish/Subscribe)模式, MQTT是应用层的协议,其底层为TCP协议,TCP是传输层协议 ,云端(服务器端)通过主题(Topic)的方式管理各个物联网设备的订阅,实现将设备与设备之间消息进行转发。一般物联网平台都是支持MQTT协议的,比如我们要接入的OneNET——中国移动物联网开放平台,也是支持MQTT协议的,具体支持的协议包括以下几种:

客户端

OneNET平台相当于MQTT中的Broker(服务器) ,要想实现与OneNET平台连接,我们需要一个客户端,而MQTT.fx是目前最常用的MQTT客户端,我们 使用的MQTT.fx的版本为1.7.1 。

MQTT.fx软件下载后,默认安装即可,安装完毕的软件界面如下:

客户端

MQTT.fx与OneNET服务器连接:

创建产品和设备

注册并登录OneNET平台的控制台

创建产品

创建设备

我们按照上面网文教程创建一个产品和一个测试设备:

客户端

服务器地址

OneNET物联网平台的地址和端口在下面链接获取:

客户端

Broker Address:mqtts.heclouds.com

Broker Port:1883

进入与MQTT服务器连接配置界面之后,将地址和端口填写到下图所示位置:

客户端

其他部分配置信息说明:

Profile Name:可以随便命名,我命名为:OneNET

Profile Type:保持默认设置。

Broker Address:MQTT服务器的地址,mqtt.heclouds.com

Broker Port:服务器端口,1883

Client ID:客户端ID,此处填写“设备名称”:XiaoHaLED

客户端

General标签下的内容,MQTT Version后面的复选框取消,其他默认即可。

填写用户凭证信息

在User Credentials标签页下面,需要我们填写User Name和Password 。

客户端

其中,User Name就是产品管理页面的产品ID ,对应我创建的测试设备就是:EyCs17z321。

Password应该填写鉴权信息,此处即为一个token。

生成token

token的介绍

token生成工具

OneNET提供了token生成的上位机软件,可以通过下面链接下载并使用:

客户端

其中:res:products/{pid}/devices/{device_name}

上面是res的值由产品ID和设备名称组成,通过上面我们知道,我们创建的测试设备的产品ID值为:EyCs17z321,设备名称的值为:XiaoHaLED 。

所以,最终res 的值为:products/EyCs17z321/devices/XiaoHaLED

et:expiration time,表示过期时间,此时间要求大于当前时间,为了避免太快过期,可以适当加大此参数数值,此处为unix时间。简单来说,unix时间戳就是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数。

除了使用程序获得当前unix时间以外,还可以使用网上现成的“unix时间戳 << >> 北京时间”转换的在线工具完成,比如下面的网址即可:

客户端

2024-05-16 1440 <==> et:1715839360

key:这个参数就是“ access_key ”这个参数:

cTNX52nLNysj9yvfuT+RQy2TPWkX4SszoQ+7xUsluRE=,

所在位置如下图所示:

客户端

其他参数默认即可。

将上面得到的res、et、key代入token计算工具软件中,点击Generate按钮:

客户端

生成的字符串即为User Credential标签页下面, Password文本框内需要填写的内容,即填写如下内容:

version=2018-10-31&res=products%2FEyCs17z321%2Fdevices%2FXiaoHaLED&et=1715839360&method=md5&sign=T1DUaZKADMMroYpR4G5aEg%3D%3D

其他参数默认即可,然后点击OK退出配置页面。

连接OneNET服务器

下图下拉列表中,选择刚刚创建的Profile Name:OneNET,点击“Connect”按钮,成功连接至OneNET平台服务器,效果如下图所示:

客户端

连接之后,我们查看OneNET控制台,在 设备接入与管理-->设备管理 页面,可以看到XiaoHaLED设备已经处于在线状态。

客户端

好了,我们已经顺利连接上了OneNET服务器。用这个MQTT.fx 软件也可以连接其他物联网平台,比如阿里云物联网平台。

7个发展趋势

随着MQTT在物联网中的使用规模不断增长,场景更加多样化,我们可以预见在 MQTT技术领域中将会出现以下7个发展趋势:

1、MQTT over QUIC

QUIC(Quick UDP Internet Connections)是由Google开发的一种新的传输协议,运行于UDP之上,旨在减少建立新连接所带来的延迟,提高数据传输速率,并解决 TCP 的一些限制。下一代互联网协议HTTP/3使用了QUIC作为底层传输协议,为网络应用带来了比 HTTP/2 更低的时延和更好的加载体验。

MQTT over QUIC是自2017年MQTT 5.0规范发布以来MQTT协议中最具创新性的进展。凭借多路复用、更快的连接建立和迁移等优势特性,其具有成为下一代 MQTT协议标准的潜力。

MQTT 5.0定义了三种传输类型:TCP、TLS和WebSocket。在物联网安全最佳实践中,MQTT over TLS/SSL广泛用于生产环境以保护客户端和Broker之间的通信。然而它速度慢、延迟高,需要3.5个RTT,即 TCP 3次握手以及TLS 4次握手才能建立新的MQTT连接。

与MQTT over TLS/SSL相比,MQTT over QUIC更快且延迟更低,在初次建立连接时仅需 1 RTT,并可以利用 0 RTT 连接恢复的特性来加速重连。QUIC协议栈可以针对各种用例进行定制,例如在不稳定网络环境下,或是客户端到服务器更低延迟通信的场景。它能够在诸如移动网络下的车联网(IoV)以及要求极低时延的工业物联网(IIoT)场景下发挥重要作用,并有效提升其使用体验。

客户端

2、MQTT Serverless

云计算中Serverless模式的兴起标志着应用的设计、开发、部署和运行方式发生了突破性的范式转变。这种模式下开发者将能够专注于应用的业务逻辑,无需管理基础设施,从而提高敏捷性、可扩展性和成本效益。

Serverless模式的MQTT消息服务器将是2023年的一种前沿架构创新。传统的物联网应用需要数分钟甚至数小时才能在云上或在企业私有环境中部署MQTT消息服务,相比之下,Serverless MQTT只需点击几下就能快速完成MQTT服务的部署。除了极快的部署速度,Serverless MQTT更大的价值在于其无可比拟的灵活性:根据用户需求对资源进行无缝扩展,以及与这种弹性架构相匹配的按量计费定价模式。Serverless MQTT有望推动MQTT更广泛地应用,降低运营成本,激发不同行业的创新协作。我们甚至可能看到每个物联网和工业物联网开发者都能拥有一个免费的 Serverless MQTT消息服务器。

3、MQTT多租户架构

多租户架构是实现Serverless MQTT服务的一个重要基础。来自不同用户或租户的物联网设备可以连接到同一个大规模的MQTT集群,同时保持其数据和业务逻辑与其他租户隔离。在SaaS应用中多租户架构很常见,即一个应用为多个客户或租户服务。其通常有两种以下不同的实现方式:租户隔离:向每个租户提供一个单独的应用实例,在服务器或虚拟机上运行。数据库隔离:多个租户共享一个应用实例,但每个租户有自己的数据库模式,以确保数据隔离。

在MQTT Broker的多租户架构中,每个设备和租户都有一个单独的、隔离的命名空间,包括一个独特的主题前缀和访问控制列表(ACL),用来定义用户可以发布或订阅哪些主题。多租户MQTT 消息服务器能够减少管理开销,并灵活支持复杂场景或大规模物联网应用场景。例如,一个大型组织中的部门和应用可以作为不同的租户使用同一个 MQTT集群。

4、MQTT Sparkplug 3.0

MQTT Sparkplug是由Eclipse基金会设计的开放标准规范,其最新版本为MQTT Sparkplug 3.0,它定义了工业设备的统一数据接入规范,能够通过MQTT协议连接各类工业传感器、动作执行器、可编程逻辑控制器(PLC)和网关。

MQTT Sparkplug 3.0于2022年11月发布,具有以下关键的新功能和改进:

MQTT 5.0支持:增加了对MQTT 5.0的支持,包括共享订阅、消息过期和流量控制等新功能。

优化的数据传输:对数据传输进行了优化,使用更紧凑的数据编码和压缩算法。

扩展的数据模型:引入了一个扩展的数据模型,它允许更详细的设备信息通信,还支持配置数据和设备元数据等其他信息的传输。

更高的安全性:包括对安全性的若干改进,如支持双向TLS认证、优化的访问控制机制等。

简化的设备管理:包括自动设备注册和发现,简化设备配置,以及改进诊断等。

MQTT Sparkplug旨在简化不同工业设备间的连接和通信,实现高效的工业数据采集、处理和分析。随着新版本的发布,MQTT Sparkplug 3.0将会在工业物联网领域得到更广泛的应用。

5、MQTT统一命名空间

统一命名空间(Unified Namespace)是一个建立在面向工业物联网和工业4.0的 MQTT Broker上的解决方案架构。它为MQTT主题提供了一个统一的命名空间,并为消息和结构化数据提供了一个集中的存储库。

统一命名空间使用中央MQTT Broker ,以星形拓扑结构连接工业设备、传感器和应用程序,如SCADA、MES 和 ERP。统一命名空间以事件驱动的架构极大简化了工业物联网应用的开发。在传统的工业物联网系统中,OT和IT系统通常是分开的,其数据、协议和工具均独立运行。通过采用统一命名空间,可以让OT和IT系统更有效地交换数据,最终实现物联网时代OT和IT的统一。如今,通过EMQ提供的开源 MQTT 消息服务器EMQX或NanoMQ,结合工业协议网关软件Neuron,用户将可以构建一个由 IT 界最先进技术支持的统一命名空间架构。

客户端

6、MQTT跨域集群

MQTT跨域集群(MQTT Geo-Distribution)是一个创新架构,允许部署在不同地区或云上的MQTT Broker作为一个单集群一起工作。通过跨域集群,MQTT消息可以在不同地区的MQTT Broker之间自动同步和传输。

有两种方法可以实现MQTT跨域集群:单集群,多地区:单个MQTT集群,每个节点在不同地区运行。多集群,多云:分布在不同云中的多个MQTT集群连接在一起。我们可以将这两种方法结合,在跨区域部署的MQTT Broker之间创建一个可靠的物联网数据基础设施。通过MQTT跨域集群,企业可以建立一个跨多云的全球MQTT接入网络。不管所处的物理位置在哪里,设备和应用都能从最近的节点接入实现相互通信。

7、MQTT Streams

MQTT Streams是MQTT协议备受期待的一项扩展能力,能够在MQTT Broker内实时处理海量、高频的数据流。这在发布订阅模式消息传输的基础上进一步增强了传统 MQTT Broker的能力。通过MQTT Streams,客户端可以像Apache Kafka一样将 MQTT消息以流的形式进行生产和消费,从而实现历史消息回放。这对事件驱动的处理尤为重要,可以确保最终的数据一致性、可审计和合规性。流处理对于从物联网设备产生的大量数据中实时挖掘商业价值至关重要。以前,这一过程通过一个过时且复杂的大数据堆栈实现,需要MQTT Broker与Kafka、Hadoop、Flink或Spark进行集成。而通过内置的流处理,MQTT Streams简化了物联网数据处理架构,提高了数据处理效率和响应时间,并为物联网提供了一个统一的消息传递和流处理平台。通过消息去重、消息重放和消息过期等功能,MQTT Streams实现了高吞吐量、低时延和容错,使其成为基于MQTT的物联网应用中实时数据流处理的强大工具。

总的来说,MQTT的这7个技术趋势反映了新兴技术的进步以及它们在推动物联网发展进程中的重要作用。作为一个发展了二十多年的标准消息传输协议,MQTT的重要性正在持续增长。随着物联网在各行业被越来越广泛地应用,MQTT协议也在不断发展以应对新的挑战,满足更低延迟的连接、更便捷的MQTT服务部署、复杂场景或大规模物联网应用下灵活管理以及工业设备接入的需求。作为庞大物联网的神经系统,在2023年及更远的未来,MQTT必将在工业物联网和车联网等关键领域中发挥重要作用。

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分