MQTT协议 详解

文章目录

  • 一、啥是MQTT?
    • 1. MQTT协议特点
    • 2. 发布和订阅
    • 3. QoS(Quality of Service levels)
      • QoS 0 —— 最多1次
      • QoS 1 —— 最少1次
      • QoS 2 —— 只有1次
  • 二、MQTT 数据包结构
    • 1. MQTT固定头
    • 2. MQTT可变头 / Variable header
    • 3. Payload消息体
  • 三、MQTT 消息报文


一、啥是MQTT?

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。

MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。

作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

1. MQTT协议特点

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。

MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。

其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

MQTT协议除标准版外,还有一个简化版MQTT-SN,该协议主要针对嵌入式设备,这些设备一般工作于TCP/IP网络,如:ZigBee。

MQTT 与 HTTP 一样,MQTT 运行在传输控制协议/互联网协议 (TCP/IP) 堆栈之上。
在这里插入图片描述
结构示意图:
在这里插入图片描述

2. 发布和订阅

MQTT使用的发布/订阅消息模式,它提供了一对多的消息分发机制,从而实现与应用程序的解耦。

这是一种消息传递模式,消息不是直接从发送器发送到接收器(即点对点),而是由MQTT server(或称为 MQTT Broker)分发的。
在这里插入图片描述
MQTT 服务器是发布-订阅架构的核心。

它可以非常简单地在Raspberry Pi或NAS等单板计算机上实现,当然也可以在大型机或 Internet 服务器上实现。

服务器分发消息,因此必须是发布者,但绝不是订阅者!

客户端可以发布消息(发送方)、订阅消息(接收方)或两者兼而有之。

客户端(也称为节点)是一种智能设备,如微控制器或具有 TCP/IP 堆栈和实现 MQTT 协议的软件的计算机。

消息在允许过滤的主题下发布。主题是分层划分的 UTF-8 字符串。不同的主题级别用斜杠/作为分隔符号。

我们来看看下面的设置。

  • 光伏发电站是发布者(Publisher)。
  • 主要主题(Topic)级别是"PV",这个工厂发布两个子级别"sunshine"和"data";
  • "PV/sunshine"是一个布尔值(true/fault,也可以是 1/0),充电站需要它来知道是否应该装载电动汽车(仅在阳光普照时 😃)。
  • 充电站(EVSE)是订阅者,订阅"PV/sunshine"从服务器获取信息。
  • “PV/data” 另一方面,以 kW 为单位传输工厂产生的瞬时功率,并且该主题可以例如通过计算机或平板电脑订阅,以生成一天内传输功率的图表。

这就是一个简单的MQTT的应用场景,具体如下图所示;
在这里插入图片描述

3. QoS(Quality of Service levels)

服务质量是 MQTT 的一个重要特性。当我们使用 TCP/IP 时,连接已经在一定程度上受到保护。但是在无线网络中,中断和干扰很频繁,MQTT 在这里帮助避免信息丢失及其服务质量水平。这些级别在发布时使用。如果客户端发布到 MQTT 服务器,则客户端将是发送者,MQTT 服务器将是接收者。当MQTT服务器向客户端发布消息时,服务器是发送者,客户端是接收者。

QoS 0 —— 最多1次

最小的等级就是 0。并且它保证一次信息尽力交付。一个消息不会被接收端应答,也不会被发送者存储并再发送。这个也被叫做 “即发即弃” 。并且在TCP协议下也是会有相同的担保。
在这里插入图片描述

QoS 1 —— 最少1次

当使用QoS 等级1 时, 它保证信息将会被至少发送一次给接受者。 但是消息也可能被发送两次甚至更多 。
在这里插入图片描述

QoS 2 —— 只有1次

最高的QoS就是2,它会确保每个消息都只被接收到的一次,他是最安全也是最慢的服务等级。

在这里插入图片描述

二、MQTT 数据包结构

  • 固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识;
  • 可变头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容;
  • 消息体(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容;

整体MQTT的消息格式如下图所示;
在这里插入图片描述

1. MQTT固定头

固定头存在于所有MQTT数据包中,其结构如下:
在这里插入图片描述
固定头存在于所有MQTT数据包中, 固定头包含两部分内容,首字节(字节1)和剩余消息报文长度(从第二个字 节开始,长度为1-4字节),剩余长度是当前包中剩余内容长度的字节数,包括变量头和有效负载中的数据)。剩余长度不包含用来编码剩余长度的字节。

剩余长度使用了一种可变长度的结构来编码,这种结构使用单一字节表示0 - 127 的值。大于 127 的值如下处 理。每个字节的低7 位用来编码数据,最高位用来表示是否还有后续字节。因此每个字节可以编码 128 个值,再加 上一个标识位。剩余长度最多可以用四个字节来表示。

2. MQTT可变头 / Variable header

可变标头组件作为可选字段包含在某些 MQTT 控制数据包类型中。在固定报头和有效载荷之间是这个字段。可变标头的内容由数据包类型决定。在可变报头中可以找到许多数据包类型中常见的数据包标识符字段。数据包标识符字段是一个 2 字节整数,包含在许多 MQTT 控制数据包类型的可变标头组件中。

数据包标识符字段如下:
PUBLISH、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK

数据包标识符字段的特征:

  • 如果 QoS(服务质量)的值设置为零,则 PUBLISH 数据包不应包含数据包标识符字段。这意味着如果 QoS 值大于零,则数据包标识符字段将仅出现在 PUBLISH 数据包中。

  • 客户端在发送新的 SUBSCRIBE、UNSUBSCRIBE 或 PUBLISH MQTT 控制数据包时应分配一个当前未使用的非零数据包标识符。

  • 服务器在发送新的 PUBLISH MQTT 控制数据包时应分配一个当前未使用的非零数据包标识符。

  • PUBACK、PUBREC、PUBUREL、PUBREC是PUBLISH命令确认包,包标识符与PUBLISH包相同

  • SUBACK和UNSUBACK分别是SUBSCRIBE和UNSUBSCRIBE确认包。

  • SUBACK 和 UNSUBACK 数据包与 SUBSCRIBE 和 UNSUBSCRIBE 数据包共享相同的数据包标识符处理完相应的确认包后,包标识符可以重复使用。

下面是一个定义:
A。如果 QoS 设置为 1,则 PUBLISH 的确认包将是 PUBACK。如果处理了 PUBACK,则可以重用 PUBACK 数据包标识符。

B.如果 QoS 值为 2,则 PUBLISH 确认包将是 PUBCOMP 或 PUBREC。

3. Payload消息体

Payload消息体是MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体:

  • CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码
  • SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。
  • SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
  • UNSUBSCRIBE,消息体内容是要订阅的主题。

三、MQTT 消息报文

在这里插入图片描述

以上介绍了MQTT协议的消息格式,MQTT消息格式包含Fixed Header, Variable Header和Payload。因为MQTT消息格式非常精简,所以可以高效的传输数据。

Fixed Header中包含首字节,高4位用来表示报文类型,低4位用于类型控制。目前只有PUBLISH使用了类型控制字段。其它控制字段被保留并且必须与协议定义保持一致。

Fixed Header同时包含Remaining Length,这是剩余消息长度,最大长度为4字节,理论上一条MQTT最大可以传输256MB数据。Remaining Length=Variable Header+Payload长度。

Variable Header是可变头部,有些报文类型中需要包含可变头部,可变头部根据报文类型不同而不同。比如Packet Identifier在发布,订阅/取消订阅等报文中都使用到。

Payload是消息内容,也只在某些报文类型中出现,其内容和格式也根据报文类型不同而不同。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ceph入门到精通- storcli安装

storcli 是LSI公司官方提供的Raid卡管理工具,storcli已经基本代替了megacli,是一款比较简单易用的小工具。将命令写成一个个的小脚本,会将使用变得更方便。 安装简单,Windows系统下解压出来以后可以直接运行。 Linux系统默认位置…

Android程序员向音视频进阶,有前景吗

随着移动互联网的普及和发展,Android开发成为了很多人的就业选择,希望在这个行业能获得自己的一席之地。然而,随着时间的推移,越来越多的人进入到了Android开发行业,就导致目前Android开发的工作越来越难找&#xff0c…

7.Shuffle详解

1.分区规则 ps."&"指的是按位与运算,可以强制转换为正数 ps."%",假设reduceTask的个数为3,则余数为0,1,2正好指代了三个分区 以上代码的含义就是对key的hash值强制取正之后,对reduce的个数取…

大数据技术之Kafka集成

一、集成Flume 1.1 Flume生产者 (1)启动Kafka集群 zkServer.sh startnohup kafka-server-start.sh /opt/soft/kafka212/config/server.properties & (2)启动Kafka消费者 kafka-console-consumer.sh --bootstrap-server 192…

动态内存管理

文章目录 1.动态内存函数1.1free1.2malloc1.3calloc1.4realloc 2.动态内存错误2.1解引用空指针--非法访问内存2.2越界访问动态空间2.3free释放非动态空间2.4free释放部分动态空间2.5free多次释放动态空间2.6未释放动态内存 3.动态内存题目3.1形参不影响实参3.2地址返回&#xf…

APP渗透—查脱壳、反编译、重打包签名

APP渗透—查脱壳、反编译、重打包签名 1. 前言1.1. 其它 2. 安装工具2.1. 下载jadx工具2.1.1. 下载链接2.1.2. 执行文件 2.2. 下载apktool工具2.2.1. 下载链接2.2.2. 测试 2.3. 下载dex2jar工具2.3.1. 下载链接 3. 查壳脱壳3.1. 查壳3.1.1. 探探查壳3.1.2. 棋牌查壳 3.2. 脱壳3…

FVM初启,Filecoin生态爆发着力点在哪?

Filecoin 小高潮 2023年初,Filecoin发文分享了今年的三项重大变更,分别是FVM、数据计算和检索市场的更新,这些更新消息在发布后迅速吸引了市场的广泛关注。 特别是在3月14日,Filecoin正式推出了FVM,这一变革使得Filec…

多维时序 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多变量时间序列预测

多维时序 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多变量时间序列预测 目录 多维时序 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元多变量时间序列预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于贝叶斯(bayes)优化卷积神经网络-门控循环…

python 基础语法

标准库 语言参考手册 abstract base class – 抽象基类 abc annotation – 标注 类型注解 argument – 函数参数 关键字参数 xxx / **{xxx: , xx: }位置参数 3, 5 / *(3, 5) 基础语法 使用严格缩进 代替 大括号{} 框定代码块 使用反斜杠 \ 将一行的语句分为多行显示 三引…

ENVI 国产高分2号(GF-2)卫星数据辐射定标 大气校正 影像融合

1.数据 高分2号卫星数据,包含: MSS-1\2多光谱数据,4m分辨率; Pan-1\2全色波段数据,0.8m分辨率。 2.处理软件 ENVI5.3 国产插件下载地址:ENVI App Store (geoscene.cn) 首先下载插件文件; …

【STL十四】函数对象(function object)_仿函数(functor)——lambda表达式

【STL十四】函数对象(function object)_仿函数(functor)——lambda表达式 一、函数对象(function object)二、函数对象优点三、分类四、头文件五、用户定义函数对象demo六、std::内建函数对象1、 算术运算函…

【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的Redis延时队列的功能组件

手把手教你如何开发一个属于自己的延时队列的功能组件 前提介绍解决痛点延时队列组件的架构延时队列组件的初始化流程延时队列组件的整体核心类架构延时队列组件的整体核心类功能 延时队列的开发组件延迟队列的机制配置初始化类源码 - DelayedQueueConfigurationRedission客户端…

网络基础,InetAddress,Socket,TCP,UDP

概念:两台设备之间通过网络实现数据运输网络通信:将数据通过网络从一台设备传输到另一台设备java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信网络:两台或多台设备通过一定物理设备连接起来构成了网络根…

文件和用户管理

Linux基础 提示:个人学习总结,仅供参考。 一、Linux系统部署 二、服务器初始化 三、文件和用户管理 四、用户的权限 提示:文档陆续更新整理 文件和用户管理 Linux基础一、Linux目录结构二、文件管理1.文件类型2.文件管理命令 三、用户管理…

为什么医疗保健需要MFT来帮助保护EHR文件传输

毫无疑问,医疗保健行业需要EHR技术来处理患者,设施,提供者等之间的敏感患者信息。但是,如果没有安全的MFT解决方案,您将无法安全地传输患者文件,从而使您的运营面临遭受数据泄露,尴尬&#xff0…

如何平衡倾斜摄影的三维模型轻量化数据文件大小和质量效果?

如何平衡倾斜摄影的三维模型轻量化数据文件大小和质量效果? 倾斜摄影超大场景的三维模型数据文件大小的具体范围取决于多种因素,如原始数据的复杂度、轻量化处理的方式和压缩算法等。一般而言,经过轻量化处理后,数据文件大小可以减…

c/c++:栈帧,传值,传址,实参传值给形参,传地址指针给形参

c/c:栈帧,传值,传址,实参传值给形参,传地址指针给形参 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学&…

WuxioLin 反锯齿算法(反走样算法,Xiaolin Wu Anti-aliasing algorithm) C# 代码实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、锯齿和反锯齿二、Xiaolin Wu 算法代码1.C#完整代码如下2.举例和测试 总结 前言 笔者前几日自己写了个佳明手表表盘的的一个入门级App,模拟指针…

甘肃vr全景数字化展厅提高企业品牌认知度和销售效果

相比传统式展厅给观众们呈现的是静态的视觉体会,缺乏实时交互水平。而720VR全景虚拟展厅能够提供高度真实的展览体验,融合视、听、触等各种感官享受,带来颠覆的沉浸式体验。 即便社恐的你也能在虚拟现实的世界游刃有余,想看哪里点…

AD9208子卡设计资料: 2 路 2.6GSPS/3GSPS AD 采集、2 路 12.6G DA 回放、高性能时钟发生器HMC7044 -FMC 子卡模块

板卡概述 FMC123 是一款基于 FMC 标准规范,实现 2 路 14-bit、3GSPSADC 采集功能、2 路 16-bit 12.6GSPS 回放子卡模块。该模块遵循 VITA57.1 标准,可直接与 FPGA 载卡配合使用,板卡 ADC 器件采用 ADI 公司的 AD9208 芯片,&…