博客
关于我
MQTT 通信协议详解与应用场景全解析
阅读量:796 次
发布时间:2023-02-09

本文共 6920 字,大约阅读时间需要 23 分钟。

MQTT 协议深度解析:从基础到应用

一、引言:物联网时代的通信需求

在物联网时代,设备数量呈爆炸式增长。据统计,全球物联网设备连接数预计在未来几年将达到数百亿。如此庞大数量的设备相互通信,给传统通信协议带来了严峻挑战。为帮助小伙伴们更好地了解物联网通信技术,本文将对MQTT协议进行深入剖析,从其诞生背景到工作原理,再到实际应用场景,为大家提供全面的参考学习资料。

传统的HTTP/TCP协议在物联网场景中暴露出诸多局限性。HTTP协议是为网页浏览等场景设计,每次请求响应都需要建立完整的TCP连接,开销较大。对于资源受限、网络不稳定的物联网设备而言,频繁建立和关闭连接不仅耗费电量,还可能因网络波动导致连接失败。TCP协议虽然保证了数据的可靠传输,但它对网络带宽和稳定性要求较高,在弱网络环境下性能急剧下降。MQTT协议正是在这样的背景下应运而生。

二、MQTT协议基础解析

2.1 协议核心定义

MQTT即Message Queuing Telemetry Transport,是一种轻量级消息传输协议。它基于发布/订阅(Pub/Sub)模型,实现异步通信。在这种模型下,发布者无需知道订阅者的具体信息,只需将消息发布到特定主题。订阅者通过订阅感兴趣的主题来接收消息,这种解耦的通信方式使得系统具有更高的灵活性和可扩展性。

2.2 发展历程里程碑

1999年,IBM将MQTT协议应用于石油管道监控,成功解决了远程设备通信问题。经过多年发展,2014年MQTT成为OASIS开放标准,得到了更广泛的关注和应用。MQTT3.1.1到MQTT5.0有诸多核心改进。MQTT5.0引入了用户属性、共享订阅等新特性。用户属性可携带更多元数据,方便对消息进行更细致的分类和处理;共享订阅允许多个订阅者共享同一订阅,提高了资源利用效率。相比之下,MQTT3.1.1在功能丰富度上稍显不足。

2.3 协议核心架构

2.3.1 三大核心角色

  • 发布者(Publisher):负责生成并向代理服务器发送消息,消息会关联到特定主题。
  • 订阅者(Subscriber):向代理服务器订阅感兴趣的主题,接收发布者发布到这些主题的消息。
  • 代理服务器(Broker):作为消息的中转站,接收发布者的消息,并根据订阅关系将消息分发给相应的订阅者。

2.3.2 主题(Topic)

MQTT的主题树状结构设计,在整个通信架构中扮演着核心角色。它以层次化的形式,对信息进行清晰分类和组织。例如“home/room1/temperature”精准定位到家庭中特定房间的温度数据,让数据归属一目了然。通配符“+”和“#”的引入,极大提升了订阅的灵活性。例如“home/+ /temperature”中的“+”可匹配“home/room1/temperature”“home/room2/temperature”等多种同层级主题,这使得客户端能高效订阅特定类型数据,减少不必要的数据流量。而“home/#”中的“#”更是将匹配范围扩展到多层,涵盖“home/room1/temperature”“home/room1/light”等所有以“home”开头的主题,助力系统全面获取相关信息,为构建高效、灵活的MQTT通信网络奠定坚实基础。

2.3.3 服务质量等级(QoS)

  • QoS 0:最多一次传递。消息发送后,不等待确认,可能会丢失,适用于对消息丢失不敏感、数据量较大的场景,如环境传感器数据采集,偶尔丢失几个数据对整体分析影响不大。
  • QoS 1:至少一次传递。消息发送后,等待接收方确认,若未收到确认则重发,保证消息不会丢失,但可能会重复接收,常用于一般设备状态监控,如设备在线状态上报,重复几次不影响最终判断。
  • QoS 2:只有一次传递。这是最高等级服务质量,确保消息只被接收一次,不会丢失也不会重复。实现过程较为复杂,开销较大,适用于对数据准确性要求极高的场景,如医疗设备数据传输。

三、MQTT协议技术优势与局限性

3.1 核心优势场景

3.1.1 低带宽消耗

MQTT的最小报文只有2字节的头部。和HTTP这些协议比起来,传输开销少了太多。在那些网络带宽小的地方,比如说偏远地区的物联网设备,用MQTT传数据,效率要高得多。例如,在山区装的气象监测设备,靠MQTT协议,就能在有限的网络带宽条件下,稳稳当当地把监测数据传出去。

3.1.2 弱网络适应性

MQTT依靠心跳机制维持长连接。设备会定时给代理服务器发心跳包,就算网络突然断了一小会儿,等网络恢复,也能马上重新连接上,通信不会中断。例如,在移动网络信号不太稳定的场景里,比如说车载物联网设备,MQTT的这个特性,就能保证车子在跑的时候,也能和服务器一直保持联系。

3.1.3 海量设备扩展能力

好多实际例子都证明了,MQTT能支持10万级别的并发连接。比如说在大型智慧城市项目里,数不清的路灯、垃圾桶、交通传感器这些物联网设备,都通过MQTT协议和中心服务器沟通,设备管理起来特别高效,数据采集也很方便。

3.2 MQTT与其他通信协议对比

协议 MQTT HTTP CoAP AMQP WebSocket XMPP MQTT-SN
适用场景 物联网设备间异步通信,如智能家居设备状态更新 请求响应模式,网页浏览、API调用等 针对资源受限设备,物联网设备与服务器交互,如低功耗传感器数据传输 企业级复杂消息系统,如金融交易系统消息传递 实时双向通信,如Web聊天、实时监控 即时通讯,如聊天软件、在线游戏社交 专为资源极度受限的传感器网络设计,用于连接低功耗、低带宽设备
协议特性 轻量级,发布/订阅模式,支持QoS保证消息传输 适用于请求响应模式,基于文本的协议 针对资源受限设备设计,二进制格式、支持UDP 功能强大但复杂度高,支持多种消息模式 全双工通信,基于TCP,支持文本和二进制数据 基于XML,支持即时消息、Presence信息等 轻量级,在MQTT基础上优化,支持广播和多播
成熟度 较成熟,广泛应用于物联网领域 成熟,是互联网应用的基础协议 相对较新,随着物联网发展逐渐普及 成熟,在企业级应用中广泛使用 成熟,在Web实时应用中广泛采用 成熟,在即时通讯领域有长期应用 发展中,针对特定场景的应用逐渐增多
易用性 简单易用,客户端库丰富 较常用,使用方便,开发人员熟悉度高 针对特定场景设计,使用有一定门槛,需了解资源受限设备特性 复杂度高,使用难度较大,需要专业知识 中等,需要理解全双工通信和网络编程 较高,XML格式相对复杂 简单,专为资源受限设备设计
应用范围 广泛应用于物联网,如工业物联网、智能农业 广泛应用于互联网,涵盖几乎所有Web应用 应用于特定物联网场景,如智能建筑中的传感器网络 主要用于企业级场景,金融、电信等行业 主要用于Web应用,为网页提供实时交互能力 即时通讯应用,如社交软件、企业内部通讯 主要在低功耗、低带宽的物联网场景,如无线传感器网络

3.3 典型不适用场景

3.3.1 实时音视频流传输

实时音视频流特别看重实时性和连续性,MQTT的服务质量等级不太能满足这方面的要求。例如,WebRTC协议那可是专门为实时音视频通信设计的,它能通过自适应码率、丢包重传这些技术,确保音视频播放流畅。这么一对比,MQTT就不太适合实时音视频流传输这类场景啦。

3.3.2 需要强事务性的金融交易场景

金融交易对数据准确性和事务完整性要求极高,MQTT采用的最终一致性设计,达不到强事务性的需求。gRPC协议是基于HTTP/2的,支持双向流控、负载均衡等功能,在金融交易场景里,能更好地保证数据可靠传输,实现事务一致性,相比之下,它可比MQTT更适合这类场景。

四、MQTT协议典型应用场景

4.1 工业物联网(IIoT)

4.1.1 工厂设备状态监控

西门子PLC数据采集是典型案例。在工厂生产线上,大量西门子PLC通过MQTT协议将设备运行状态、故障信息等实时发送到监控中心。通过对这些数据的分析,管理人员可及时掌握设备运行情况,提前发现潜在故障隐患。

4.1.2 预测性维护场景中的异常预警推送

基于MQTT,设备可将运行数据实时上传至分析平台。当平台通过数据分析发现设备可能出现故障时,利用MQTT的消息推送功能,及时向维护人员发送异常预警,以便在设备故障前进行维护,降低停机时间和维护成本。

4.2 消费级IoT设备

4.2.1 智能家居设备联动

以HomeAssistant实现方案为例,用户可通过HomeAssistant平台配置各种智能家居设备(如智能灯泡、智能门锁、智能窗帘等)。这些设备通过MQTT协议相互通信,实现场景联动。例如当用户回家打开智能门锁时,通过MQTT消息触发,智能灯泡自动亮起,智能窗帘自动关闭。

4.2.2 可穿戴设备数据同步

可穿戴设备通常电量有限,MQTT的低带宽消耗和弱网络适应性优势明显。设备通过MQTT将心率、运动步数等数据同步到手机或云端。同时,采用电池优化策略,如设置合适的心跳间隔,在保证通信的同时降低电量消耗。

4.3 移动互联网应用

4.3.1 即时通讯消息推送

微信后台消息系统设计中,MQTT协议发挥了重要作用。当用户收到新消息时,服务器通过MQTT将消息推送给用户设备,实现即时通讯。即使微信在后台运行,也能快速接收消息,为用户提供良好的使用体验。

4.3.2 地理位置实时更新

在共享单车场景中,单车通过GPS获取位置信息,并利用MQTT将位置实时上传至服务器。服务器根据这些位置信息,为用户提供附近单车位置查询服务,同时也便于运营人员对单车进行调度管理。

4.4 车联网(V2X)

4.4.1 电动汽车充电桩状态广播

电动汽车充电桩通过MQTT协议将自身状态(如空闲、充电中、故障等)广播出去。车主可通过手机应用实时查询附近充电桩状态,提前规划充电行程,提高充电效率。

4.4.2 自动驾驶车辆的路况信息同步

自动驾驶车辆通过传感器获取路况信息(如道路拥堵、事故等),利用MQTT将这些信息同步给其他车辆和交通管理中心。其他车辆根据这些信息调整行驶路线,交通管理中心也可根据路况信息进行交通疏导,提高交通效率。

五、MQTT协议部署简单说明

5.1 Broker选型对比

5.1.1 开源方案

  • Mosquitto:轻量级开源MQTT代理服务器,易于部署和使用,适合小型项目或测试环境。它对硬件资源要求较低,在树莓派等小型设备上也能稳定运行。
  • EMQX:高性能开源MQTTBroker,支持百万级并发连接,适用于大规模物联网项目。它具有丰富的插件机制,可方便地进行功能扩展。
  • HiveMQ:企业级开源MQTTBroker,提供了高可用性、集群管理等特性,适合对可靠性和性能要求较高的企业应用。

5.1.2 云服务方案

  • AWS IoT Core:亚马逊提供的物联网云服务,集成了MQTTBroker功能。它与AWS其他服务(如Lambda、DynamoDB等)无缝集成,方便构建复杂的物联网应用。
  • Aliyun IoT平台:阿里云的物联网平台,同样支持MQTT协议。具有设备管理、数据分析等功能,为企业提供一站式物联网解决方案。

5.2 客户端简单的实践示例

5.2.1 Python(Paho - MQTT)代码示例

import paho.mqtt.client as mqtt# 连接成功回调函数def on_connect(client, userdata, flags, rc):    print("Connected with result code " + str(rc))client.subscribe("test/topic")# 消息接收回调函数def on_message(client, userdata, msg):    print(msg.topic + " " + str(msg.payload))client = mqtt.Client()client.on_connect = on_connectclient.on_message = on_messageclient.connect("broker.example.com", 1883, 60)client.loop_start()try:    while True:        passexcept KeyboardInterrupt:    client.loop_stop()client.disconnect()

5.2.2 JavaScript(MQTT.js)代码示例

const mqtt = require('mqtt');const client = mqtt.connect('mqtt://broker.example.com:1883');client.on('connect', function() {    console.log('Connected');    client.subscribe('test/topic');});client.on('message', function(topic, message) {    console.log(topic + ':' + message.toString());});

5.2.3 QoS2消息可靠传输的完整实现流程

以Python的Paho-MQTT库为例,要实现QoS2消息可靠传输,首先在发布消息时设置qos = 2,如client.publish("test/topic", "message", qos = 2)。在接收方,当on_message回调函数被触发时,Paho-MQTT库会自动处理QoS2的确认流程,确保消息只被接收一次。

5.3 安全加固方案简介

5.3.1 TLS/SSL加密通道配置要点

为MQTT通信配置TLS/SSL加密通道,首先需要获取服务器证书和私钥。在服务器端,将证书和私钥配置到MQTTBroker中,如在Mosquitto中,通过修改配置文件mosquitto.conf,添加cafile(证书颁发机构文件路径)、certfile(服务器证书文件路径)、keyfile(服务器私钥文件路径)等配置项。在客户端,同样需要配置证书相关信息,以验证服务器身份,防止中间人攻击。

5.3.2 客户端证书 + ACL权限控制最佳实践

客户端证书用于验证客户端身份。在客户端连接服务器时,携带客户端证书进行身份验证。ACL(访问控制列表)权限控制可进一步细化权限管理。例如在Mosquitto中,通过配置acl_file指定ACL文件路径,在ACL文件中定义不同客户端对不同主题的读写权限,如user client1; topic read test/topic1表示客户端client1对test/topic1主题有读取权限。

六、MQTT协议未来展望

MQTT5.0带来了不少新花样,像用户属性、共享订阅,这些对行业影响可不小。用户属性这功能,能让设备带上更多我们自己定义的信息,企业管起数据、做业务分析来就更方便,更精准了。共享订阅呢,能提高资源利用效率,特别是一大堆物联网设备都订阅同一个主题的时候,服务器的压力能小不少。

未来,MQTT和边缘计算一起合作是个大趋势。边缘计算可以在靠近设备的地方处理数据,这样需要传输的数据量就少了。MQTT协议跟边缘计算一结合,在边缘设备上弄个MQTTBroker,设备之间通信、处理数据的速度就能变快,整个系统响应也更及时。

在卫星物联网(SatIoT)这些新冒出来的领域,MQTT协议也在试着大展身手。卫星物联网网络延迟高,带宽还有限,而MQTT耗带宽少,适应弱网络的能力又强,说不定能给卫星物联网设备通信提供个好办法。

七、总结

从CAP理论视角审视,MQTT的最终一致性设计在可用性与分区容错性方面大放异彩,契合绝大多数物联网应用场景。在那些对一致性要求相对宽松,却对设备连接规模、网络适应性有着严苛标准的情境下,MQTT无疑是理想之选。

最后带来一点个人的简单选型意见:

  • 项目要素评估:全面考量项目中的设备数量、网络环境以及数据传输需求等关键要素。若设备众多且网络状况不稳定,同时对实时性要求并不严苛,MQTT极有可能成为适配该项目的绝佳协议。
  • 数据特性权衡:审慎斟酌数据准确性与事务性需求。倘若项目对数据准确性有着极高的要求,且存在强事务性操作,在选用MQTT时便需慎之又慎,不妨探索其他更为契合的协议选项。
  • 预算周期考量:深入分析项目预算与开发周期。开源的MQTTBroker能够有效降低成本,而云服务方案则可大幅缩短开发周期,开发者需依据实际情形精准权衡利弊。
  • 安全需求保障:高度重视安全需求。务必确保所选协议能够全方位满足项目的安全标准,诸如支持TLS/SSL加密、身份验证以及权限控制等关键安全功能。

转载地址:http://qtffk.baihongyu.com/

你可能感兴趣的文章
mysql 编译安装 window篇
查看>>
mysql 网络目录_联机目录数据库
查看>>
MySQL 聚簇索引&&二级索引&&辅助索引
查看>>
Mysql 脏页 脏读 脏数据
查看>>
mysql 自增id和UUID做主键性能分析,及最优方案
查看>>
Mysql 自定义函数
查看>>
mysql 行转列 列转行
查看>>
Mysql 表分区
查看>>
mysql 表的操作
查看>>
mysql 视图,视图更新删除
查看>>