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

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 的关键。

http://www.xdnf.cn/news/6174.html

相关文章:

  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-A. PostgreSQL常用函数速查表
  • 基于EFISH-SCB-RK3576/SAIL-RK3576的智能快递分拣机技术方案‌
  • 时序数据库IoTDB分布式系统监控基础概述
  • 小白成长之路-文件和目录内容检索处理(二)
  • 【C++重载操作符与转换】纯虚函数
  • 尚硅谷阳哥JVM
  • 智能工具协同赋能STEM教育科研|探索LLM大语言模型和数学软件Maple的创新实践
  • 2025年城市建设与交通运输国际会议(ICUCT 2025)
  • Baklib全场景知识中台驱动效能跃升
  • less中使用 @supports
  • 在C++中进行套接字编程时,主要使用以下头文件
  • CSS:选择器的优先级
  • 深入剖析某App视频详情逆向:聚焦sig3参数攻克
  • (10天冲刺版)软考:软件设计师 真题资料分享
  • Java高频面试之并发编程-17
  • 高海拔和远距离的人员识别:面部、体型和步态的融合
  • spark的Standalone模式介绍
  • 最大公约数JAVA
  • CK-S654-PA60一拖四分体式半导体电子货架专用RFID读写器|读码器接线使用说明
  • <论文>(微软)避免推荐域外物品:基于LLM的受限生成式推荐
  • “天神之眼”计算平台的算力设计(预计500-1000 TOPS)
  • 认识Docker/安装Docker
  • C及C++的SOAP协议库
  • 相关行业发展趋势写一个爬虫程序
  • 力扣3337. 字符串转换后的长度 II随笔
  • 2024年全国青少年信息素养大赛-算法创意实践C++ 华中赛区(初赛)历年真题
  • HTML5 浮动(Float)详解
  • 上海OA系统哪家好?厂商有哪些?
  • 如何在终端/命令行中把PDF的每一页转换成图片(PNG)
  • 从0开始学linux韦东山教程第三章问题小结(4)