当前位置: 首页 > news >正文

MQTT详细介绍

MQTT (Message Queuing Telemetry Transport)详细介绍

MQTT 是一种轻量级的、基于发布/订阅模式的消息传输协议,专为低带宽、高延迟或不可靠的网络环境设计。它由 IBM 的 Andy Stanford-Clark 和 Arlen Nipper 在 1999 年首次设计,最初用于监控通过卫星连接的石油管道。如今,它已成为物联网(IoT)领域消息传递的事实标准,并于 2014 年成为 OASIS 开放标准。

核心概念

  1. 发布/订阅模式 (Publish/Subscribe Pattern)

    • 发布者 (Publisher):消息的发送方。它将消息发布到一个特定的“主题”(Topic)。发布者不直接与订阅者通信,它只关心将消息发送到 Broker。
    • 订阅者 (Subscriber):消息的接收方。它向 Broker 订阅感兴趣的“主题”。当有消息发布到这些主题时,Broker 会将消息推送给订阅者。订阅者不直接与发布者通信。
    • 代理/中间件 (Broker):核心组件,负责接收来自发布者的消息,并根据订阅关系将消息路由(转发)给相应的订阅者。Broker 解耦了发布者和订阅者。
    • 主题 (Topic):消息的“地址”或“标签”。主题是分层结构的字符串,使用 / 作为分隔符(例如 home/livingroom/temperaturesensor/+/data)。订阅者可以订阅精确的主题,也可以使用通配符来订阅多个主题。
  2. 客户端 (Client)

    • 任何连接到 Broker 并能发布或订阅消息的设备或应用程序都可以称为客户端。一个客户端既可以是发布者,也可以是订阅者,或者两者都是。

主要特点和优势

  1. 轻量级和高效

    • 消息头部小:MQTT 消息的固定头部只有 2 字节,非常小,减少了网络开销。
    • 协议命令简单:定义的命令数量有限(如 CONNECT, PUBLISH, SUBSCRIBE 等),易于实现和理解。
  2. 低带宽占用:由于消息头部小和协议简洁,非常适合带宽受限的环境。

  3. 低功耗:对设备端的计算和内存资源要求低,适合电池供电的设备。

  4. 可靠的消息传递 (Quality of Service - QoS):MQTT 提供了三种不同的服务质量等级,以平衡消息传递的可靠性和网络开销:

    • QoS 0 (At most once - 最多一次):消息尽力发送,不保证送达,也不保证仅送达一次(可能丢失,也可能重复)。这是最快的传输方式,开销最小。相当于“发后不管”。
    • QoS 1 (At least once - 至少一次):保证消息至少送达一次。接收方需要确认收到消息(PUBACK)。如果发送方没有收到确认,会重发消息,这可能导致消息重复。
    • QoS 2 (Exactly once - 精确一次):保证消息仅送达一次。这是最可靠的级别,但也是开销最大、最慢的。它通过一个四步握手机制(PUBREC, PUBREL, PUBCOMP)来确保不丢失也不重复。
  5. 会话感知 (Session Awareness)

    • Clean Session (清理会话):当客户端连接 Broker 时,可以设置 CleanSession 标志。
      • CleanSession = true:客户端断开连接后,Broker 会清除其所有会话信息(包括订阅关系和未发送的 QoS 1/2 消息)。客户端重新连接时,需要重新订阅。
      • CleanSession = false (Persistent Session - 持久会话):客户端断开连接后,Broker 会保留其会话信息。当客户端(使用相同的 Client ID)重新连接时,Broker 会将会话期间错过的 QoS 1 和 QoS 2 消息发送给它,并且订阅关系也会被保留。这对于网络不稳定的客户端非常重要。
  6. 遗嘱机制 (Last Will and Testament - LWT)

    • 客户端在连接 Broker 时可以指定一个“遗嘱”消息。如果客户端异常断开(例如掉电、网络故障,而不是正常发送 DISCONNECT 包),Broker 会自动将这个遗嘱消息发布到指定的主题。这使得其他客户端可以感知到某个设备意外离线。
  7. 保留消息 (Retained Messages)

    • 当发布者向某个主题发布一条消息时,可以将该消息标记为“保留消息”。Broker 会存储这条被标记为“保留”的最新消息。当有新的订阅者订阅这个主题时,Broker 会立即将这条保留消息发送给它,这样新的订阅者就能立刻获取到该主题的最新状态,而无需等待下一次发布。
  8. Keep Alive (心跳机制)

    • 客户端在连接时可以设置一个 Keep Alive 时间间隔。在此间隔内,如果客户端没有发送任何其他控制报文,它必须发送一个 PINGREQ 报文给 Broker,Broker 会响应 PINGRESP。这使得双方能够检测到连接是否仍然有效,防止因中间网络设备超时而断开连接。

MQTT 报文结构

MQTT 报文由三部分组成:

  1. 固定报头 (Fixed Header):所有 MQTT 报文都包含。包含报文类型、标志位(如 DUP, QoS, RETAIN)和剩余长度。
  2. 可变报头 (Variable Header):某些报文类型包含。例如,PUBLISH 报文的可变报头包含主题名和报文标识符(用于 QoS 1 和 2)。
  3. 有效载荷 (Payload):消息的实际内容。对于 PUBLISH 报文,这是应用程序数据。Broker 不关心 Payload 的具体格式,它可以是 JSON、XML、二进制数据等。其最大长度可达 256MB,但通常远小于此值。

常用的 MQTT 控制报文类型

  • CONNECT:客户端请求连接到 Broker。
  • CONNACK:Broker 响应连接请求。
  • PUBLISH:发布消息。
  • PUBACK:发布回执 (QoS 1)。
  • PUBREC:发布收到 (QoS 2 第一步)。
  • PUBREL:发布释放 (QoS 2 第二步)。
  • PUBCOMP:发布完成 (QoS 2 第三步)。
  • SUBSCRIBE:客户端订阅主题。
  • SUBACK:订阅回执。
  • UNSUBSCRIBE:客户端取消订阅主题。
  • UNSUBACK:取消订阅回执。
  • PINGREQ:心跳请求。
  • PINGRESP:心跳响应。
  • DISCONNECT:客户端请求断开连接。

工作流程示例

  1. 连接:客户端 A 和 B 都向 Broker 发送 CONNECT 请求。Broker 回复 CONNACK
  2. 订阅:客户端 B 向 Broker 发送 SUBSCRIBE 请求,订阅主题 sensor/temp。Broker 回复 SUBACK
  3. 发布:客户端 A 向 Broker 发送 PUBLISH 请求,将消息(例如温度数据)发布到主题 sensor/temp
  4. 转发:Broker 收到来自客户端 A 的消息后,检查其订阅列表,发现客户端 B 订阅了 sensor/temp 主题,于是将该消息转发给客户端 B。

主题通配符 (Topic Wildcards)

MQTT 订阅时支持两种通配符:

  • 单层通配符 +:匹配主题层级中的单个层级。
    • 例如:sensor/+/temperature 可以匹配 sensor/livingroom/temperaturesensor/bedroom/temperature,但不能匹配 sensor/temperaturesensor/livingroom/office/temperature
  • 多层通配符 #:匹配主题层级中的任意数量的层级(包括零层),并且必须是主题的最后一级。
    • 例如:sensor/bedroom/# 可以匹配 sensor/bedroom/temperaturesensor/bedroom/humidity/raw 甚至 sensor/bedroom (如果 Broker 支持)。
    • # 单独使用表示订阅所有主题(通常不推荐,可能导致 Broker 和客户端负载过高)。

安全性

MQTT 本身协议层面提供的安全机制比较基础,但可以通过以下方式增强:

  1. 网络层安全:使用 TLS/SSL (MQTT over TLS/SSL,通常端口为 8883) 对通信数据进行加密,防止窃听和篡改。
  2. 应用层认证
    • Client ID:每个连接到 Broker 的客户端必须有唯一的 Client ID。
    • 用户名/密码CONNECT 报文中可以包含用户名和密码,Broker 可以据此进行认证。
  3. 授权 (ACL - Access Control Lists):Broker 可以配置 ACL,限制特定用户(或 Client ID)对特定主题的发布和订阅权限。
  4. 消息加密:Payload 本身可以由应用程序进行加密,Broker 不感知其内容。

常见的 MQTT Broker 实现

  • Mosquitto:一个流行的开源 MQTT Broker,轻量级且易于部署。
  • EMQX:一个大规模分布式 MQTT Broker,功能丰富,支持海量并发连接。
  • HiveMQ:一个企业级的 MQTT Broker,提供商业支持和高级特性。
  • VerneMQ:另一个高性能、可扩展的开源 MQTT Broker。
  • 云服务商提供的 MQTT 服务:如 AWS IoT Core, Azure IoT Hub, Google Cloud IoT (虽然 Google Cloud IoT 将停用,但曾是选项) 等,它们通常集成了 MQTT Broker 功能,并提供了设备管理、数据处理等附加服务。

应用场景

MQTT 因其特性被广泛应用于:

  • 物联网 (IoT):智能家居、工业自动化 (IIoT)、智慧城市、可穿戴设备、环境监测、车联网等。
  • 移动应用:消息推送(如 Facebook Messenger 曾使用 MQTT)。
  • SCADA 系统:监控和数据采集。
  • 遥测:收集和传输来自远程设备的数据。

总结

MQTT 是一种简单、轻量、灵活且可靠的消息协议,通过其发布/订阅模型和不同级别的服务质量,能够有效地在各种网络条件下连接设备和应用。其对资源的高效利用使其成为物联网通信的理想选择。理解其核心概念(Broker、发布/订阅、主题、QoS、会话)是使用和部署 MQTT 的关键。

相关文章:

  • SQL注入 ---04
  • 移动端巡检点检,让设备管理更便捷高效
  • centos服务器,疑似感染phishing家族钓鱼软件的检查
  • ElasticSearch高级功能
  • OpenUCX 库介绍与使用指南
  • 【信息系统项目管理师】第5章:信息系统工程 - 36个经典题目及详解
  • 生成对抗网络(Generative Adversarial Networks ,GAN)
  • Python笔记:在环境变量中增加了dll加载路径,python提示DLL加载失败
  • 匿名函数lambda、STL与正则表达式
  • 最小二乘拟合曲线
  • bat——自动重启程序
  • 酒店行业冰与火:一边流拍,一边扩张
  • 第22篇:Linux系统的Switch字符设备驱动设计
  • 数据的模型分析及可视化
  • 【python机器学习】Day 25 异常处理
  • 日本动漫风格人像街拍Lr调色预设,手机滤镜PS+Lightroom预设下载!
  • 《Python星球日记》 第71天:命名实体识别(NER)与关系抽取
  • Java—封装、继承与多态
  • 通过Ollama读取模型
  • CSS 锚点滑动效果的技术
  • 陕西旱情实探:大型灌区农业供水有保障,大旱之年无旱象
  • 王征、解宁元、牛恺任西安市副市长
  • 融创中国:境外债务重组计划聆讯定于9月15日召开
  • 哲学新书联合书单|远离苏格拉底
  • 习近平在中拉论坛第四届部长级会议开幕式的主旨讲话(全文)
  • 影子调查丨三名“淘金客”殒命雪峰山:千余废弃金矿洞的监管难题