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来定义方法,例如&#…...
深度学习如何训练出好的模型
深度学习在近年来得到了广泛的应用,从图像识别、语音识别到自然语言处理等领域都有了卓越的表现。但是,要训练出一个高效准确的深度学习模型并不容易。不仅需要有高质量的数据、合适的模型和足够的计算资源,还需要根据任务和数据的特点进行合…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
