本文共 6920 字,大约阅读时间需要 23 分钟。
在物联网时代,设备数量呈爆炸式增长。据统计,全球物联网设备连接数预计在未来几年将达到数百亿。如此庞大数量的设备相互通信,给传统通信协议带来了严峻挑战。为帮助小伙伴们更好地了解物联网通信技术,本文将对MQTT协议进行深入剖析,从其诞生背景到工作原理,再到实际应用场景,为大家提供全面的参考学习资料。
传统的HTTP/TCP协议在物联网场景中暴露出诸多局限性。HTTP协议是为网页浏览等场景设计,每次请求响应都需要建立完整的TCP连接,开销较大。对于资源受限、网络不稳定的物联网设备而言,频繁建立和关闭连接不仅耗费电量,还可能因网络波动导致连接失败。TCP协议虽然保证了数据的可靠传输,但它对网络带宽和稳定性要求较高,在弱网络环境下性能急剧下降。MQTT协议正是在这样的背景下应运而生。
MQTT即Message Queuing Telemetry Transport,是一种轻量级消息传输协议。它基于发布/订阅(Pub/Sub)模型,实现异步通信。在这种模型下,发布者无需知道订阅者的具体信息,只需将消息发布到特定主题。订阅者通过订阅感兴趣的主题来接收消息,这种解耦的通信方式使得系统具有更高的灵活性和可扩展性。
1999年,IBM将MQTT协议应用于石油管道监控,成功解决了远程设备通信问题。经过多年发展,2014年MQTT成为OASIS开放标准,得到了更广泛的关注和应用。MQTT3.1.1到MQTT5.0有诸多核心改进。MQTT5.0引入了用户属性、共享订阅等新特性。用户属性可携带更多元数据,方便对消息进行更细致的分类和处理;共享订阅允许多个订阅者共享同一订阅,提高了资源利用效率。相比之下,MQTT3.1.1在功能丰富度上稍显不足。
MQTT的主题树状结构设计,在整个通信架构中扮演着核心角色。它以层次化的形式,对信息进行清晰分类和组织。例如“home/room1/temperature”精准定位到家庭中特定房间的温度数据,让数据归属一目了然。通配符“+”和“#”的引入,极大提升了订阅的灵活性。例如“home/+ /temperature”中的“+”可匹配“home/room1/temperature”“home/room2/temperature”等多种同层级主题,这使得客户端能高效订阅特定类型数据,减少不必要的数据流量。而“home/#”中的“#”更是将匹配范围扩展到多层,涵盖“home/room1/temperature”“home/room1/light”等所有以“home”开头的主题,助力系统全面获取相关信息,为构建高效、灵活的MQTT通信网络奠定坚实基础。
MQTT的最小报文只有2字节的头部。和HTTP这些协议比起来,传输开销少了太多。在那些网络带宽小的地方,比如说偏远地区的物联网设备,用MQTT传数据,效率要高得多。例如,在山区装的气象监测设备,靠MQTT协议,就能在有限的网络带宽条件下,稳稳当当地把监测数据传出去。
MQTT依靠心跳机制维持长连接。设备会定时给代理服务器发心跳包,就算网络突然断了一小会儿,等网络恢复,也能马上重新连接上,通信不会中断。例如,在移动网络信号不太稳定的场景里,比如说车载物联网设备,MQTT的这个特性,就能保证车子在跑的时候,也能和服务器一直保持联系。
好多实际例子都证明了,MQTT能支持10万级别的并发连接。比如说在大型智慧城市项目里,数不清的路灯、垃圾桶、交通传感器这些物联网设备,都通过MQTT协议和中心服务器沟通,设备管理起来特别高效,数据采集也很方便。
协议 | MQTT | HTTP | CoAP | AMQP | WebSocket | XMPP | MQTT-SN |
---|---|---|---|---|---|---|---|
适用场景 | 物联网设备间异步通信,如智能家居设备状态更新 | 请求响应模式,网页浏览、API调用等 | 针对资源受限设备,物联网设备与服务器交互,如低功耗传感器数据传输 | 企业级复杂消息系统,如金融交易系统消息传递 | 实时双向通信,如Web聊天、实时监控 | 即时通讯,如聊天软件、在线游戏社交 | 专为资源极度受限的传感器网络设计,用于连接低功耗、低带宽设备 |
协议特性 | 轻量级,发布/订阅模式,支持QoS保证消息传输 | 适用于请求响应模式,基于文本的协议 | 针对资源受限设备设计,二进制格式、支持UDP | 功能强大但复杂度高,支持多种消息模式 | 全双工通信,基于TCP,支持文本和二进制数据 | 基于XML,支持即时消息、Presence信息等 | 轻量级,在MQTT基础上优化,支持广播和多播 |
成熟度 | 较成熟,广泛应用于物联网领域 | 成熟,是互联网应用的基础协议 | 相对较新,随着物联网发展逐渐普及 | 成熟,在企业级应用中广泛使用 | 成熟,在Web实时应用中广泛采用 | 成熟,在即时通讯领域有长期应用 | 发展中,针对特定场景的应用逐渐增多 |
易用性 | 简单易用,客户端库丰富 | 较常用,使用方便,开发人员熟悉度高 | 针对特定场景设计,使用有一定门槛,需了解资源受限设备特性 | 复杂度高,使用难度较大,需要专业知识 | 中等,需要理解全双工通信和网络编程 | 较高,XML格式相对复杂 | 简单,专为资源受限设备设计 |
应用范围 | 广泛应用于物联网,如工业物联网、智能农业 | 广泛应用于互联网,涵盖几乎所有Web应用 | 应用于特定物联网场景,如智能建筑中的传感器网络 | 主要用于企业级场景,金融、电信等行业 | 主要用于Web应用,为网页提供实时交互能力 | 即时通讯应用,如社交软件、企业内部通讯 | 主要在低功耗、低带宽的物联网场景,如无线传感器网络 |
实时音视频流特别看重实时性和连续性,MQTT的服务质量等级不太能满足这方面的要求。例如,WebRTC协议那可是专门为实时音视频通信设计的,它能通过自适应码率、丢包重传这些技术,确保音视频播放流畅。这么一对比,MQTT就不太适合实时音视频流传输这类场景啦。
金融交易对数据准确性和事务完整性要求极高,MQTT采用的最终一致性设计,达不到强事务性的需求。gRPC协议是基于HTTP/2的,支持双向流控、负载均衡等功能,在金融交易场景里,能更好地保证数据可靠传输,实现事务一致性,相比之下,它可比MQTT更适合这类场景。
西门子PLC数据采集是典型案例。在工厂生产线上,大量西门子PLC通过MQTT协议将设备运行状态、故障信息等实时发送到监控中心。通过对这些数据的分析,管理人员可及时掌握设备运行情况,提前发现潜在故障隐患。
基于MQTT,设备可将运行数据实时上传至分析平台。当平台通过数据分析发现设备可能出现故障时,利用MQTT的消息推送功能,及时向维护人员发送异常预警,以便在设备故障前进行维护,降低停机时间和维护成本。
以HomeAssistant实现方案为例,用户可通过HomeAssistant平台配置各种智能家居设备(如智能灯泡、智能门锁、智能窗帘等)。这些设备通过MQTT协议相互通信,实现场景联动。例如当用户回家打开智能门锁时,通过MQTT消息触发,智能灯泡自动亮起,智能窗帘自动关闭。
可穿戴设备通常电量有限,MQTT的低带宽消耗和弱网络适应性优势明显。设备通过MQTT将心率、运动步数等数据同步到手机或云端。同时,采用电池优化策略,如设置合适的心跳间隔,在保证通信的同时降低电量消耗。
微信后台消息系统设计中,MQTT协议发挥了重要作用。当用户收到新消息时,服务器通过MQTT将消息推送给用户设备,实现即时通讯。即使微信在后台运行,也能快速接收消息,为用户提供良好的使用体验。
在共享单车场景中,单车通过GPS获取位置信息,并利用MQTT将位置实时上传至服务器。服务器根据这些位置信息,为用户提供附近单车位置查询服务,同时也便于运营人员对单车进行调度管理。
电动汽车充电桩通过MQTT协议将自身状态(如空闲、充电中、故障等)广播出去。车主可通过手机应用实时查询附近充电桩状态,提前规划充电行程,提高充电效率。
自动驾驶车辆通过传感器获取路况信息(如道路拥堵、事故等),利用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()
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());});
以Python的Paho-MQTT库为例,要实现QoS2消息可靠传输,首先在发布消息时设置qos = 2,如client.publish("test/topic", "message", qos = 2)。在接收方,当on_message回调函数被触发时,Paho-MQTT库会自动处理QoS2的确认流程,确保消息只被接收一次。
为MQTT通信配置TLS/SSL加密通道,首先需要获取服务器证书和私钥。在服务器端,将证书和私钥配置到MQTTBroker中,如在Mosquitto中,通过修改配置文件mosquitto.conf,添加cafile(证书颁发机构文件路径)、certfile(服务器证书文件路径)、keyfile(服务器私钥文件路径)等配置项。在客户端,同样需要配置证书相关信息,以验证服务器身份,防止中间人攻击。
客户端证书用于验证客户端身份。在客户端连接服务器时,携带客户端证书进行身份验证。ACL(访问控制列表)权限控制可进一步细化权限管理。例如在Mosquitto中,通过配置acl_file指定ACL文件路径,在ACL文件中定义不同客户端对不同主题的读写权限,如user client1; topic read test/topic1表示客户端client1对test/topic1主题有读取权限。
MQTT5.0带来了不少新花样,像用户属性、共享订阅,这些对行业影响可不小。用户属性这功能,能让设备带上更多我们自己定义的信息,企业管起数据、做业务分析来就更方便,更精准了。共享订阅呢,能提高资源利用效率,特别是一大堆物联网设备都订阅同一个主题的时候,服务器的压力能小不少。
未来,MQTT和边缘计算一起合作是个大趋势。边缘计算可以在靠近设备的地方处理数据,这样需要传输的数据量就少了。MQTT协议跟边缘计算一结合,在边缘设备上弄个MQTTBroker,设备之间通信、处理数据的速度就能变快,整个系统响应也更及时。
在卫星物联网(SatIoT)这些新冒出来的领域,MQTT协议也在试着大展身手。卫星物联网网络延迟高,带宽还有限,而MQTT耗带宽少,适应弱网络的能力又强,说不定能给卫星物联网设备通信提供个好办法。
从CAP理论视角审视,MQTT的最终一致性设计在可用性与分区容错性方面大放异彩,契合绝大多数物联网应用场景。在那些对一致性要求相对宽松,却对设备连接规模、网络适应性有着严苛标准的情境下,MQTT无疑是理想之选。
最后带来一点个人的简单选型意见:
转载地址:http://qtffk.baihongyu.com/