一、引言
本章内容主要是介绍MQTT协议的Qos等级以及利用python程序测试基于MQTT协议客户端通信。MQTT协议是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用而设计,可为联网设备提供实时可靠的消息服务。
本章内容不对MQTT做过多的介绍,详细的介绍参见文章末尾的参考资料,有关于EMQX的MQTT协议入门、进阶学习资料,非常详细丰富。本章节主要介绍不同qos等级的差异,网络上的资料错综复杂,而且还讲不清楚其中的内容,本章内容做了一个简单的归纳整理。并解决了qos=1时订阅方无法收到消息的问题。
二、MQTT协议之Qos等级
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它支持三种不同的 QoS(Quality of Service,服务质量)级别,用于确保消息的可靠性和顺序性:
-
QoS 0(最多一次):这是最简单的服务质量级别。当使用 QoS 0 发送消息时,消息会尽力投递,但不会进行确认或重传。发送者只会发送一次消息,无论它是否到达目标设备。对于 QoS 0,可能会出现消息丢失、乱序或重复接收的情况。这种级别适用于不要求消息可靠性的应用场景,例如传感器数据定期上报等。大多数场景使用qos=0是足够的。 当我们使用 QoS 0 传递消息时,消息的可靠性完全依赖于底层的 TCP 协议。QoS 0 消息发送丢失最主要的场景是:出现TCP连接关闭、重置,可能丢失当前处于网络链路或操作系统底层缓冲区中的消息。
-
QoS 1(至少一次):此级别下,消息会确保至少被传输一次。发送者会等待接收者发送确认消息(PUBACK)作为响应。如果发送者没有收到确认,它将重新发送消息,直到接收到确认为止。这样可以确保消息的可靠传输,但可能会导致重复的消息传递。QoS 1 在需要可靠性但允许少量重复的应用场景中常被使用,如传感器数据采集。
-
QoS 2(恰好一次):这是最高的服务质量级别,提供了恰好一次的传输保证。消息会进行两阶段的握手。发送者首先发送消息,接收者对其进行确认(PUBREC),然后发送者再次确认(PUBREL),最后接收者进行最终的确认(PUBCOMP)。这种级别可以确保消息只被传输一次,也不会出现重复接收的情况。QoS 2 提供了最高的可靠性,但也带来了更多的通信开销和延迟。它适用于对消息顺序和可靠性要求很高的应用场景,如金融交易。
在选择 QoS 级别时,需要根据应用的