最后更新:2022-06-28 12:05:12 手机定位技术交流文章
在前面的课程中,我们提到IoT系统中的一些信息非常重要,我们需要确保这些重要的信息能够准确地发送和接收,有些信息相对较少,并且传输中丢失这些信息不会影响系统运行。
MQTT服务质量(英语:MQTT quality of service,缩写为QoS)是用来通知IoT系统哪些信息是重要的,哪些信息需要准确传输,以及哪些信息即使丢失也不重要。
MQTT协议有三个服务质量水平:
QoS = 0 – 最多一次
QoS = 1 – 至少一次
QoS = 2 – 保证一次收据
以上三种不同的服务质量级别意味着不同的MQTT传输流程。对于较为重要的MQTT消息,我们通常会选择QoS>0的服务级别(即QoS 为1或2)。
此外,这里提到的发型和收据还有两个可能性:一个是当客户发布消息时,发送消息到服务端;另一个是当客户订阅主题消息时,服务器发送消息给客户;因此,可以从服务或客户发布和接收消息。
为了避免混乱,我们将使用发送器来描述发送MQTT消息的设备,并使用接收器来描述接收MQTT消息的设备。
接下来,让我们更仔细地研究这些三个服务质量水平的具体影响。
0是服务质量最低水平的QoS。当QoS为0级时,MQTT协议不保证所有信息都可以传输。也就是说,如 QoS=0,MQTT服务终止,客户不会确认和验证消息传输的成功。消息是否成功传输取决于网络环境是否稳定。
也就是说, QoS是0。 一旦发送者发送了消息,任务就完成。
在一个稳定的网络环境中,信息的传输一般不会引起问题,但如果环境不稳定,MQTT消息可能会在传输过程中丢失。
当 QoS级别为1时,接收机会检查接收机在发送消息后是否成功接收该消息。 但是,发送机如何执行此检查? 请参见以下图:
发送者向接收者发送消息后,接收者等待确认。 接收者成功接收消息后,发送给接收者的确认消息PUBACK。 如果发送者收到这个PUBACK确认消息,它就会知道消息已经成功接收
如果过了一段时间,发送者没有收到PUBACK消息,然后发送者将再次发送消息,然后再等待接收机的PUBACK确认消息。因此,当QoS=1时,在接收端收到接收端的PUBACK确认消息之前,重复同样的信息。
因此 QoS = 1, 每个消息至少被发送一次.
此外,请记住该刊物的内容。
当发送器重复发送消息时,PUBLISH消息中的dupFlag将设置为 True(如上面的黑色交叉线所示)。
QoS = 2 – 保证一次收据
MQTT服务质量的最高水平是2,即 QoS = 2.当MQTT服务质量为2,MQTT协议确保接收者只接收一个消息。
如下图所示, QoS=2比较复杂,发射器需要接收器两次确认消息,因此,第二级MQTT服务的质量是最安全的和最慢的。
让我们逐一对Q0S=2发送和接收消息的基本过程进行分析。

接收器接收了 QoS 2 并作为响应返回了 PUBREC 消息。
在接收PUBREC消息后,发送器将消息存储并返回PUBREL消息作为答复。
当接收器接收PUBREL消息时,向发送者发送PUBCOMP消息,此时, QoS2 MQTT消息传输终止。
这是 QoS=2的MQTT通信的基本过程。这里我们只是给出了基本的过程,没有 too much to explain how the MQTT protocol controls the receiver receiving only one message. 没有 too much to explain how the MQTT protocol controls the receiver receiving only one message.这是因为本课程的重点是应用MQTT。基于 QoS=2的MQTT服务端的内部控制机制,我们并不参与MQTT物体网络的实际开发.
所以你只需要记住, QoS=2保证接收器只接收一个消息。
了解了QoS的意义,我们应该如何在MQTT通信中设置QoS?下面我们解释如何在客户端发布消息和订阅消息时设置QoS。
如下图所示,当客户端发布信息时,在PUBLISH包中有一个唯一的消息,称为qos。 此信息用于设置客户端发布MQTT消息的QoS级别。

类似地,当客户端订阅MQTT主题时, SUBSCRIBE包还包含设置订阅主题 QoS级别的信息。 通过这个主题,客户端设置订阅主题 QoS级别。
换句话说,无论是发布(PUBLISH)还是订阅(SUBSCRIBE)都可以用来设置服务质量水平,使用在包中的qos消息。
另外,要想实现QoS>0的MQTT通讯,当连接到服务端时,客户端必须设置 cleanSession为false。如果 没有 取得 这 一 步,那么客户端是无法实现QoS>0的MQTT通讯。这一点非常关键,请您务必要留意。
讲到这里,我不知道有没有朋友会感兴趣。如果客户在发布和订阅信息时使用不同级别的QoS,发生了什么事?如下图所示,如果客户端A使用 QoS = 2 向主题1发布消息,然而,客户端B订阅主题1使用 QoS = 1.那么,服务提供者应如何应对这种情况?
在这种情况下,服务端将使用较低的水平来提供服务。 如下图所示,在A发送到主题1的讯息时使用QoS为2,而服务提供者发送到B的讯息时使用QoS为1。
让我们看看另一个情况。
如下图所示,如果客户端A使用QoS以0发布主题1消息,而客户端B使用QoS以1订阅主题1消息。
在这种情况下,当客户端B订阅主题1消息时 QoS为1,当客户端A发送主题1消息时 QoS为0,因此服务端发送消息到B时 QoS为0。
我们可以从上述两个例子中看出:对于发布和订阅消息的客户,服务提供者将积极使用较低级别的QoS来实现消息传输。
如果我们想在MQTT通信中达到服务水平为1(QoS=1),我们必须为消息发布端级接收器设置相应的设置。
当接收器连接到服务端时设置“cleanSession”为“false”
接收者主题订阅时 QoS=1
发布时发布消息时 QoS = 1
如果我们想在MQTT通信中达到服务质量水平2(QoS=2),我们需要分别为消息的发布和接收端设置相应的设置。
当接收器连接到服务端时设置“cleanSession”为“false”
接收者主题订阅时 QoS=2
发布时发布消息时 QoS = 2
若想实现QoS>0,订阅端连接服务端时cleanSession需要设置为false,订阅端订阅主题时QoS>0,发布端发布消息时的QoS>0。
服务提供者将在发布和订阅消息中选择较低的QoS来实现消息传输,也被称为“服务降级”。
QoS = 0,网络资源使用率最低,但接收器可能无法接收消息,因此适合传输较少重要信息。
QoS = 1, MQTT 确保接收机接收消息,但可能接收机会重复接收相同的消息。
QoS = 2, MQTT 确保接收机只接收一个消息。 然而, QoS 是两个小时消息传输的最慢,其他消息传输需要多次确认,因此使用网络资源最多。
尽管QOS1和QOS2都确保客户端接收消息,QOS1使用比QOS2少的资源,因此,建议使用QOS1来实现在更有价值的网络资源环境中传输重要的信息。
本文由 在线网速测试 整理编辑,转载请注明出处。