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来定义方法,例如&#…...
深度学习如何训练出好的模型
深度学习在近年来得到了广泛的应用,从图像识别、语音识别到自然语言处理等领域都有了卓越的表现。但是,要训练出一个高效准确的深度学习模型并不容易。不仅需要有高质量的数据、合适的模型和足够的计算资源,还需要根据任务和数据的特点进行合…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
