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

深度学习如何训练出好的模型
深度学习在近年来得到了广泛的应用,从图像识别、语音识别到自然语言处理等领域都有了卓越的表现。但是,要训练出一个高效准确的深度学习模型并不容易。不仅需要有高质量的数据、合适的模型和足够的计算资源,还需要根据任务和数据的特点进行合…...

智慧教室系统--重点设备监控系统
随着教育信息化的不断发展,智慧教室已成为现代教育的重要组成部分。而智慧教室的设备管理和维护也变得越来越重要。一旦智慧教室的重要设备出现故障或异常,将会对教学活动产生不利影响,因此建立智慧教室重点设备监控系统是必要的。一、智慧教…...

Linux中断处理
目录 一、什么是中断 二、中断处理原理 三、中断接口 3.1 中断申请 3.2 中断释放 3.3 中断处理函数原型 四、按键驱动 一、什么是中断 一种硬件上的通知机制,用来通知CPU发生了某种需要立即处理的事件 分为: 1. 内部中断 CPU执行程序的过程中&am…...

python中安装gurobi和pycharm没有语法提示问题解决
安装gurobi第一步 :下载gurobi ( http://www.gurobi.com ) ,需要注册账号第二步、申请License注册如果可以通过校园网, 则直接生成。不能的话,通过网站,发邮件申请 http://www.gurobi.cn/NewsView1.Asp?id4第三、邮件…...

滤波算法:经典卡尔曼滤波
卡尔曼滤波实质上就是基于观测值以及估计值二者的数据对真实值进行估计的过程。预测步骤如图1所示: 图1 卡尔曼滤波原理流程图 假设我们能够得到被测物体的位置和速度的测量值 ,在已知上一时刻的最优估计值 以及它的协方差矩阵 的条件下ÿ…...

flask框架(下)
文章目录flask框架(下)werkzeug简介请求上下文flask 处理方案回到 wsgi_app 方法中push 源码总结补充flask框架(下) werkzeug简介 Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库。这里稍微说一下, werkzeug 不是一个web服务器,也…...

Airbyte架构
作为一款技术复杂的数据集成管道,Airbyte的架构模式非常清晰明了。Airbyte应用模式Airbyte管道架构UI:一个易于使用的图形界面,用于与Airbyte API进行交互。WebApp Server:处理 UI 和 API 之间的连接。Config Store:存…...

anchor box只是先验知识,bounding box是一种过程,ground truth才是标准答案,
anchor boxes是一组提前预定义的边框,这些框的宽高和数据集中目标物体的宽高大体是一致的,换句话说,数据集中的绝大多数物体都能找到与其大小一致的anchor box。 举例来说,如果数据集中包含苹果、猫,那么这组anchor bo…...

带你轻松实现通讯录(C语言版)
文章目录前言通讯录初始化通讯录运行的基本框架和菜单增添联系人删除联系人查找联系人修改联系人信息展示通讯录通讯录联系人个数排序通讯录文件操作储存通讯录信息销毁通讯录整体代码Contacts.hContacts.ctest.c写在最后前言 学习C语言的小伙伴,相信都要经历实现通…...

渗透测试之交换式网络嗅探实验
渗透测试之交换式网络嗅探实验实验目的一、实验原理1.1 网络嗅探器Sniffer的工作原理1.2 网络嗅探器的分类1.3 网络嗅探器Sniffer的作用二、实验环境2.1 操作机器2.2 实验工具Sniffer2.3 安装工具Sniffer三、实验步骤1. 熟悉Sniffer工具的启动2. 进行监听3. 熟悉Sniffer工具的介…...

rust 安装
rust 安装一、需要一个c的环境二、配置环境变量三、开始安装一、需要一个c的环境 安装Visual Studio 二、配置环境变量 Rust需要安装两个东西,一个是rustup,一个是cargo。所以你需要设置两个环境变量来分别指定他们的安装目录。 通过RUSTUP_HOME指定…...