当前位置: 首页 > news >正文

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长度不足需用第二个字节保存
Bit7,6,5,43,2,1,0
byte1MQTT控制报文类型指定控制报文类型的标志位
byte2剩余长度

2.2.1.控制报文类型

  • byte1[7-4]
名字报文流动方向描述
Reserved0禁止保留
CONNECT1Client->ServerClient请求连接Server
CONNACK2Server->Client连接报文确认
PUBLISH3<->发布消息
PUBACK4<->QoS1消息发布收到确认
PUBREC5<->发布收到(交付第1步)
PUBREL6<->发布释放(交付第2步)
PUBCOMP7<->QoS2消息发布完成(3步)
SUBSCRIBE8Client->Server客户端订阅请求
SUBACK9Server->Client订阅请求报文确认
UNSUBSCRIBE10Client->Server客户端取消请阅请求
UNSUBACK11Server->Client取消订阅报文确认
PINGREQ12Client->Server心跳请求
PINGRESP13Server->Client心跳响应
DISCONNECT14Client->Server客户端断开连接
Reserved15禁止保留

2.2.2.标志FLag

  • byte1[3-0]
  • 必须设置表格中列出的值, 若非法标志, 必须关闭网络连接
控制报文固定报头标志Bit3Bit2Bit1Bit0
CONNECTR0000
CONNACKR0000
PUBLISHMQTT3.1.1DUP1^11QoS2^22QoS2^22RETAIN3^33
PUBACKR0000
PUBRECR0000
PUBRELR0010
PUBCOMPR0000
SUBSCRIBER0010
SUBACKR0000
UNSUBSCRIBER0010
UNSUBACKR0000
PINGREQR0000
PINGRESPR0000
DISCONNECTR0000
  • 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彼此独立地分配报文标识符, 使用相同报文标识符可实现并发消息交换

        控制报文报文标识符字段
        CONNECTN
        CONNACKN
        PUBLISHY若QoS>0
        PUBACKY
        PUBRECY
        PUBRELY
        PUBCOMPY
        SUBSCRIBEY
        SUBACKY
        UNSUBSCRIBEY
        UNSUBACKY
        PINGREQN
        PINGRESPN
        DISCONNECTN

2.4.有效载荷Payload消息体

  • 四种类型
  • CONNECT: 客户端ClientID, 订阅Topic, Message, 用户名, 密码
  • SUBSCRIBE: 一系列要订阅的主题及QoS
  • SUBACK: 对SUBSCRIBE所申请主题及QoS进行确认,回复
  • UNSUBSCRIBE: 要订阅的主题
控制报文有效载荷
CONNECTY
CONNACKN
PUBLISH可选
PUBACKN
PUBRECN
PUBRELN
PUBCOMPN
SUBSCRIBEY
SUBACKY
UNSUBSCRIBEY
UNSUBACKN
PINGREQN
PINGRESPN
DISCONNECTN

安全

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 解释型&#xff08;写完直接运行&#xff09;、面向对象的高级编程语言&#xff1b;开源免费、支持交互式、可跨平台移植的脚本语言&#xff1b;优点&#xff1a;开源、易于维护、可移植、简单优雅、功能强大、可扩展、可移植&#xff1b;缺点&#xff1a;解释型→运…...

注解配置SpringMVC

使用配置类和注解代替web.xml和Spring和SpringMVC配置文件的功能。创建初始化类&#xff0c;代替web.xmlSpring3.2引入了一个便利的WebApplicationInitializer基础实现&#xff0c;名为AbstractAnnotationConfigDispatcherServletInitializer&#xff0c;当我们的类扩展了Abstr…...

多项新规重磅发布,微信视频号近期需要关注这几点

随着功能的完善和内容生态的丰富&#xff0c;视频号逐渐放慢产品更新频率&#xff0c;将重点放到商家准入标准、创作者扶持计划上来&#xff0c;本期我们将更侧重解读平台新规&#xff0c;帮助大家了解行业动向&#xff0c;把握最新趋势。01 视频号小店结算规则修订 取消48小时…...

Java调用第三方http接口的方式

1. 概述 在实际开发过程中&#xff0c;我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范&#xff0c;所以大多数需要去调用对方提供的接口或第三方接口&#xff08;短信、天气等&#xff09;。 在Java项目中调用第三方接…...

【跟我一起读《视觉惯性SLAM理论与源码解析》】第五章第六章 对极几何图优化库的使用

极平面&#xff0c;极点&#xff0c;极线的概念对极几何&#xff0c;对极约束的概念&#xff0c;通过叉积以及点积的性质推导单应矩阵以及基础矩阵光束平差法BA是LSAM中常用的非线性优化方法一个图由若干个顶点以及这些顶点连接的边构成&#xff0c;顶点通常是待优化的变量例如…...

从没想过开源 API 工具的 Mock 功能,这么好用

很多时候&#xff0c;接口尚未开发完成&#xff0c;在系统交互双方定义好接口之后&#xff0c;我们可以提前进行开发和测试&#xff0c;并不依赖上游系统的开发实现。 通过使用Mock模拟数据接口&#xff0c;我们即可在只开发了UI的情况下&#xff0c;无须服务端的开发就可以进行…...

智慧教室--智能管控系统

智慧教室系统是一款基于AIOT数字化平台的智能教育解决方案&#xff0c;该系统实现了全面数字化、自动化管理和智能化控制&#xff0c;可大大提高教学效率和质量&#xff0c;为学生带来更加优质的教育体验。智能管控是智慧教室系统的核心功能之一。通过物联网技术&#xff0c;将…...

React的useLayoutEffect和useEffect执行时机有什么不同

我们先看下 React 官方文档对这两个 hook 的介绍&#xff0c;建立个整体认识 useEffect(create, deps): 该 Hook 接收一个包含命令式、且可能有副作用代码的函数。在函数组件主体内&#xff08;这里指在 React 渲染阶段&#xff09;改变 DOM、添加订阅、设置定时器、记录日志以…...

C语言中#include<...>和#include“...“的区别

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…...

ubuntu本地访问nas

需求 本地磁盘空间太小&#xff0c;本地网络里有个nas&#xff0c;希望将nas作为数据盘挂载到本地使用。 方法1 基于sftp访问nas 首先nas设置时要打开sftp访问功能。 然后用ubuntu桌面访问服务器的功能登录sftp&#xff0c;类似如下指令 sftp://user192.168.0.100 ubuntu下…...

第一章:网络参考模型

一、专业术语 ISO---&#xff08;International Organization for Standardization&#xff09;国际标准化组织 OSI---&#xff08;Open System Interconnection Reference Model&#xff09;开放式系统互联通信参考模型 IEEE---(Institute of Electrical and Electronics Engi…...

extends in typescript

困惑 初学 ts 时&#xff0c;extends 让我很困惑&#xff1a;有时它代表 扩大 &#xff0c;有时代表 缩小 。举几个例子说明&#xff1a; 例1&#xff1a; class Animal {} class Dog extends Animal {}这是 js 本身就有的 class 继承语法&#xff0c;很熟悉了。 Dog 是 An…...

如何找回回收站删除的文件

回收站作为删除文件后的临时存放点&#xff0c;只要我们是右键删除或者按delete删除的文件都会存放到这里&#xff0c;所以我们每次清理电脑后&#xff0c;都会清空回收站&#xff0c;这样可以让电脑保持流畅运行。但删除这个操作是很容易出错&#xff0c;很容易把某些重要的文…...

Git系列——Git部署及应用

下面从如下几个方面介绍下其部署及应用&#xff1a;Git服务器搭建Git客户端搭建Git常用命令Git服务器搭建Linux服务器搭建(Centos7.5):一、安装配置SSH&#xff08;参考XXX)二、检查OS是否自带Git1、git-version //查询版本2、rpm -qa git //查询git详细信息3、yum -y remove x…...

Java多线程(二)--线程相关内容

1.创建线程的几种方式继承 Thread 类&#xff1b;public class MyThread extends Thread { Override public void run() {System.out.println(Thread.currentThread().getName() " run()方法正在执行..."); }实现 Runnable 接口&#xff1b;public class MyRunnable…...

CF1692E Binary Deque 题解

CF1692E Binary Deque 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路代码实现题目 链接 https://www.luogu.com.cn/problem/CF1692E 字面描述 题面翻译 有多组数据。 每组数据给出 nnn 个数&#xff0c;每个数为 000 或 1…...

rust方法和关联函数

Rust方法 在大多数面向对象的语言中都存在方法&#xff0c;方法一般和类关联在一起。在Rust中也是类似的&#xff0c;方法和对象总是一起出现。Rust的方法和结构体&#xff0c;枚举&#xff0c;特征一起使用。 定义方法 Rust使用关键字impl来定义方法&#xff0c;例如&#…...

深度学习如何训练出好的模型

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

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...