您的位置>首页>商学院

物联网“MQTT”协议

MQTT 是物联网和需要高效、异步、双向通信场景下的事实标准协议。它的轻量、可靠、灵活和可扩展性使其在资源受限的环境中表现出色,成为连接物理世界与数字世界的桥梁。

一、什么是 MQTT?

MQTT 是一种轻量级的、基于发布/订阅模式的消息传输协议。它专为在低带宽、高延迟或不稳定的网络环境中进行高效、可靠的通信而设计。

  • 全称: Message Queuing Telemetry Transport,但现在的官方解释是 MQ Telemetry Transport

  • 核心思想:将消息的发送者(发布者)与接收者(订阅者)解耦。发布者不关心谁接收消息,订阅者也不关心消息从哪里来,双方只与一个中间代理(Broker)通信。

  • 设计目标

    1. 简单轻量:协议头部很小,最小只有2字节,节省网络流量和设备功耗。

    2. 易于实现:客户端库非常小巧,适合嵌入式设备(如单片机)。

    3. 可靠性:提供三种服务质量等级,确保消息可靠传递。

    4. 双向通信:通过 Broker 可以轻松实现设备到云、云到设备、设备到设备的消息传递。


二、核心架构与基本概念

MQTT 架构包含三个核心角色:

  1. 发布者:将消息发送到特定主题的客户端。

  2. 订阅者:订阅感兴趣的主题以接收消息的客户端。

  3. 代理:MQTT Broker,是整个系统的核心枢纽。它负责接收来自发布者的消息,并根据主题将消息转发给所有订阅了该主题的订阅者。

核心概念:

  • 主题:一个UTF-8字符串,用于标识消息的分类。Broker 根据主题进行消息路由。

    • 结构:层级结构,用斜杠 / 分隔。例如:home/livingroom/temperature, sensor/+/data

    • 通配符

      • +:单层通配符。例如:sensor/+/data 匹配 sensor/1/data,但不匹配 sensor/1/2/data

      • #:多层通配符。只能放在末尾。例如:home/# 匹配 home/livingroom/temperature 和 home/kitchen/light

  • 客户端:任何运行 MQTT 库并连接到 Broker 的设备或应用程序(可以是发布者、订阅者或两者兼有)。

  • 消息:传输的数据载荷,可以是任何格式(JSON, 二进制, 文本等)。

图解工作流程:

text
发布者 (Publisher) --发布消息到 "topic/A" -->  代理 (Broker)  --将消息推送给-->  订阅了 "topic/A" 的订阅者 (Subscriber 1, Subscriber 2)

三、MQTT 协议特性详解

1. 服务质量

这是 MQTT 可靠性的核心,定义了消息传递的保证级别。

 
 
QoS 等级 名称 描述 最少次数 典型应用场景
QoS 0 至多一次 “发完即忘”。不保证送达,不保证去重。 1 不重要的数据,如周期性的传感器读数(允许丢失)
QoS 1 至少一次 保证消息至少送达一次,但可能重复。需要确认。 2 需要确保送达,但可以容忍重复,如控制命令
QoS 2 恰好一次 最高等级,保证消息有且仅有一次送达。流程最复杂。 4 非常重要的数据,绝对不能丢失或重复,如金融交易、关键状态更新

2. 连接与会话

  • 持久会话:客户端连接时,可以设置 Clean Session = false。这样,当客户端断开连接后,Broker 会为其保留订阅信息和可能的离线消息(QoS 1/2)。客户端重连后能恢复状态并收到离线期间的消息。

  • 遗嘱消息:客户端在连接时可以设置一个“遗嘱”。如果客户端非正常断开(如网络故障),Broker 会自动将这条遗嘱消息发布到指定主题,通知其他客户端该设备已离线。

3. 保留消息

发布者可以设置消息为“保留”消息。Broker 会为每个主题保存最后一条保留消息。当有新客户端订阅该主题时,它会立即收到这条保留消息,而不必等待下一次发布。这对于获取设备最新状态非常有用。


四、MQTT 5.0 与 3.1.1 的主要区别

MQTT 5.0 在 3.1.1 的基础上,增加了大量企业级特性和增强功能,但保持核心协议不变,完全兼容其思想。

 
 
特性 MQTT 3.1.1 MQTT 5.0
原因码 连接返回码简单 每个操作(连接、发布、订阅等)都有详细的原因码,便于诊断。
共享订阅 不支持 支持,可将一个主题的消息负载均衡到一组订阅者,实现水平扩展。
消息过期 不支持 消息可以设置生命周期,过期后 Broker 自动丢弃。
主题别名 不支持 可以用一个短数字ID(如 1)代替长主题名(如 very/long/topic/name),节省带宽。
用户属性 不支持 可以为消息或连接附加自定义键值对元数据,实现更灵活的业务逻辑。
流量控制 较弱 新增“接收最大值”等属性,帮助客户端控制接收速度。
会话过期间隔 固定 客户端可以指定会话在断开后保留多久。

建议:新项目应优先考虑 MQTT 5.0。


五、典型应用场景

  1. 物联网最主要、最经典的应用领域。智能家居(灯光、温控器)、工业物联网(设备监控)、可穿戴设备等。

  2. 移动推送:替代部分HTTP长连接,实现 App 的实时消息推送(如聊天、新闻)。

  3. 车联网:车辆与云平台之间传输状态、位置、诊断数据。

  4. 即时通讯:轻量级的聊天应用。

  5. 微服务通信:在服务网格内部,作为轻量级的异步事件总线。


六、主流 Broker 与客户端

  • Broker(服务器)

    • EMQX: 高性能、分布式、云原生的开源 Broker,功能强大,支持 MQTT 5.0。

    • Mosquitto: Eclipse 基金会的轻量级开源 Broker,非常流行,适合学习和中小型部署。

    • HiveMQ: 企业级商业 Broker,提供高可靠性和丰富功能。

    • NanoMQ: 边缘计算场景下的超轻量级 Broker。

    • 云服务商: AWS IoT Core, Azure IoT Hub, 阿里云物联网平台, 腾讯云物联网通信等,都内置了 MQTT Broker 服务。

  • 客户端库

    • 几乎所有编程语言都有成熟的库:Paho(Python, Java, C等), Eclipse Mosquitto Client Library(C/C++), MQTT.js(JavaScript), MQTTnet(.NET)等。


七、优缺点总结

  • 优点

    • 极低的开销: 协议头小,省电省流量。

    • 高可扩展性: 发布/订阅模式天然解耦,易于水平扩展。

    • 灵活可靠: 三种 QoS 满足不同场景需求。

    • 双向实时通信: 非常适合设备与云的交互。

    • 生态成熟: 广泛的客户端、Broker 和云服务支持。

  • 缺点

    • 不适合点对点: 所有通信必须通过 Broker。

    • 安全性依赖实现: 协议本身支持 TLS/SSL 和用户名密码,但需要正确配置。

    • 无内置数据格式: 消息载荷格式需自行定义(通常用 JSON)。


八、快速体验

你可以立即在公共 Broker 上体验 MQTT:

  1. 工具:使用 MQTTX(桌面客户端)或在线 MQTT 调试工具。

  2. 公共 Brokerbroker.hivemq.com(端口 1883), test.mosquitto.org(端口 1883)。

  3. 简单测试

    • 用两个客户端连接到同一个公共 Broker。

    • 客户端A订阅主题 my/test/topic

    • 客户端B向主题 my/test/topic 发布一条消息。

    • 观察客户端A是否立刻收到消息。


总结

MQTT 是物联网和需要高效、异步、双向通信场景下的事实标准协议。它的轻量、可靠、灵活和可扩展性使其在资源受限的环境中表现出色,成为连接物理世界与数字世界的桥梁。

在选择时,如果你需要极致的轻量和简单,或与老旧系统兼容,可选 MQTT 3.1.1。对于新项目,尤其是需要企业级特性的,强烈推荐 MQTT 5.0

撼动科技

扫描上方二维码,关注撼动科技




 


服务推荐

立即咨询产品顾问获取精准解决方案 立即咨询
13718919060