【MQTT基础篇(十)】QoS 服务质量等级
文章目录
- QoS 服务质量等级
- 1 什么是服务质量?
- 1.1 QoS = 0 最多发一次
- 1.2 QoS = 1 最少发一次
- 1.3 QoS = 2 保证收一次
- 2 设置QoS
- 2.1 发布消息
- 2.2 订阅消息
- 2.3 接收端连接服务端
- 3 服务质量降级
- 4 注意事项
- 4.1 QoS=1通讯时的注意事项
- 4.2 QoS=2通讯时的注意事项
- 5 小结
QoS 服务质量等级
1 什么是服务质量?
一个物联网系统中有些信息非常重要,我们需要确保这类重要信息可以准确无误的发送和接收,而有些信息则相对不那么重要,这类信息如果在传输中丢失不会影响系统的运行。
MQTT服务质量
(Quality of Service 缩写 QoS)正是用于告知物联网系统,哪些信息是重要信息需要准确无误的传输,而哪些信息不那么重要,即使丢失也没有问题。
MQTT协议有三种服务质量级别:
QoS = 0 最多发一次
QoS = 1 最少发一次
QoS = 2 保证收一次
以上三种不同的服务质量级别意味着不同的MQTT传输流程。对于较为重要的MQTT消息,我们通常会选择QoS>0的服务级别(即QoS 为1或2)。
另外这里提到的“发
”与“收
”有两种可能。一种是客户端发布消息时,将消息发送给服务端。一种是客户端订阅了某一主题消息后,服务端将消息发送给客户端。因此发布消息和接收消息的可能是服务端也可能是客户端。
为了避免为您造成混淆,后面的描述中将使用“发送端”来描述发送MQTT消息的设备,而使用“接收端”来描述接收MQTT消息的设备。
1.1 QoS = 0 最多发一次
0
是服务质量QoS
的最低级别
。当QoS为0级时,MQTT协议并不保证所有信息都能得以传输。也就是说,QoS=0的情况下,MQTT服务端和客户端不会对消息传输是否成功进行确认和检查。消息能否成功传输全看网络环境是否稳定。
也就是说,在QoS为0时。发送端一旦发送完消息后,就完成任务了。发送端不会检查发出的消息能否被正确接收到。
在网络环境稳定的情况下,信息传输一般是不会出现问题的。但是在环境不稳定的情况下,可能会在传输过程中出现MQTT消息丢失的情况。
1.2 QoS = 1 最少发一次
当
QoS级别
为1
时,发送端在消息发送完成后,会检查接收端是否已经成功接收到了消息。但是发送端是如何实现这一检查的呢?请看下图:
发送端将消息发送给接收端后,会等待接收端的确认。接收端成功接收消息后,会发送一条确认报文
PUBACK
给发送端。如果发送端收到了这条PUBACK
确认报文,那么它就知道消息已经成功接收。
假如过了一段时间后,发送端没有收到PUBACK
报文,那么发送端会再次发送消息
,然后再次等待接收端的PUBACK确认报文
。因此,当QoS=1
时,发送端在没有收到接收端的PUBACK确认报文
以前,会重复发送同一条消息
。
所以QoS = 1时,每一条消息都至少传输一次。
另外请您回忆一下PUBLISH报文的内容。
当发送端重复发送一条消息时,PUBLISH报文中的dupFlag会被设置为True(如上图黑色横线所标注的部分)。这是为了告诉接收端,此消息为重复发送的消息。
1.3 QoS = 2 保证收一次
MQTT服务质量
最高级
是2级
,即QoS = 2。当MQTT服务质量为2级时,MQTT协议可以确保接收端只接收一次消息。
如下图所示,QoS=2
的收发相对更加复杂。发送端需要接收端进行两次消息确认。因此,2级MQTT服务质量是最安全的服务级别,也是最慢的服务级别。
下面我们来分步看一下Q0S=2时的消息发送和接收基本流程。
1. 发送端发送QoS=2的PUBLISH报文给接收端
2. 接收端回复PUBREC确认报文
接收端收到QoS为2的消息后,会返回PUBREC报文作为应答。
3. 发送端会应答PUBREL报文给接收端
发送端收到PUBREC报文后,会把此报文进行存储,并且返回PUBREL报文作为应答。
4. 接收端应答PUBCOMP报文给发送端
当接收端收到PUBREL报文后,会应答发送端一条PUBCOMP报文。至此,一次QoS2的MQTT消息传输就结束了。
以上是
QoS=2
时的MQTT通讯基本过程
。这里我们只给您列出了基本流程,而没有过多的讲解MQTT协议是如何控制接收端只接收一次消息。这么做是因为本教程的重点是MQTT应用。关于QoS=2的MQTT服务端内部控制机制,我们在实际开发MQTT物联网的过程中是不会涉及到的。
所以您只需要牢记一点,那就是QoS=2可以保证接收端只收一次消息。
2 设置QoS
了解了QoS的含义后,我们该如何在MQTT通讯中设置QoS呢?下面我们来分别讲解客户端在发布消息和订阅消息时如何设置QoS。
2.1 发布消息
如下图所示,客户端发布信息时,
PUBLISH
数据包中专有一个信息为qos
。该信息正是用于设置客户端发布MQTT消息的QoS等级
。
2.2 订阅消息
同样的,在客户端订阅MQTT主题时,
SUBSCRIBE
数据包中也同样有一个信息用于设置订阅主题
的QoS级别
。客户端正是通过该主题来设置订阅主题的QoS级别的。
换句话说,无论是发布(PUBLISH
)还是订阅(SUBSCRIBE
),都可以使用数据包中的qos
消息设置服务质量级别。
2.3 接收端连接服务端
另外,要想实现
QoS>0
的MQTT通讯,客户端在连接服务端时必须要将cleanSession
设置为false
。如果这一步没有实现,那么客户端是无法实现QoS>0的MQTT通讯。这一点非常关键,请您务必要留意。
3 服务质量降级
讲到这里,不知道有没有朋友会感到好奇。假如客户端在
发布
和订阅
信息时使用不同级别
的QoS
,将会发生什么情况呢。如下图所示,假如客户端A发布到主题1的消息是采用QoS = 2,然而客户端B订阅主题1采用QoS = 1。那么服务端该如何来应对这一情况呢?
在这种情况下,服务端会使用较低级别
来提供服务。如下图所示,虽然A发送到主题1的消息采用QoS为2,但是服务端发送主题1的消息给B时,采用的QoS为1。这是因为B在订阅主题1时采用的QoS为1。
下面我们再来看一种情况。
如下图所示,假如客户端A发布主题1消息时使用QoS为0,而客户端B订阅主题1消息时使用QoS为1。
在这种情况下,虽然客户端B订阅主题1消息时QoS为1,但是由于客户端A发送主题1消息时QoS为0,所以服务端发送消息给B的QoS为0。
通过以上两个示例我们可以看到。对于发布和订阅消息的客户端,服务端会主动采用较低级别的QoS来实现消息传输。
4 注意事项
4.1 QoS=1通讯时的注意事项
如想在MQTT通讯中实现服务质量等级为1级(
QoS=1
),我们要分别对消息的发布端课接收端进行相应的设置。以下列表中的内容是具体需要采取的措施。
- 接收端连接服务端时cleanSession设置为false
- 接收端订阅主题时QoS=1
- 发布端发布消息时QoS=1
4.2 QoS=2通讯时的注意事项
如想在MQTT通讯中实现服务质量等级为2级(
QoS=2
),我们要分别对消息的发布端和接收端进行相应的设置。以下列表中的内容是具体需要采取的措施。
- 接收端连接服务端时cleanSession设置为false
- 接收端订阅主题时QoS=2
- 发布端发布消息时QoS=2
5 小结
- 若想实现QoS>0,订阅端连接服务端时cleanSession需要设置为false,订阅端订阅主题时QoS>0,发布端发布消息时的QoS>0。
- 服务端会选择发布消息和订阅消息中较低的QoS来实现消息传输,这也被称作“服务降级”。
- QoS = 0, 占用的网络资源最低,但是接收端可能会出现无法接收消息的情况,所以适用于传输重要性较低的信息。
- QoS = 1, MQTT会确保接收端能够接收到消息,但是有可能出现接收端反复接收同一消息的情况。
- QoS = 2, MQTT会确保接收端只接收到一次消息。但是QoS为2时消息传输最慢,另外消息传输需要多次确认,因此所占用的网络资源也是最多的。此类服务等级适用于重要消息传输。
- 由于QoS1和QoS2都能确保客户端接收到消息,但是QoS1所占用的资源较QoS2占用资源更小。因此建议使用QoS1来实现网络资源较为珍贵的环境下传输重要信息。
内容来自 -----> 太极创客
详情可见太极创客官网,内有Arduino、ESP32等详细教程
【MQTT基础篇(十)】QoS 服务质量等级相关推荐
- MQTT——QoS服务质量等级
1.QoS是MQTT协议中的一个重要标志位.在固定报头第一个字节,低4位中定义: 2.QoS服务质量等级分为三级:QoS0,QoS1,QoS2; 2.1.QoS0:最多发送一次,到达不到达发布者不管, ...
- 【MQTT基础篇(五)】发布、订阅和取消订阅
文章目录 发布.订阅和取消订阅 1 PUBLISH – 发布消息 1.1 topicName – 主题名 1.2 QoS – 服务质量等级 1.3 packetId – 报文标识符 1.4 retai ...
- pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas
前言 环境:k8s-v1.22.17 docker-20.10.9 centos-7.9 目录 前言 什么是可计算资源 CPU.Memory计量单位 pod资源请求.限额方式 pod定义request ...
- QoS 服务质量等级
什么是MQTT服务质量? 在之前的课程里我们提到过,一个物联网系统中有些信息非常重要,我们需要确保这类重要信息可以准确无误的发送和接收,而有些信息则相对不那么重要,这类信息如果在传输中丢失不会影响系统 ...
- 【MQTT基础篇(二)】MQTT基础
文章目录 MQTT基础 1 MQTT服务端 2 MQTT客户端 3 MQTT主题 4 MQTT 发布/订阅 特性 MQTT基础 在MQTT协议通讯中,有两个最为重要的角色.它们分别是服务端和客户端. ...
- 学习太极创客 — MQTT 第二章(一)QoS 服务质量等级
视频链接:https://www.bilibili.com/video/BV1FK4y1L7TQ/?spm_id_from=333.788.recommend_more_video.-1&vd ...
- 【MQTT基础篇(十四)】MQTT心跳机制
文章目录 MQTT心跳机制 MQTT心跳机制 在医院里,医生利用心跳来判断患者是否还有生命体征.对于MQTT服务器来说,它要判断一台MQTT客户端是否依然保持连接可以检查这台客户端是不是经常发送消息给 ...
- 【MQTT基础篇(一)】MQTT介绍
文章目录 MQTT介绍 1 MQTT历史 2 MQTT版本 MQTT介绍 MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议.它的设计思想是轻巧.开放.简单.规范,易于实现.这些特点使得它对 ...
- 【MQTT基础篇(七)】MQTT主题
文章目录 MQTT主题 1 主题基本形式 2 主题分级 3 主题通配符 3.1 单级通配符: + 3.2 多级通配符 \# 4 主题应用注意事项 4.1 以$开始的主题 4.2 不要用 "/ ...
最新文章
- 【原创】用MySQL 生成随机密码-增加大写处理
- python 只能将最后一行写入excel_Python 应用 办公自动化之 Excel(上)
- WEB前端必须掌握的一些算法题
- ionic4监听返回事件 AppMinimize navController
- 【DP】[NOI2013]书法家
- 003.DNS主从正反解析部署
- IT历史:IT史重大失败教训
- 微信iOS版上线新功能:输入文字又变得容易一点了
- 数据结构与算法之三直接插入排序
- Python3 有序字典—OrderedDict()
- python join 和 split的常用使用方法
- 数据分析 超市条码_数据分析入门:商品分析是什么?该怎么做?
- redis setex php,redis中setex命令和set命令有什么区别
- 全国高中数学联赛 2020 年二试第四题
- android 5.1 flash,Flash Player for Android 4.0 and 5.1 以上版本(提供下載)
- 高精度数乘法进位c语言,C语言中的高精度乘法
- EAS BOS锚定设置
- GitHub push的时候报:Unable to access ‘https://github.com/xxxx/xxxx.git/‘:OpenSSL SSL_read:Connection was
- Java 内部类详解
- 【C语言】汉诺塔问题
热门文章
- 中国人民大学计算机考研资料汇总
- 1379 八数码难题
- matlab fopen fwrite,fopen fwrite
- AttributeError: module ‘seaborn‘ has no attribute ‘histplot‘
- 对宏定义的作用域的一点思考
- tensorflow如何使用gpu
- FFMpeg php使用说明
- 机器学习笔记(15)— 基本概念batch、batchsize、epoch、iteration
- 2020年中国DevOps应用发展研究——艾瑞咨询报告总结
- 最小表示法(转自CSDN xiaoc's home)