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

MQTT协议解析 : 物联网领域的最佳选择

1. MQTT协议概述

1.1 MQTT协议是什么

MQTT : Message Queuing Telemetry Transport

  • 模式 : 发布 / 订阅主题
  • 优点 : 代码量小、低带宽、实时可靠
  • 应用 : 物联网、小型设备、移动应用
  • MQTT 常用端口 : 1883

MQTT是一个网络协议,和HTTP类似,因为轻量简单,很多时候传输效率是后者的数十倍。
它仅用极少的代码和有限的带宽,就能为连接远程设备提供实时可靠的消息服务,所以逐渐在物联网(IOT)领域成为了最佳选择。
其实,日常生活中我们也许使用过MQTT,比如你用手机解锁一辆共享单车的时候。

在这里插入图片描述

1.2 MQTT里的角色

MQTT里有3个角色,基于发布 / 订阅模式

  • 代理 Broker (服务器) (消息中转站)
    • 负责接收各个设备发送来的消息,然后把消息转发给需要的设备
  • 发布者 Publisher (客户端)
  • 订阅者 Subscriber (客户端)

可以用视频软件(如抖音/B站)举例子,你(订阅者)关注了某个创作者(发布者),当这个创作者发布新视频的时候,你就会收到B站的推送通知。MQTT协议和上面的简直一模一样。

在这里插入图片描述

2. MQTT协议的工作原理

MQTT协议的消息传输基于客户端-服务器模型,客户端可以是发布者(Publisher)或订阅者(Subscriber),而服务器则负责消息的路由和分发。

2.1 工作流程

  1. 客户端首先与MQTT服务器建立TCP连接,连接成功后,客户端发送一个CONNECT消息,包含客户端标识、用户名、密码等信息。
  2. 服务器验证这些信息后,返回一个CONNACK消息,确认连接。发布者客户端发送PUBLISH消息,将消息发送到特定的主题(Topic),消息包含主题名称、消息有效荷载(Payload)和质量服务等级(QoS)。
  3. MQTT服务器接收到PUBLISH消息后,根据消息的主题,将消息分发给所有订阅了该主题的客户端。这个过程是异步的,确保了消息的高效分发。

在这里插入图片描述

2.2 MQTT底层是TCP/IP

MQTT底层是TCP/IP

  • 连接 : 主动连接服务器,连接的时候带了很多的信息,比如用户名和密码
    • 信息匹配成功后,才会给你响应
  • 发送心跳 & 回应心跳 : 发布者或订阅者发起,服务端响应。
    • 如果长时间没有发送心跳,服务端会认为这个客户端已经离线了,会主动断开连接。
  • 服务质量等级QoS
    • 等级 QoS0 : “最多一次” : 只管发送,不管接收
    • 等级 QoS1 : “最少一次” : 发布以后,服务器必须要回复。如果没收到回复,那么还会继续发,直到你给我回复。
    • 等级 QoS2 : “仅一次” : 发布以后,服务器回复,客户端收到回复以后,发布释放,客户端回复发布完成
      • 应用 : 计费的场景,对次数有严格要求,只要求有一次就够了

除了基于 TCP 的 MQTT,也存在基于 UDP 的 MQTT-SN 等变种协议,不过它们的应用场景和特性与基于 TCP 的 MQTT 有所不同。

3. MQTT数据结构

在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体 (payload)三部分构成。MQTT数据包结构如下:

在这里插入图片描述

  • 固定头部(Fixed Header) : 这是每个 MQTT 消息都有的部分,长度最小为 2 字节。它包含了消息类型和标志位等信息。
  • 可变头部(Variable Header) : 可选(根据消息类型来判定是否存在)
    • 存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
  • 有效载荷(Payload) : 可选(根据消息类型来判定是否存在)
    • 存在于部分MQTT数据包中,表示客户端收到的具体内容。

在这里插入图片描述

3.1 固定头部

这是每个 MQTT 消息都有的部分,长度最小为 2 个字节,最多为 5 个字节。

3.1.1 第一个字节

MQTT 协议明确规定高 4 位用于表示消息类型,低 4 位用于表示标志位(如 QoS 级别、保留位、重复位等)。这种定义是基于一种默认的、统一的位顺序来理解的,所有遵循 MQTT 协议的实现都应该按照这个规定的顺序来解析和处理消息。
在这里插入图片描述

3.1.2 第二个字节 - 至多五个字节

第二个字节,高位第一个字节如果为1,表明存在第三个字节,如果为0,表示不存在第三个字节。
在这里插入图片描述

3.2 可变报头

如果是连接请求,可见报头就是下图所示这样。
Byte1-Byte2 是 协议长度。
Byte3-Byte6 是 协议名。
Byte7 是 协议级别。
Byte8 是 连接标志,用来确定是否包含 用户名、密码等。
Byte9-Byte10 用作心跳间隔时间。

在这里插入图片描述

3.3 有效载荷

如果是连接请求,有效载荷就是下图所示这样。
客户端标识符 : 表示你设备的名字,
还有用户名和密码就是放在这里的 (如果有的话)

在这里插入图片描述

4. 抓包

4.1 连接的请求报文

可以看到固定报头、可变报头和有效载荷, Message TypeConnect Command

在这里插入图片描述

4.2 连接的响应报文

没有有效载荷,只有固定报头和可变报头

在这里插入图片描述

4.3 发布的请求报文

Message Type : Publish Message
Topic Length : 主题的长度
Topic : 主题
Message Identifier : 消息ID
Message : 有效载荷,其实解析后就是一个JSON字符串
在这里插入图片描述

4.4 发布的应答报文

在这里插入图片描述

5. 智能家居场景示例

5.1 设备角色介绍

想象一下,你有一个智能家居系统。在这个系统中,有各种各样的设备,就像一个个“小通讯员”。其中包括温度传感器、湿度传感器、智能灯泡和智能窗帘等设备,这些设备就是MQTT中的“客户端(Client)”。

5.2 代理服务器(Broker)的作用

在这个智能家居网络中,还有一个“消息中转站”,也就是MQTT代理(Broker)。它就像是一个社区的收发室,负责接收各个设备发送来的消息,然后把消息转发给需要的设备。

5.3 发布/订阅模式的体现

  • 发布过程:温度传感器就像一个小广播员,它会定期检测室内的温度,然后把温度信息发送(发布)出去。例如,它会把温度数据发布到一个主题(Topic)下,这个主题可以是“home/temperature”。这就好比广播员在广播频道“家庭温度频道”上广播室内温度信息。
  • 订阅过程:智能空调是一个对温度很感兴趣的设备,它会订阅“home/temperature”这个主题。当温度传感器发布了新的温度消息后,代理服务器就会把这个消息转发给智能空调。这就像智能空调一直收听“家庭温度频道”,一旦有新的温度消息广播,它就能收到并根据温度信息来决定是否调整制冷或制热模式。

5.4 不同QoS级别的应用场景

  • QoS 0 - 最多一次传递:智能灯泡的颜色变化信息可以采用QoS 0级别。假设你有一个可以改变颜色的智能灯泡,你通过手机应用设置了一个灯光颜色变化的动态效果。这个颜色变化的消息对于偶尔丢失几条数据不太敏感。如果因为网络问题,有一两条关于颜色变化的指令没有传达到灯泡,可能不会被用户明显察觉,因为灯光效果的连续性不会因为偶尔的丢失而受到严重影响。
  • QoS 1 - 至少一次传递:对于智能窗帘的控制指令可以采用QoS 1级别。比如你发送一个指令让窗帘打开,这个指令比较重要,不能丢失。如果因为网络波动,代理服务器没有收到智能窗帘的确认消息,它会重新发送这个指令,这样就确保了窗帘至少能收到一次打开的指令。即使偶尔收到两次相同的指令,窗帘也只是执行相同的动作(打开),不会产生严重的后果。
  • QoS 2 - 恰好一次传递:在智能家居系统与外部支付系统进行联动的场景下,例如当你购买了一个智能家居服务套餐,支付成功的消息需要以QoS 2级别传递。这个消息必须准确无误地在智能家居系统和支付系统之间传递,既不能丢失也不能重复,以确保你的服务能够正确开通,同时避免因为重复支付而造成损失。

6. MQTT相关工具

  • 调试工具 : MQTTX
  • 抓包工具 :Wireshark
  • 密钥计算工具 : 用于生成用户名和密码加密后的字符串
    • hex_hmac_sha1.js
    • hex_md5.js
    • sign.html

7. 其他

参考

物联网系列 - MQTT协议原理与数据包结构
用B站解释MQTT协议
MQTT协议的工作原理——消息传输
MQTT协议原理与应用精讲
MQTT 协议入门:基础知识和快速教程 | EMQ

MQTT协议测试——MQTT X工具使用_梦的博客-CSDN博客_mqtt测试
推荐八款常用 MQTT 客户端工具 - 知乎 (zhihu.com)
两款常用的 MQTT 调试工具_zuozewei的博客-CSDN博客_mqtt测试工具
MQTT基础 三: 发布、订阅和取消订阅 - 简书 (jianshu.com)

相关文章:

MQTT协议解析 : 物联网领域的最佳选择

1. MQTT协议概述 1.1 MQTT协议是什么 MQTT : Message Queuing Telemetry Transport 模式 : 发布 / 订阅主题优点 : 代码量小、低带宽、实时可靠应用 : 物联网、小型设备、移动应用MQTT 常用端口 : 1883 MQTT是一个网络协议,和HTTP类似,因为轻量简单&…...

pycharm中from[本地包]import文件/模块出现问题(最最最全方法!)

1.通过PYTHONPATH的方法在此处将路径添加上,能够让IDE访问得到。 2.通过选中目标文件所在的文件的文件夹单击右键,如下图所示可以看到下方的mark directory as选项中存在 存在excluded,选择此项可解决问题,如果仍有问题可以尝试其…...

MongoDB在现代Web开发中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 引言 MongoDB 概述 定义与原理 发展…...

Python Bokeh 数据可视化教程

Python Bokeh 数据可视化教程 引言 在数据科学和分析的过程中,数据可视化是一个至关重要的环节。它不仅能帮助我们更好地理解数据,还能在报告和展示中提升数据的可读性和吸引力。Python 作为数据科学的主要工具之一,提供了多种数据可视化库…...

(一)<江科大STM32>——软件环境搭建+新建工程步骤

一、软件环境搭建 (1)安装 Keil5 MDK 文件路径:江科大stm32入门教程资料/Keil5 MDK/MDK524a.EXE,安装即可,路径不能有中文。 (2)安装器件支持包 文件路径:江科大stm32入门教程资料…...

内存大小的单位转换

计算机中内存大小的单位转换通常是按照以下规则进行的: 基本单位 1 字节 (Byte) 8 位 (bit) 常见的内存单位及转换关系 1 字节 (Byte) 8 位 (bit)1 千字节 (KB) 1,024 字节 (B)1 兆字节 (MB) 1,024 千字节 (KB) 1,024 * 1,024 字节 (B)1 吉字节 (GB) 1,02…...

如何在 Spring MVC 中使用 `@PostMapping`? 如何在 Spring MVC 中使用 `@PutMapping`?

PostMapping 和 PutMapping 是 Spring MVC 中用于处理 HTTP POST 和 PUT 请求的注解。它们分别对应 HTTP 协议中的 POST 和 PUT 方法,通常用于创建和更新资源。下面详细解释如何在 Spring MVC 中使用这两个注解。 1. 使用 PostMapping PostMapping 注解用于处理 H…...

AIGC Agent(智能体)应用开发高级工程师实战培训 —— 线上8周系统教学课程学习路线图

🎯 课程目标 系统掌握AIGC核心技术:学员将通过项目驱动学习,从文本生成、图像创意到智能体开发,全面进阶AIGC技术,探索其在营销、教育、数据处理、知识管理等领域的实际应用。构建AIGC智能体服务体系:学成…...

GDSC、CTRP数据库学习

GDSC 写在前面下载数据疑问1.GDSC、CTRP数据里有TCGA配套的数据?数据类型?CTRP原始数据如何处理 写在前面 开此贴做GDSC的数据分析记录 下载数据 GDSC官网:http://www.cancerrxgene.org/ 由于在官网下载数据过于麻烦,于是我使用…...

【嵌入式】ESP32开发(一)ESP-IDF概述

文章目录 1 前言2 IDF环境配置3 在VS Code中使用IDF3.1 使用ESP-IDF例程3.2 底部按钮的作用【重要!】3.3 高级用法4 ESP-IDF框架分析5 从零开始创建一个项目5.1 组件(component)6 主要参考资料7 遇到的一些问题与解决办法8 对于ESP-IDF开发的一些感受1 前言 对于ESP32的开发…...

最新6.7分非肿瘤纯生信,使用机器学习筛选慢阻肺中的关键基因。机器学习在非肿瘤生信文章中正火,可重复!

关于非肿瘤生信,我们也解读过很多,主要有以下类型 1 单个疾病WGCNAPPI分析筛选hub基因。 2 单个疾病结合免疫浸润,铁死亡,自噬等基因集,机器学习算法等。 3 两种相关疾病联合分析,包括非肿瘤结合非肿瘤&…...

vue 提交表单抹除字段为空的数据

使用背景 在配合后端post请求接口的时候 仅需要将有值的字段传入接口中 关键代码 cleanDataObj(obj) {Object.keys(obj).forEach((key) > {if (obj[key] ) {delete obj[key]}})},demo如下 export default {data() {return {demoObject:{name:小花,sex:,hobb…...

web实验3:虚拟主机基于不同端口、目录、IP、域名访问不同页面

创建配置文件: 创建那几个目录及文件,并且写内容: 为网卡ens160添加一个 IPv4 地址192.168.234.199/24: 再重新激活一下网卡ens160: 重启服务: 关闭防火墙、改宽松模式: 查看nginx端口监听情况:…...

英伟达Isaac Manipulator产品体验

相关配置 Isaac Manipulator3.1.0Isaac Sim4.2.0Ubuntu20.04GPURTX 4090 LaptopCPUI9 13900HXMem64GB 过程记录与反馈 GPU加速效果 请描述您在使用Isaac Manipulator时,调用cuMotion加速库来进行机器人运动规划和轨迹优化等任务的步骤和过程,并记录任…...

网安加·百家讲坛 | 仝辉:金融机构鸿蒙应用安全合规建设方案

作者简介:仝辉,北京娜迦信息科技发展有限公司攻防安全负责人,深耕移动应用安全领域十余年,获得过CISP、CISSP、OSCP、PMP、CCRC-CIASW等相关证书,参与多项移动应用安全标准起草,参与华为、平安集团、中国移…...

PHP Session

PHP Session PHP Session 是一种在 PHP 中用于跟踪用户会话的技术。会话允许在用户浏览网站时存储和访问用户信息。本文将详细介绍 PHP Session 的工作原理、如何创建和销毁会话、会话的安全性和最佳实践。 什么是 PHP Session? 在 Web 开发中,HTTP 是一种无状态的协议,这…...

泷羽sec学习打卡-Linux基础2

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于Linux的那些事儿-Base2 一、Linux-Base2linux有哪些目录呢?不同目录下有哪些具体的文件呢…...

# 【STM32F1】——无线收发模块RF200与串口通信

【STM32F1】——无线收发模块RF200与串口通信 一、简介 本篇主要对调试无线收发模块RF200的过程进行总结,实现了以下功能。 串口普通收发:使用STM32F103C8T6的USART2串口接收中断,实现两个无线收发模块RF200间的通信。二、RF200介绍 电压:3.4-5.5V工作频率:418~455MHz发…...

计算机网络:运输层 —— TCP 协议概述与 TCP 报文段首部格式

文章目录 基本概念主要特点和功能TCP报文段的首部格式字段标志位扩展首部 传输控制协议(Transmission Control Protocol,TCP)协议是互联网上最常用的传输层协议之一,它负责提供可靠的端到端数据传输服务。TCP 协议采用连接导向的通…...

python正则表达式和递归

一、正则表达式 1.基础匹配 学习目标:了解什么是正则表达式,掌握re模块的基础使用 就是一种规则的定义,通过规则去验证给定的目标是否符合定义的规则。 正则的三个基础方法 match match是匹配开头,开头有python就算匹配成功&a…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线, n r n_r nr​ 根接收天线的 MIMO 系…...

深度学习习题2

1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...