MQTT详细介绍

【MQTT协议详解】MQTT协议 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于 **发布/订阅** 范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。 *简而言之,MQTT其实就是一个用于TCP通信的消息协议而已。既然消息协议,"消息" 自然是表示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/temperature 或 sensor/+/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/temperature 和 sensor/bedroom/temperature,但不能匹配 sensor/temperature 或 sensor/livingroom/office/temperature。
  • 多层通配符 #:匹配主题层级中的任意数量的层级(包括零层),并且必须是主题的最后一级。
    • 例如:sensor/bedroom/# 可以匹配 sensor/bedroom/temperature、sensor/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 的关键。

MQTT MQTT-Learning-Note 简介:MQTT由IBM公司开发,是一个即时通讯协议,也是一个物联网传输协议,主要用于轻量级的订阅/发布式的消息传输。其设计目的主要是为低带宽和不稳定网络环境下的物联网设备提供服务。 MQTT中的概念 订阅(Subscribtion): 订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Sessio... 阅读详情

相关推荐

【MQTT】MQTT入门与进阶系列(一)—— MQTT 基础知识介绍和示例

本篇文章主要介绍MQTT入门基础知识,什么是MQTT、MQTT的特点、MQTT客户端、MQTT Broker、发布-订阅模式、主题、QoS,以及通过一个示例,进行订阅和发布消息,让读者对MQTT的工作原理和工作流程有个直观的了解和感受。就像一盘菜,学习如何炒这盘菜之前,咱们先知道这盘菜的原料,尝尝这盘菜的味道。

萧邯嵌入式笔记 4493

MQTT 协议简介

MQTT是一种基于发布/订阅模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

Java+GO+JS全栈工程师-鹤冲天的博客:编程辅导~商务合作~技术交流 1万+

非常详细的MQTT+TLS(一)----MQTT篇

非常详细的MQTT+TLS----MQTT篇 首先要说明的是,MQTT是一个构建在TCP/IP之上的轻量消息协议,也就是说我们要创建MQTT协议之前需要创建TCP连接。在TCP连接之上再创建MQTT通信。 1、MQTT移植: 如图是我们从github下载到的MQTT包。第一次接触的人一定和我一样一脸懵逼,现在 我很负责任的告诉你,你只需要关注如下两个文件夹。在移植时我们需要将【MQTTPacket】→【src】下面的文件移植到我们的自己平台上,这些文件可以理解成是对接MQTT的公共文件包,不管你是什么平台

ZR 1万+

MQTT--快速入门

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅 (publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的。

CJPSR的博客 1万+

Python MQTT客户端 paho-mqtt

Python中MQTT Python有许多优秀的MQTT客户端,比较有代表性的有paho-mqtt、hbmqtt、gmqtt等,各有特色 paho-mqtt 有着最优秀的文档,代码风格易于理解,同时有着强大的基金会支持,目前新版本支持 MQTT 5.0 hbmqtt 使用 asyncio 库实现,可以优化网络 I/O 带来的延迟,但是代码风格不友好,文档较少,不支持 MQTT 5.0,且...

木子七的博客 6134

【MQTT】MQTT C语言客户端实现/ MQTT嵌入式客户端

MQTT客户端实现(嵌入式) 最新最容易使用的mqtt封装。 MQTT客户端实现(使用Eclipse Paho C库,进行了二次封装)。 在Linkit7688单片机上运行测试通过,附例程。 https://download.youkuaiyun.com/download/skyformat99/9969954 MQTT 客户端C语言编好的库和例子(example) https://downlo...

我的笔记本 8333

MQTT协议详解「概念、特性、版本及作用」

MQTT协议详解「概念、特性、版本及作用」

weixin_44749255的博客 5724

MQTT协议知识梳理,看完你就懂了

MQTT是基于TCP/IP协议栈构建的异步通信消息协议,是一种轻量级的发布/订阅信息传输协议。MQTT在时间和空间上,将消息发送者与接受者分离,可以在不可靠的网络环境中进行扩展。适用于设备硬件存储空间有限或网络带宽有限的场景。物联网平台支持设备使用MQTT协议接入MQTT的特点是可以保持长连接,具有一定的实时性,云端向设备端发送消息,设备端可以在最短的时间内接收到并作出响应,所以MQTT更适合需要实时控制的场合,更适合执行器。要保持长连接,那么就要时不时地发送心跳包,这就不会省电了。

IT技术分享社区 3104

【MQTT】paho.mqtt.cpp 库的 介绍、下载、交叉编译、MQTT客户端例子源码

👉本文详细介绍了 paho.mqtt.cpp 库的“下载、交叉编译”、最后给出了怎么写MQTT客户端例子源码的例子

wkd_007的博客 1万+

【调试工具|mqtt-spy】mqtt客户端调试工具 mqtt-spy 详细使用教程

mqtt-spy 的下载、安装、使用详细教程。

wkd_007的博客 3884

STM32F105双路CAN通讯无法进入接收中断问题及解决方法

STM32F105RBT6双路CAN通讯无法进入接收中断问题及解决方法

m0_62383223的博客 3442

【MQTT】MQTT简介+安装+使用

MQTT 协议简介 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。 MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。 ...

我的笔记本 6万+

Excel VBA | 一键批量生成对账单

根据对账单总表一键批量生成N家独立的客户对账单。

Microgoblins的博客 6983

Paho mqtt C语言库介绍

虽然可以自己构造MQTT报文,但是还是比较麻烦的,采用别人设计好的库,速度更快,也不容易出现某些自己无法解决的bug,Paho基于C语言,Java,C++,,Python等主流编程语封装了MQTT的库,这次我们的参赛作品就使用了C++,Java,还有C语言的Paho封装的mqtt库。非常的方便,下面是基于C语言实现的库的github下载地址。 下载地址:Paho https://github.com/eclipse/paho.mqtt.embedded-c Paho库目录文件介绍 解压...

a310171579的博客 1万+

强化学习赋能宇树机器狗:Isaac Gym与MuJoCo仿真训练全解析

本文详细解析了如何利用Isaac Gym和MuJoCo两大仿真平台为宇树机器狗构建强化学习训练管道。内容涵盖环境配置、模型导入、PPO算法框架设计、奖励函数构建以及从仿真到实机的策略迁移技巧,为开发者提供了一套完整的宇树狗仿真训练实践方案。

zeta9的博客 619

保姆级教程:用PROGRAM_FTDI搞定Xilinx FPGA的JTAG调试器(基于FT232/FT2232/FT4232)

本文详细介绍了如何使用FT232/FT2232/FT4232系列芯片通过PROGRAM_FTDI工具配置Xilinx FPGA的JTAG调试器。从芯片选型、驱动安装到固件烧写和Vivado验证,提供了完整的实操指南和避坑要点,帮助开发者低成本实现高效调试。

weixin_29271053的博客 2154

MQTT介绍

算子内部自动分配客户端ID,通过主界面输入MQTT服务器IP地址和端口号可连接MQTT服务器,然后选配高级设置是否启用密码功能,连接时是否需要验证账号密码,并支持显示接收消息列表,通过界面可订阅主题和发布主题,实现与MQTT服务器与MQTT其他客户端的通信。算子内部无需连接操作,通过引用依赖引用MQTT服务器或客户端对象即可,实现代理接收MQTT服务器或客户端消息功能,通过界面选配项可配置接收超时功能,如在设置时长内未接收文本消息将视为超时,如未打开超时功能将默认持续不断等待接收,直到接收到文本即可。

GraniStudio的博客 953

PYNQ开发板使用-使用DMA进行数据搬移(Simple DMA transfer 模式)

该篇是学习使用PYNQ开发板,实际上是对ZYNQ PL端AXI_CDMA 核的应用。实验步骤参照官网的教程,一步一步地做,但是由于在硬件资源布置方面与官方教程稍有出入,所以在SDK的源码里也进行了修改。 AXI_CDMA特性: 如果是使用ZYNQ 7系列芯片(可能其他Xilinx也是通用的),xilinx的AXI_CDMA 核有两种传输模式:轮询(poll)和中断(...

YGLeeeon的博客 3521

mqtt协议的详细介绍

MQTT(Message Queuing Telemetry Transport)协议是一种基于发布 / 订阅(publish/subscribe)模式的轻量级物联网消息传输协议。

AlbenXie的博客 2085

Windows下QT5.15.2安装MQTT模块全攻略(附分支选择避坑指南)

本文详细介绍了在Windows环境下为QT5.15.2安装MQTT模块的完整流程,包括环境准备、源码获取、编译配置及项目集成等关键步骤。特别针对分支选择、依赖项处理和常见错误提供了实用解决方案,帮助开发者高效完成MQTT模块的安装与调试,适用于物联网开发场景。

weixin_29224589的博客 466

ANSYS FLUENT 超临界流体物性分段线性插值数据批量导入

使用fluent自带数据库进行超临界流体仿真时,时不时会出现计算错误,考虑是数据库不稳定引起,而使用自定义的分段线性插值物性则不会出现上述情况。 超临界流体在拟临界点附近物性变化剧烈,需要使用较多的数据点才能更准确的表述物性,如果是在对话框中修改,一次只能输入一个点,人工输入极其费时费力且容易失误。 数据批量导入方法为: 1.以CO2为例,使用REFREPRO等物性查询软件或数据资料,获得所需物性数据表。 2.在FLUENT材料Materia...

wind_rider的博客 1万+

【MQTT基础篇(一)】MQTT介绍

MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)。

K3169的博客 2612

无线自组织网络基础知识

参考书籍:《无线自组织网络路由协议及应用》 目录第一章 绪论1.1 无线自组织网络概述1.1.1 无线自组织网络的定义及分类1.1.2无线自组织网络的主要特点1.1.3无线自组织网络的应用与发展1.无线自组织网络的应用2.无线自组织网络的起源和发展1.2典型的无线自组织网络1.2.1移动Ad Hoc网络1、移动Ad Hoc网络的定义2.移动AdHoc网络的特点3.移动Ad Hoc网络的应用1.2....

逸凌Time 2万+

【MQTT】paho.mqtt.c 库的“介绍、下载、交叉编译” 详解,以及编写MQTT客户端例子源码

👉本文详细介绍了 paho.mqtt.c 库的“介绍、下载、交叉编译” ,以及怎么使用 aho.mqtt.c 库 编写MQTT客户端例子源码。

wkd_007的博客 9750

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

MQTT 介绍

什么是MQTT MQTT是Message Queuing Telemetry Transport的缩写,它是一个基于发布/订阅模式的轻量级消息中间件协议,IBM公司的Andy Stanford-Clark 和Cirrus Link公司的Arlen Nipper在1999年设计了MQTT协议,最初用于石油管道的远程遥监系统。2010年MQTT发布免费版本,2014年MQTT成为OASIS标准,现在被...

weixin_33739523的博客 649

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: MongoDB 的核心概念(文档、集合、数据库、BSON)是什么?
下一篇: MQTT 在Spring Boot 中的使用
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值