【MQTT-协议原理】

news2025/4/15 11:28:45

MQTT-协议原理

  • ■ MQTT-协议原理
  • ■ MQTT-服务器 称为"消息代理"(Broker)
  • ■ MQTT协议中的订阅、主题、会话
    • ■ 一、订阅(Subscription)
    • ■ 二、会话(Session)
    • ■ 三、主题名(Topic Name)
    • ■ 四、主题筛选器(Topic Filter)
    • ■ 五、负载(Payload)
  • ■ MQTT协议数据包结构
    • ■ (1)固定报头(Fixed header)
      • ■ 1.1 MQTT控制报文的类型
      • ■ 1.2 报文类型标志位
      • ■ 1.3 剩余长度
    • ■ (2)可变报头(Variable header)
    • ■ (3)消息体(Payload)也称 有效载荷
  • ■ MQTT 控制报文
    • ■ CONNECT – 连接服务端
    • ■ CONNACK – 确认连接请求
    • ■ PUBLISH – 发布消息
    • ■ PUBACK –发布确认
    • ■ SUBSCRIBE - 订阅主题
  • ■ 通配符
    • ■ 多层通配符 ‘#’ U+0023
    • ■ 单层通配符 ‘+’ U+002B
    • ■ $开头的主题

■ MQTT-协议原理

MQTT协议中有三种身份: 发布者(Publish)、 代理(Broker)(服务器)、 订阅者(Subscribe)。
MQTT传输的消息分为: 主题(Topic) 负载(payload)

■ MQTT-服务器 称为"消息代理"(Broker)

MQTT服务器以称为"消息代理"(Broker),可以是一个应用程序或一台设备。
它是位于消息发布者和订阅者之间,它可以:
(1)接受来自客户的网络连接;
(2)接受客户发布的应用信息;
(3)处理来自客户端的订阅和退订请求;
(4)向订阅的客户转发应用程序消息。

■ MQTT协议中的订阅、主题、会话

■ 一、订阅(Subscription)

订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。

■ 二、会话(Session)

每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。

■ 三、主题名(Topic Name)

连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。

■ 四、主题筛选器(Topic Filter)

一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。

■ 五、负载(Payload)

消息订阅者所具体接收的内容。

■ MQTT协议数据包结构

在MQTT协议中,一个MQTT数据包由:固定报头(Fixed header)、可变报头(Variable header)、消息体(payload)三部分构成。MQTT数据包结构如下:

(1)固定报头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
(2)可变报头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
(3)消息体(Payload)。也是效载荷 存在于部分MQTT数据包中,表示客户端收到的具体内容。
在这里插入图片描述

■ (1)固定报头(Fixed header)

固定包头包含
控制报文类型
控制报文标志位
剩余长度
在这里插入图片描述
剩余长度是可变的 1-4 个字节

■ 1.1 MQTT控制报文的类型

在这里插入图片描述
在这里插入图片描述

■ 1.2 报文类型标志位

[3-0]包含每个 MQTT 控制报文类型特定的标志
在这里插入图片描述
DUP1 =控制报文的重复分发标志
QoS2 = PUBLISH 报文的服务质量等级
RETAIN3 = PUBLISH 报文的保留标志

■ 1.3 剩余长度

位置: 从第 2 个字节开始。
剩余长度(Remaining Length) 表示当前报文剩余部分的字节数, 包括可变报头和负载的数据。
剩余长度 不包括用于编码剩余长度字段本身的字节数。

剩余长度字段 使用一个变长度编码方案:
对小于 128 的值它使用单字节编码。
更大的值按下面的方式处理。低 7 位有效位用于编码数据,最高有效位用于指示是否有更多的字节。
因此每个字节可以编码 128 个数值和一个延续位(continuation bit) 。
剩余长度字段最大 4 个字节。
在这里插入图片描述
例如:剩余长度字节长度是64 剩余长度填充的值就是一个字节表示64。
答 :对小于 128 的值它使用单字节编码。

例如:剩余长度是321 剩余长度填充的值 如下:
答 :大于 128 低 7 位有效位用于编码数据
计算原理
321-128 = 193 //193又大于128 在减去
193-128 = 65

第一个字节: 193
第二个字节: 2 // 321 / 128 = 2 相当于上面减去两次128

假如 第二个字节又大于128 在进行上面计算原理。

■ (2)可变报头(Variable header)

可变报头的内容根据报文类型的不同而不同。
可变报头的报文标识符(Packet Identifier) 字段存在于在多个类型的报文里。
控制报文的可变报头部分包含两字节的报文标识符字段。
在这里插入图片描述
在这里插入图片描述

■ (3)消息体(Payload)也称 有效载荷

在这里插入图片描述

■ MQTT 控制报文

■ CONNECT – 连接服务端

在这里插入图片描述

(1)固定报头
在这里插入图片描述
(1)可变报头-协议名
在这里插入图片描述在这里插入图片描述
协议名是表示协议名 MQTT 的 UTF-8 编码的字符串。

(3)协议级别
在这里插入图片描述
客户端用 8 位的无符号值表示协议的修订版本 对于 3.1.1 版协议,协议级别字段的值是 4(0x04)。
(4)连接标志
在这里插入图片描述

清理会话 Clean Session客户端和服务端可以保存会话状态,以支持跨网络连接的可靠消息传输。 这个标志位用于控制会话状态的生存时间。
遗嘱标志 Will Flag遗嘱标志(Will Flag) 被设置为 1,表示如果连接请求被接受了, 遗嘱(Will Message) 消息必须被存储在服务端并且与这个网络连接关联。
遗嘱 QoS这两位用于指定发布遗嘱消息时使用的服务质量等级。
遗嘱保留
用户名标志
密码标志 Password Flag
保持连接保持连接(Keep Alive) 是一个以秒为单位的时间间隔,表示为一个 16 位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻, 两者之间允许空闲的最大时间间隔。 客户端负责保证控制报文发送的时间间隔不超过保持连接的值。

■ CONNACK – 确认连接请求

在这里插入图片描述
在这里插入图片描述
CONNACK 报文没有有效载荷。

■ PUBLISH – 发布消息

在这里插入图片描述
DUP 标志被设置为 0, 表示这是客户端或服务端第一次请求发送这个 PUBLISH 报文。
如果 DUP 标志被设置为 1,表示这可能是一个早前报文请求的重发。
在这里插入图片描述
示例中的主题名为 “a/b”, 长度等于 3, 报文标识符为 “10

■ PUBACK –发布确认

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
PUBACK 报文没有有效载荷。

■ SUBSCRIBE - 订阅主题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

■ 通配符

■ 多层通配符 ‘#’ U+0023

(‘#’ U+0023) 是用于匹配主题中任意层级的通配符。
多层通配符表示它的父级和任意数量的子层级。
多层通配符必须位于它自己的层级或者跟在主题层级分隔符后面。

例如, 如果客户端订阅主题 “sport/tennis/player1/#”, 它会收到使用下列主题名发布的消息:
“sport/tennis/player1”
“sport/tennis/player1/ranking”
“sport/tennis/player1/score/wimbledon”

“sport/#”也匹配单独的 “sport” , 因为 # 包括它的父级。
“#”是有效的, 会收到所有的应用消息。
	“sport/tennis/#”也是有效的。
	“sport/tennis#”是无效的。
	“sport/tennis/#/ranking”是无效的。

■ 单层通配符 ‘+’ U+002B

加号 (‘+’ U+002B) 是只能用于单个主题层级匹配的通配符。

非规范评注
例如, “sport/tennis/+” 
匹配 
	“sport/tennis/player1” 
	“sport/tennis/player2” , 
但是不匹配
	“sport/tennis/player1/ranking” 。同时, 由于单层通配符只能匹配一个层级, “sport/+” 不匹配
	“sport” 但是却匹配 “sport/”。

非规范评注
	 “+” 是有效的。
	 “+/tennis/#” 是有效的。
	 “sport+” 是无效的。
	 “sport/+/player1” 也是有效的。
	 “/finance” 匹配 “+/+” 和 “/+” ,但是不匹配 “+”。

■ $开头的主题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCIe 5.0光学SSD原型问世!

近日,Kioxia Corporation(铠侠)、AIO Core Co., Ltd. 和 Kyocera Corporation(京瓷)联合宣布成功开发了一款支持 PCIe 5.0 接口的光学 SSD 原型。该技术旨在通过光接口替换传统的电接口,从而显著增加计算设…

Raymarching Textures In Depth

本节课最主要的就是学会hlsl中使用纹理采样 float4 color Texture2DSample(Texobj, TexobjSampler, uv); return color; 课程中的代码(没有这张图我就没做) 课程代码产生深度的原因是uv偏移,黑色区域会不断向左偏移,直到找到白色…

文献总结:ECCV2022-BEVFormer

BEVFormer 一、文章基本信息二、文章背景三、BEVFormer架构(1) BEV 查询(2) 空间交叉注意力机制(3) 时间自注意力机制(4) BEV应用(5) 实施细节 四、实验五、总结 一、文章基本信息 标题BEVFormer: Learning Bird’s-Eye-view Representation from Multi-camera images via spa…

Openlayers:海量图形渲染之WebGL渲染

最近由于在工作中涉及到了海量图形渲染的问题,因此我开始研究相关的解决方案。我在网络上寻找相关的解决方案时发现许多的文章都提到利用Openlayers中的WebGLPointsLayer类,可以实现渲染海量的点,之后我又了解到利用WebGLVectorLayer类可以渲…

RCE漏洞学习

1,What is RCE? 在CTF(Capture The Flag)竞赛中,RCE漏洞指的是远程代码执行漏洞(Remote Code Execution)。这类漏洞允许攻击者通过某种方式在目标系统上执行任意代码,从而完全控制目…

如何使用 Grafana 连接 Easyearch

Grafana 介绍 Grafana 是一款开源的跨平台数据可视化与监控分析工具,专为时序数据(如服务器性能指标、应用程序日志、业务数据等)设计。它通过直观的仪表盘(Dashboards)帮助用户实时监控系统状态、分析趋势&#xff0…

mindsdb AI 开源的查询引擎 - 用于构建 AI 的平台,该平台可以学习和回答大规模联合数据的问题。

一、软件介绍 文末提供源码和程序下载学习 MindsDB 是一种解决方案,使人类、AI、代理和应用程序能够以自然语言和 SQL 查询数据,并在不同的数据源和类型中获得高度准确的答案。此开源程序是一个联合查询引擎,可以整理您的数据蔓延混乱&#…

BOTA六维力矩传感器如何打通机器人AI力控操作的三层架构?感知-决策-执行全链路揭秘

想象一下,你对着一个机器人说:“请帮我泡杯茶。”然后,它就真的开始行动了:找茶壶、烧水、取茶叶、泡茶……这一切看似简单,但背后却隐藏着复杂的AI技术。今天,我们就来揭秘BOTA六维力矩传感器在机器人操控…

macOS Chrome - 打开开发者工具,设置 Local storage

文章目录 macOS Chrome - 打开开发者工具设置 Local storage macOS Chrome - 打开开发者工具 方式2:右键点击网页,选择 检查 设置 Local storage 选择要设置的 url,显示右侧面板 双击面板,输入要添加的内容 2025-04-08&#xff…

kubernetes 入门篇之架构介绍

经过前段时间的学习和实践,对k8s的架构有了一个大致的理解。 1. k8s 分层架构 架构层级核心组件控制平面层etcd、API Server、Scheduler、Controller Manager工作节点层Kubelet、Kube-proxy、CRI(容器运行时接口)、CNI(网络插件&…

如何使用通义灵码完成PHP单元测试 - AI辅助开发教程

一、引言 在软件开发过程中,测试是至关重要的一环。然而,在传统开发中,测试常常被忽略或草草处理,很多时候并非开发人员故意为之,而是缺乏相应的测试思路和方法,不知道如何设计测试用例。随着 AI 技术的飞…

pig 权限管理开源项目学习

pig 源码 https://github.com/pig-mesh/pig 文档在其中,前端在文档中,官方视频教学也在文档中有。 第一次搭建,建议直接去看单体视频,照着做即可,需 mysql,redis 基础。 文章目录 项目结构Maven 多模块项…

探秘Transformer系列之(26)--- KV Cache优化 之 PD分离or合并

探秘Transformer系列之(26)— KV Cache优化 之 PD分离or合并 文章目录 探秘Transformer系列之(26)--- KV Cache优化 之 PD分离or合并0x00 概述0x01 背景知识1.1 自回归&迭代1.2 KV Cache 0x02 静态批处理2.1 调度策略2.2 问题…

C++语言程序设计——02 变量与数据类型

目录 一、变量与数据类型(一)变量的数据类型(二)变量命名规则(三)定义变量(四)变量赋值(五)查看数据类型 二、ASCII码三、进制表示与转换(一&…

Model Context Protocol (MCP) - 尝试创建和测试一下MCP Server

1.简单介绍 MCP是Model Context Protocol的缩写,是Anthropic开源的一个标准协议。MCP使得大语言模型可以和外部的数据源,工具进行集成。当前MCP在社区逐渐地流行起来了。同时official C# SDK(仓库是csharp-sdk) 也在不断更新中,目前最新版本…

python文件打包无法导入ultralytics模块

💥打包的 .exe 闪退了?别慌!教你逐步排查 PyInstaller 打包的所有错误! 🛠 运行 .exe 查看报错信息✅ 正确姿势: ⚠ importlib 动态导入导致打包失败❓什么是动态导入?✅ 解决方式: …

AMBA-CHI协议详解(二十六)

AMBA-CHI协议详解(一)- Introduction AMBA-CHI协议详解(二)- Channel fields / Read transactions AMBA-CHI协议详解(三)- Write transactions AMBA-CHI协议详解(四)- Other transactions AMBA-CHI协议详解(五)- Transaction identifier fields AMBA-CHI协议详解(六…

Go小技巧易错点100例(二十六)

本期分享: 1. string转[]byte是否会发生内存拷贝 2. Go程序获取文件的哈希值 正文: string转[]byte是否会发生内存拷贝 在Go语言中,字符串转换为字节数组([]byte)确实会发生内存拷贝。这是因为在Go中,字…

FPGA_BD Block Design学习(一)

PS端开发流程详细步骤 1.第一步:打开Vivado软件,创建或打开一个工程。 2.第二步:在Block Design中添加arm核心,并将其配置为IP核。 3.第三步:配置arm核心的外设信息,如DDR接口、时钟频率、UART接口等。 …

ubuntu20.04+qt5.12.8安装serialbus

先从官网https://download.qt.io/archive/qt/5.12/5.12.8/submodules/ 下载 qtserialbus-everywhere-src-5.12.8.tar.xz 有需要其他版本的点击返回上一级自行寻找对应版本。 也可从 https://download.csdn.net/download/zhouhui1982/90595810 下载 在终端中依次输入以下命令…