mqtt协议1- 简介和报文格式
文章目录
- 1.mqtt协议1: 简介和报文格式
- 1.1.MQTT概念
- 1.2.数据
- 2.控制报文格式
- 2.1.MQTT数据包结构
- 2.2.固定头
- 2.2.1.控制报文类型
- 2.2.2.标志FLag
- 2.2.3.剩余长度
- 2.3.可变头
- 2.4.有效载荷Payload消息体
- 安全
- QoS(Quality of Service levels)
- ref:
1.mqtt协议1: 简介和报文格式
- Message Queing Telemetry Transport: 消息队列遥测传输协议
- 基于发布/订阅模式的轻量级通讯协议, 基于于TCP/IP协议, IBM1999年发布
- 特点: 轻量, 简单, 开放, 实时, 可靠

- 服务器分发消息, 可发布, 不订阅
- 客户端可发布, 订阅1
1.1.MQTT概念
- 网络连接Network Connection:使用底层传输协议基础设施
- 客户端用它连接服务端
- 提供有序, 可靠, 双向字节流传输
- 应用消息Application Message: MQTT协议通过网络传输应用数据
- 应用消息通过MQTT传输, 有关联的服务质量QoS与主题Topic
- 客户端Client: 使用MQTT的程序/设备, 总是通过网络连接到服务端
- 发布消息->其他客户端
- 订阅消息->以请求接受相关应用消息
- 取消订阅, 移除请求
- 从服务端断开连接
- 服务端Server: 发送消息的客户端, 请求订阅的客户端之间的中介
- 接受网络连接<-来自客户端
- 接受消息<-客户端发布的应用消息
- 转发消息->符合条件的已订阅客户端
- 处理客户端的订阅, 取消订阅的请求
- 订阅Subscription: 含一个主题过滤器Topic Filter, 一个最大的服务质量QoS等级
- 订阅与单个会话关联, 可包含多于一个订阅
- 会话的每个订阅有一个不同的主题过滤器
- 主题名TopicName: 附加于应用消息的标签, 服务端已知且与订阅匹配. 服务端发送应用消息的副本给每个匹配的客户端订阅
- 主题过滤器Topic Filter: 订阅中包含一个表达式, 表示相关的一个/多个主题, 可用通配符
- 会话Session: 客户端&服务端之间状态交互. 一些绘画持续时长同网络连接, 另一些可在客户端和服务端的多个连续网络连接间扩展
- 控制报文MQTT Control Packet: 通过网络连接发送的信息数据包
- MQTT规定14种不同类型控制报文, PUBLISH用于传输应用消息
1.2.数据
- 整数数值,16位, 大端序: 16位字: MSB,LSB
2.控制报文格式
2.1.MQTT数据包结构
- 固定头: 所有, 表示数据包类型与数据包分组类标识
- 可变头: 部分, 数据包类型决定可变头是否存在及其具体内容
- 消息体: 部分, 表示客户端按收到的具体内容

2.2.固定头
- 消息类型
- 标识位/DUP: 不用标识位的消息类型中,DUP作为保留位; 收到无效标志时必须关闭网络连接
- QoS服务质量等级: 0最多一次, 1至少一次, 2一次
- RETAIN: 发布保留标识, 服务器要保留此次推送的信息, 若有新订阅者, 推送该消息, 若无则推送一次后释放
- 剩余长度: 前七位保存长度, 末位标识=1长度不足需用第二个字节保存
| Bit | 7,6,5,4 | 3,2,1,0 |
|---|---|---|
| byte1 | MQTT控制报文类型 | 指定控制报文类型的标志位 |
| byte2 | 剩余长度 |
2.2.1.控制报文类型
- byte1[7-4]
| 名字 | 值 | 报文流动方向 | 描述 |
|---|---|---|---|
| Reserved | 0 | 禁止 | 保留 |
| CONNECT | 1 | Client->Server | Client请求连接Server |
| CONNACK | 2 | Server->Client | 连接报文确认 |
| PUBLISH | 3 | <-> | 发布消息 |
| PUBACK | 4 | <-> | QoS1消息发布收到确认 |
| PUBREC | 5 | <-> | 发布收到(交付第1步) |
| PUBREL | 6 | <-> | 发布释放(交付第2步) |
| PUBCOMP | 7 | <-> | QoS2消息发布完成(3步) |
| SUBSCRIBE | 8 | Client->Server | 客户端订阅请求 |
| SUBACK | 9 | Server->Client | 订阅请求报文确认 |
| UNSUBSCRIBE | 10 | Client->Server | 客户端取消请阅请求 |
| UNSUBACK | 11 | Server->Client | 取消订阅报文确认 |
| PINGREQ | 12 | Client->Server | 心跳请求 |
| PINGRESP | 13 | Server->Client | 心跳响应 |
| DISCONNECT | 14 | Client->Server | 客户端断开连接 |
| Reserved | 15 | 禁止 | 保留 |
2.2.2.标志FLag
- byte1[3-0]
- 必须设置表格中列出的值, 若非法标志, 必须关闭网络连接
| 控制报文 | 固定报头标志 | Bit3 | Bit2 | Bit1 | Bit0 |
|---|---|---|---|---|---|
| CONNECT | R | 0 | 0 | 0 | 0 |
| CONNACK | R | 0 | 0 | 0 | 0 |
| PUBLISH | MQTT3.1.1 | DUP1^11 | QoS2^22 | QoS2^22 | RETAIN3^33 |
| PUBACK | R | 0 | 0 | 0 | 0 |
| PUBREC | R | 0 | 0 | 0 | 0 |
| PUBREL | R | 0 | 0 | 1 | 0 |
| PUBCOMP | R | 0 | 0 | 0 | 0 |
| SUBSCRIBE | R | 0 | 0 | 1 | 0 |
| SUBACK | R | 0 | 0 | 0 | 0 |
| UNSUBSCRIBE | R | 0 | 0 | 1 | 0 |
| UNSUBACK | R | 0 | 0 | 0 | 0 |
| PINGREQ | R | 0 | 0 | 0 | 0 |
| PINGRESP | R | 0 | 0 | 0 | 0 |
| DISCONNECT | R | 0 | 0 | 0 | 0 |
- DUP1^11 =控制报文的重复分发标志
- QoS2^22 =PUBLISH报文的服务质量等级
- RETAIN3^33 =PUBLISH报文的保留标志
2.2.3.剩余长度
- byte2开始, 当前报文剩余部分字节数, 包括可变报头, 负载数据
- 不包括用于编码剩余长度字段本身的字节数
- 变长度编码, 对<128值用单字节编码
- 剩余长度最大4字节
128值: 低7位有效位编码数据, 最高位标志位, 指示是否有更多字节, 每字节可编码128值和1延续位
- 1个字节时,从0(0x00)到127(0x7f)
- 2个字节时,从128(0x80,0x01)到16383(0Xff,0x7f)
- 3个字节时,从16384(0x80,0x80,0x01)到2097151(0xFF,0xFF,0x7F)
- 4个字节时,从2097152(0x80,0x80,0x80,0x01)到268435455(0xFF,0xFF,0xFF,0x7F)
2.3.可变头
- 固定报头和负载之间
- 内容因数据包类型而异, 一般作为包标识
- 报文标识符Packet Identifier
- 报文PUBLISH(QoS>0), PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK包含
- 两字节: byte1:MSB, byte2:LSB
- SUBSCRIBE, UNSUBSCRIBE, PUBLISH(QoS>0)必须包含非0:16位报文标识符
-
客户端每次发送一个新的该报文时必须分配一个当前未使用的报文标识符
-
若CLient要重发这个特殊控制报文, 随后重发报文时必须用相同标识符
-
CLient处理完该报文对应的确认后, 该标识符释放可重用
-
QoS1:PUBLISH对应PUBACK
-
QoS2:PUBLISH对应PUBCOMP, SUBSCRIBE/UNSUBSCRIBE对应SUBACK/UNSUBACK
-
发送QOS0的PUBLISH报文时, 相同条件也适用于服务端;
-
QoS0的PUBLISH报文不能含报文标识符
-
PUBACK, PUBREC, PUBREL报文必须包含与最初发送PUBLISH报文相同的标识符
-
SUBACK,UNSUBACK必须包含对应SUBSCRIBE, UNSUBSCRIBE报文使用的标识符
-
CLient和Server彼此独立地分配报文标识符, 使用相同报文标识符可实现并发消息交换
控制报文 报文标识符字段 CONNECT N CONNACK N PUBLISH Y若QoS>0 PUBACK Y PUBREC Y PUBREL Y PUBCOMP Y SUBSCRIBE Y SUBACK Y UNSUBSCRIBE Y UNSUBACK Y PINGREQ N PINGRESP N DISCONNECT N
-
2.4.有效载荷Payload消息体
- 四种类型
- CONNECT: 客户端ClientID, 订阅Topic, Message, 用户名, 密码
- SUBSCRIBE: 一系列要订阅的主题及QoS
- SUBACK: 对SUBSCRIBE所申请主题及QoS进行确认,回复
- UNSUBSCRIBE: 要订阅的主题
| 控制报文 | 有效载荷 |
|---|---|
| CONNECT | Y |
| CONNACK | N |
| PUBLISH | 可选 |
| PUBACK | N |
| PUBREC | N |
| PUBREL | N |
| PUBCOMP | N |
| SUBSCRIBE | Y |
| SUBACK | Y |
| UNSUBSCRIBE | Y |
| UNSUBACK | N |
| PINGREQ | N |
| PINGRESP | N |
| DISCONNECT | N |
安全
QoS(Quality of Service levels)
- 服务质量是MQTT重要特性
- QoS 0: 最多一次, 会发生消息丢失/重复, 消息发布依赖底层TCP/IP网络
- QoS 1: 至少一次
- QoS 2: 保证一次
ref:
- MQTT协议,终于有人讲清楚了
- MQTT协议中文版
相关文章:
mqtt协议1- 简介和报文格式
文章目录1.mqtt协议1: 简介和报文格式1.1.MQTT概念1.2.数据2.控制报文格式2.1.MQTT数据包结构2.2.固定头2.2.1.控制报文类型2.2.2.标志FLag2.2.3.剩余长度2.3.可变头2.4.有效载荷Payload消息体安全QoS(Quality of Service levels)ref:1.mqtt协议1: 简介和报文格式 Message Que…...
前端用动画快速实现骨架屏效果
一、动画的语法 1.定义动画 keyframes 自定义动画名称 {// 开始from {transform: scale(1);}// 结束to {transform: scale(1.5);} }// 或者还可以使用百分比定义keyframes 动画名称 {// 开始0% {transform: scale(1);}// 结束100% {transform: scale(1.5);} } 2.调用 anima…...
Python入门(未完待续。。。)
认识python 解释型(写完直接运行)、面向对象的高级编程语言;开源免费、支持交互式、可跨平台移植的脚本语言;优点:开源、易于维护、可移植、简单优雅、功能强大、可扩展、可移植;缺点:解释型→运…...
注解配置SpringMVC
使用配置类和注解代替web.xml和Spring和SpringMVC配置文件的功能。创建初始化类,代替web.xmlSpring3.2引入了一个便利的WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletInitializer,当我们的类扩展了Abstr…...
多项新规重磅发布,微信视频号近期需要关注这几点
随着功能的完善和内容生态的丰富,视频号逐渐放慢产品更新频率,将重点放到商家准入标准、创作者扶持计划上来,本期我们将更侧重解读平台新规,帮助大家了解行业动向,把握最新趋势。01 视频号小店结算规则修订 取消48小时…...
Java调用第三方http接口的方式
1. 概述 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。 在Java项目中调用第三方接…...
【跟我一起读《视觉惯性SLAM理论与源码解析》】第五章第六章 对极几何图优化库的使用
极平面,极点,极线的概念对极几何,对极约束的概念,通过叉积以及点积的性质推导单应矩阵以及基础矩阵光束平差法BA是LSAM中常用的非线性优化方法一个图由若干个顶点以及这些顶点连接的边构成,顶点通常是待优化的变量例如…...
从没想过开源 API 工具的 Mock 功能,这么好用
很多时候,接口尚未开发完成,在系统交互双方定义好接口之后,我们可以提前进行开发和测试,并不依赖上游系统的开发实现。 通过使用Mock模拟数据接口,我们即可在只开发了UI的情况下,无须服务端的开发就可以进行…...
智慧教室--智能管控系统
智慧教室系统是一款基于AIOT数字化平台的智能教育解决方案,该系统实现了全面数字化、自动化管理和智能化控制,可大大提高教学效率和质量,为学生带来更加优质的教育体验。智能管控是智慧教室系统的核心功能之一。通过物联网技术,将…...
React的useLayoutEffect和useEffect执行时机有什么不同
我们先看下 React 官方文档对这两个 hook 的介绍,建立个整体认识 useEffect(create, deps): 该 Hook 接收一个包含命令式、且可能有副作用代码的函数。在函数组件主体内(这里指在 React 渲染阶段)改变 DOM、添加订阅、设置定时器、记录日志以…...
C语言中#include<...>和#include“...“的区别
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程…...
ubuntu本地访问nas
需求 本地磁盘空间太小,本地网络里有个nas,希望将nas作为数据盘挂载到本地使用。 方法1 基于sftp访问nas 首先nas设置时要打开sftp访问功能。 然后用ubuntu桌面访问服务器的功能登录sftp,类似如下指令 sftp://user192.168.0.100 ubuntu下…...
第一章:网络参考模型
一、专业术语 ISO---(International Organization for Standardization)国际标准化组织 OSI---(Open System Interconnection Reference Model)开放式系统互联通信参考模型 IEEE---(Institute of Electrical and Electronics Engi…...
extends in typescript
困惑 初学 ts 时,extends 让我很困惑:有时它代表 扩大 ,有时代表 缩小 。举几个例子说明: 例1: class Animal {} class Dog extends Animal {}这是 js 本身就有的 class 继承语法,很熟悉了。 Dog 是 An…...
如何找回回收站删除的文件
回收站作为删除文件后的临时存放点,只要我们是右键删除或者按delete删除的文件都会存放到这里,所以我们每次清理电脑后,都会清空回收站,这样可以让电脑保持流畅运行。但删除这个操作是很容易出错,很容易把某些重要的文…...
Git系列——Git部署及应用
下面从如下几个方面介绍下其部署及应用:Git服务器搭建Git客户端搭建Git常用命令Git服务器搭建Linux服务器搭建(Centos7.5):一、安装配置SSH(参考XXX)二、检查OS是否自带Git1、git-version //查询版本2、rpm -qa git //查询git详细信息3、yum -y remove x…...
Java多线程(二)--线程相关内容
1.创建线程的几种方式继承 Thread 类;public class MyThread extends Thread { Override public void run() {System.out.println(Thread.currentThread().getName() " run()方法正在执行..."); }实现 Runnable 接口;public class MyRunnable…...
CF1692E Binary Deque 题解
CF1692E Binary Deque 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码实现题目 链接 https://www.luogu.com.cn/problem/CF1692E 字面描述 题面翻译 有多组数据。 每组数据给出 nnn 个数,每个数为 000 或 1…...
rust方法和关联函数
Rust方法 在大多数面向对象的语言中都存在方法,方法一般和类关联在一起。在Rust中也是类似的,方法和对象总是一起出现。Rust的方法和结构体,枚举,特征一起使用。 定义方法 Rust使用关键字impl来定义方法,例如&#…...
深度学习如何训练出好的模型
深度学习在近年来得到了广泛的应用,从图像识别、语音识别到自然语言处理等领域都有了卓越的表现。但是,要训练出一个高效准确的深度学习模型并不容易。不仅需要有高质量的数据、合适的模型和足够的计算资源,还需要根据任务和数据的特点进行合…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
