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来定义方法,例如&#…...

深度学习如何训练出好的模型
深度学习在近年来得到了广泛的应用,从图像识别、语音识别到自然语言处理等领域都有了卓越的表现。但是,要训练出一个高效准确的深度学习模型并不容易。不仅需要有高质量的数据、合适的模型和足够的计算资源,还需要根据任务和数据的特点进行合…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...