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

MQTT协议

一.MQTT协议概述

MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,广泛应用于物联网(IoT)领域中的设备连接、传感器数据传输等场景。

MQTT协议使用TCP/IP协议栈作为底层传输协议,支持QoS(服务质量)级别定义、保留消息等特性。在MQTT中,有一个消息代理(Broker)中心,客户端通过连接到消息代理,实现发布消息和订阅消息,从而实现设备之间的通信和数据传输。

相对于HTTP协议,MQTT具有更小的消息头和更少的网络流量占用,适合于低带宽、不稳定网络环境下的设备数据传输场景。同时,MQTT也支持不同的平台和语言的开发,如Java、Python、C++、JavaScript等等,可以方便地进行二次开发和应用。

二.优点

MQTT协议的优点包括:

  1. 轻量级:MQTT协议设计简单,消息头部分较小,具有较低的网络流量消耗和较小的内存占用,适用于低带宽和资源受限的设备。

  2. 低功耗:MQTT协议采用异步传输机制,客户端可以通过保持持久连接的方式降低网络建立和断开的消耗,从而减少设备能耗。

  3. 异步通信:MQTT采用发布/订阅模式,使设备可以实现异步通信,即设备可以推送消息到消息代理,而不需要立即等待接收方的响应,提高了系统的响应速度和吞吐量。

  4. 灵活的消息订阅机制:MQTT支持多级主题订阅,即通配符订阅,允许设备订阅特定主题或一组主题,从而更灵活地管理和控制消息的订阅。

  5. 可靠性和服务质量:MQTT协议支持三个不同的服务质量(QoS)级别,分别为至多一次、至少一次和正好一次,可以根据应用需求选择适当的级别,保证消息的可靠传输。

  6. 跨平台和语言支持:MQTT具有跨平台和跨语言的特性,允许在不同的硬件平台和编程语言中使用,并且有丰富的开发库和工具可供选择和使用。

综上所述,MQTT协议的轻量级、低功耗、异步通信、灵活订阅、可靠传输和跨平台支持等特点使其成为物联网设备连接和通信的理想选择。

在这里插入图片描述

三.MQTT通配符

MQTT协议支持使用通配符(wildcard)进行主题(Topic)的订阅和发布。通配符的使用可以让设备更灵活地管理和控制消息的订阅。

MQTT协议中有两种通配符:

  1. 单层通配符(Single-Level Wildcard):表示为"+"(加号)。可以用于任意层级的主题的一级通配,可以匹配单个层级的主题标识。例如,“home/+/light” 可以匹配 “home/kitchen/light” 和 “home/livingroom/light”,但不能匹配 “home/kitchen/table/light”。

  2. 多层通配符(Multi-Level Wildcard):表示为"#"(井号)。只能用于主题的最后一级,用于匹配多个或零个层级的主题标识。例如,“home/kitchen/#” 可以匹配 “home/kitchen/light”、“home/kitchen/table/light” 等。

使用通配符能够使设备更加灵活地定义订阅规则,可以根据实际需要选择适当的通配符来订阅特定的主题。这样可以简化设备间的通信和数据传输,在物联网中更加方便和高效地实现设备与设备之间的互联互通。

四.MQTT协议通讯流程

![2023-11-15T14:45:27.png][2]

MQTT协议通信流程:

  1. 连接阶段:
    1.1. 客户端通过TCP/IP协议与MQTT代理建立网络连接。
    1.2. 客户端发送CONNECT报文给代理,携带客户端标识符、协议版本、保持连接设置等信息。
    1.3. 代理验证客户端信息,返回CONNACK报文作为连接确认,指示连接是否建立成功。

  2. 心跳保持:
    2.1. 已建立连接的客户端和代理之间周期性地交换PINGREQ和PINGRESP报文来保持心跳。
    2.2. 客户端在一段时间内未收到PINGRESP报文时,可以认为连接断开,并进行相应的处理。

  3. 发布与订阅:
    3.1. 客户端发送SUBSCRIBE报文给代理,指定要订阅的主题和对应的服务质量(QoS)级别。
    3.2. 代理接收SUBSCRIBE报文,记录客户端的订阅信息,并发送SUBACK报文给客户端,确认订阅请求。
    3.3. 客户端向代理发送PUBLISH报文,发布消息到指定主题。
    3.4. 代理接收到PUBLISH报文后,根据订阅关系将消息转发给对应的客户端。
    3.5. 客户端收到PUBLISH报文后,根据消息的QoS级别发送相应的确认报文(PUBACK、PUBREC、PUBREL、PUBCOMP)。
    3.6. 客户端可以发送UNSUBSCRIBE报文给代理,取消订阅一个或多个主题。

  4. 关闭连接:
    4.1. 客户端发送DISCONNECT报文给代理,主动关闭连接。
    4.2. 代理接收到DISCONNECT报文,断开与该客户端的连接。

五.MQTT协议数据结构

在这里插入图片描述

MQTT由固定报头,可变报头,有效载荷三部分组成。

![2023-11-15T14:59:07.png][4]在这里插入图片描述

MQTT协议中的每个报文都包含一个固定报头(Fixed Header),固定报头中包含了一些固定的信息以标识报文的类型和控制参数。下面是MQTT协议固定报头的基本结构:

  1. 报文类型(Message Type):占据固定报头的高4位(即最高位的四个比特),用于表示报文的类型。可能的取值包括:

    • CONNECT:连接请求
    • CONNACK:连接确认
    • PUBLISH:发布消息
    • PUBACK:发布确认
    • PUBREC:发布收到(QoS 2,第一次)
    • PUBREL:发布释放(QoS 2,第二次)
    • PUBCOMP:发布完成(QoS 2,第三次)
    • SUBSCRIBE:订阅请求
    • SUBACK:订阅确认
    • UNSUBSCRIBE:取消订阅请求
    • UNSUBACK:取消订阅确认
    • PINGREQ:心跳请求
    • PINGRESP:心跳响应
    • DISCONNECT:断开连接
    • 其他有关错误报告和重发的报文类型
  2. 控制标志(Control Flags):占据固定报头的低4位(即最低位的四个比特),用于表示控制参数。不同报文类型的控制标志具有不同的含义,常见的标志包括:

    • DUP:指示是否进行重复投递
    • QoS:指示消息传递的服务质量等级
    • RETAIN:指示是否保留最后一条消息
  3. 剩余长度(Remaining Length):占据固定报头的字节2至5。它表示整个报文的剩余长度(不包括固定报头的长度)。使用可变长度编码(Variable Length Encoding)表示,允许长度范围从 0 到 268,435,455 字节。

在这里插入图片描述

通过固定报头,客户端和代理可以快速解析报文,确定报文的类型和相应的控制参数,进而有效地处理和分发报文。

需要注意的是,MQTT协议的固定报头结构是通用的,但报文具体的数据结构和长度取决于不同的报文类型。每个报文类型在固定报头后面还会包含各自特定的可变头部(Variable Header)和有效负载数据(Payload),这些部分的结构和长度也会根据具体的需求而变化。

在这里插入图片描述

MQTT协议中,除了固定报头外,每个报文还可能包含可变报头(Variable Header)。可变报头包含了一些特定于消息类型的字段,用于提供关于消息的更多信息。下面是MQTT协议中可变报头的一般结构:

  1. CONNECT报文的可变报头包含以下字段:

    • 协议名称:通常为字符串"MQTT"
    • 协议版本号:表示MQTT协议的版本,例如4代表MQTT 3.1.1
    • 连接标志:包括clean session标志、will标志、will QoS、will retain标志、user name标志和password标志
    • 保持连接时长:以秒为单位的整数,指示客户端和服务器之间的空闲超时时间
    • 客户端标识符:客户端的唯一标识符
    • 遗嘱主题和消息:可选,用于指示在不正常断开时发送的遗嘱消息
    • 用户名和密码:可选,用于进行身份验证
  2. PUBLISH报文的可变报头包含以下字段:

    • 主题名:消息发布到的主题
    • 报文标识符:仅在QoS级别1和2时存在,用于匹配发布的消息和确认消息
    • QoS级别:消息的服务质量级别
    • 保留标志:指示服务器是否应保留消息以及如何处理它
  3. SUBSCRIBE报文的可变报头包含以下字段:

    • 报文标识符:此订阅请求的标识符
    • 订阅主题列表:包括主题过滤器和期望的QoS级别
  4. SUBACK报文的可变报头包含以下字段:

    • 报文标识符:对应的订阅请求的标识符
    • 订阅结果列表:服务器订阅的每个主题的QoS级别

其他报文类型的可变报头也包含与其功能和语义相关的信息。可变报头的结构和字段取决于消息类型和特定协议版本的要求。通过可变报头,可以为每种类型的报文提供必要的信息,以便接收方能够正确解释和处理消息。

需要注意的是,可变报头并不是所有报文类型都有的,但对于那些具有可变报头的报文类型来说,可变报头是非常重要的部分,它提供了报文的关键信息,以便接收方理解和处理报文。

在这里插入图片描述

MQTT协议中,有效载荷(Payload)包含了报文的实际数据,其结构和内容取决于具体的报文类型和应用需求。以下是几种常见的MQTT报文类型以及它们可能包含的有效载荷:

  1. CONNECT报文的有效载荷包含了客户端的连接请求信息,主要包括:

    • 客户端标识符
    • 遗嘱消息和相关设置
    • 用户名和密码(如果需要认证)
  2. CONNACK报文的有效载荷包含了服务器对连接请求的确认信息,主要包括:

    • 连接确认标志
    • 连接结果代码
  3. PUBLISH报文的有效载荷包含了实际发布的消息内容,其中包括:

    • 主题名
    • 消息负载:需要传输的实际消息数据
    • 报文标识符(可能存在于QoS级别为1或2的情况下)
  4. SUBSCRIBE报文的有效载荷包含了订阅请求的信息,主要包括:

    • 一个或多个订阅主题和对应的QoS级别
    • 报文标识符
  5. SUBACK报文的有效载荷包含了订阅确认的信息,主要包括:

    • 与订阅请求一一对应的订阅结果列表,包括每个主题的QoS级别
  6. UNSUBSCRIBE报文的有效载荷包含了取消订阅请求的信息,主要包括:

    • 一个或多个需要取消订阅的主题名
  7. UNSUBACK报文的有效载荷通常为空,因为它只是一个简单的确认消息。

  8. PUBACK、PUBREC、PUBREL、PUBCOMP报文的有效载荷通常为空,因为它们主要用于消息发布的确认。

  9. PINGREQ和PINGRESP报文没有有效载荷,因为它们主要用于维持连接状态而不传输实际数据。

  10. DISCONNECT报文的有效载荷通常为空,因为它主要用于终止连接。

需要注意的是,有效载荷的具体结构和内容将根据具体的需求和通信的上下文进行定义,同时也受到MQTT协议版本和服务质量等级(QoS)的影响。MQTT的灵活性允许有效载荷的内容可以是任意格式的数据,包括文本、二进制数据等。

总的来说,有效载荷是MQTT报文中传输实际数据的部分,它的结构和内容对于消息的生产者和消费者之间的通信至关重要。

相关文章:

MQTT协议

一.MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,广泛应用于物联网(IoT)领域中的设备连接、传感器数据传输等场景。 MQTT协议使用TCP/IP协议栈作为底层…...

Unity编辑器扩展(外挂)

每日一句:未来的样子藏在现在的努力里 目录 什么是编译器开发 C#特性[System.Serializable] 特殊目录 命名空间 /*检视器属性控制*/ //添加变量悬浮提示文字 //给数值设定范围(最小0,最大150) //指定输入框,拥有5行 //默认…...

oracle 19c容器数据库data dump数据泵传输数据(2)---11g导19c

目录 1.在11gnon-cdb数据库中创建测试用户 2.在19cCDB容器数据库中新建pdb2 3.执行命令导出 4.执行命令导入 Exporting from a Non-CDB and Importing into a PDB 我們要記住一点:如果是全库导出导入的话,目标数据库没有的表空间我们要事先创建&#…...

Java-网络爬虫(二)

文章目录 前言一、WebMagic二、使用步骤1. 搭建 Maven 项目2. 引入依赖 三、入门案例四、核心对象&组件1. 核心对象SipderRequestSitePageResultItemsHtml(Selectable) 2. 四大组件DownloaderPageProcessorSchedulerPipeline 上篇:Java-网…...

【android】rk3588-android-bt

文章目录 蓝牙框架HCI接口蓝牙VENDORLIBvendorlib是什么 代码层面解读vendorlib1、 vendorlib实现,协议栈调用2、协议栈实现,vendorlib调用(回调函数)2.1、 init函数2.2、BT_VND_OP_POWER_CTRL对应处理2.3、BT_VND_OP_USERIAL_OPE…...

如何在 Microsoft Edge 浏览器中启用自动刷新

你是否经常发现自己在使用 Microsoft Edge 时点击刷新按钮?如果您需要一个网页以设定的时间间隔自动更新,那么请接着往下看。 在这篇博文中,我们探讨如何在 Microsoft Edge 浏览器中启用和管理自动刷新功能。 为什么选择自动刷新&#xff1…...

Redis之集群方案比较

哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般&a…...

WPF 布局

了解 WPF中所有布局如下,我们一一尝试实现,本文档主要以图形化的形式展示每个布局的功能。 布局: Border、 BulletDecorator、 Canvas、 DockPanel、 Expander、 Grid、 GridView、 GridSplitter、 GroupBox、 Panel、 ResizeGrip、 Separat…...

#Uniapp:uni-app中vue2生命周期--11个

uni-app中vue2生命周期 生命周期钩子描述H5App端小程序说明beforeCreate在实例初始化之后被调用 详情√√√created在实例创建完成后被立即调用 详情√√√beforeMount在挂载开始之前被调用 详情√√√mounted挂载到实例上去之后调用 详情 注意:此处并不能确定子组…...

pytorch 分布式 Node/Worker/Rank等基础概念

分布式训练相关基本参数的概念如下: Definitions Node - A physical instance or a container; maps to the unit that the job manager works with. Worker - A worker in the context of distributed training. WorkerGroup - The set of workers that execute the same f…...

《动手学深度学习》学习笔记 第8章 循环神经网络

本系列为《动手学深度学习》学习笔记 书籍链接:动手学深度学习 笔记是从第四章开始,前面三章为基础知识,有需要的可以自己去看看 关于本系列笔记: 书里为了让读者更好的理解,有大篇幅的描述性的文字,内容很…...

腾讯实验平台基于 StarRocks 构建湖仓底座

作者: 腾讯大数据平台部科学实验中心Tech Lead、专家工程师 马金勇博士 腾讯大数据平台部科学实验中心数据负责人、专家工程师 胡明杰 StarRocks Contributor、腾讯高级工程师 刘志行 在 2022 年,腾讯 A/B Test 团队启动了海外商业化版本 ABetterChoice …...

【基础工具篇使用】ADB 的安装和使用

文章目录 ADB的命令安装ADB 命令使用查看帮助 ——adb help查看连接设备 ADB的命令安装 ADB 命令的全称为“Android Debug Bridge”,从英文中看出主要是用作安卓的调试工具。ADB 命令在嵌入式开发中越来越常用了 在 Windows 上按“win”“R”组合件打开运行, 输入 …...

数字图像处理练习题

数字图像处理练习题 文章目录 数字图像处理练习题第 一 章1.什么是数字图像?2.数字图像有哪些特点?3.数字图像处理的目的是什么?4.简述数字图像的历史。5.数字图像有哪些主要应用?6.列举生活中数字图像的获得途径。7.结合自己的生活实例,举出一个数字图像的应用实例8.数字图…...

开关电源PFC电路原理详解及matlab仿真

PFC全称“Power Factor Correction”,意为“功率因数校正”。PFC电路即能对功率因数进行校正,或者说能提高功率因数的电路。是开关电源中很常见的电路。 在电学中,功率因数PF指有功功率P(单位w)与视在功率S&#xff08…...

SpringBoot+Hutool实现图片验证码

图片验证码在注册、登录、交易、交互等各类场景中都发挥着巨大作用,能够防止操作者利用机器进行暴力破解、恶意注册、滥用服务、批量化操作和自动发布等行为。 创建一个实体类封装,给前端返回的验证码数据: Data public class ValidateCodeV…...

【MySQL】MySQL版本8+ 窗口函数 Lead 的两种使用

力扣题 1、题目地址 1709. 访问日期之间最大的空档期 2、模拟表 表:UserVisits Column NameTypeuser_idintvisit_datedate 该表没有主键,它可能有重复的行该表包含用户访问某特定零售商的日期日志。 3、要求 假设今天的日期是 ‘2021-1-1’ 。 …...

Hive 的 安装与使用

目录 1 安装 MySql2 安装 Hive3 Hive 元数据配置到 MySql4 启动 Hive5 Hive 常用交互命令6 Hive 常见属性配置 Hive 官网 1 安装 MySql 为什么需要安装 MySql? 原因在于Hive 默认使用的元数据库为 derby,开启 Hive 之后就会占用元数据库,且不与其他客户…...

Zynq 电源

ZYNQ芯片的电源分PS系统部分和PL逻辑部分,两部分的电源分别是独立工作。PS系统部分的电源和PL逻辑部分的电源都有上电顺序,不正常的上电顺序可能会导致ARM系统和FPGA系统无法正常工作。 PS部分的电源有VCCPINT、VCCPAUX、VCCPLL和PS VCCO。 VCCPINT为PS内…...

DevOps系列之 Python操作数据库

pymysql操作mysql数据库 安装pymysql pip install pymysql pymysql操作数据库 1.连接数据库 使用Connect方法连接数据库 pymysql.Connections.Connection(hostNone, userNone, password, databaseNone, port0, charset) 参数说明: host – 数据库服务器所在的主机…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)&#xff0…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率&#xff0c…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...

小木的算法日记-多叉树的递归/层序遍历

🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...