问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MQTT QoS 0, 1, 2

创作时间:
作者:
@小白创作中心

MQTT QoS 0, 1, 2

引用
CSDN
1.
https://blog.csdn.net/weixin_63514301/article/details/140110960

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,广泛应用于物联网领域。该协议定义了三种服务质量(QoS)等级,以满足不同场景下对消息可靠性的需求。本文将详细介绍MQTT的QoS机制、数据传输过程以及配置方法,帮助读者更好地理解和应用MQTT协议。

开篇

在使用MQTT协议的设备中,很多都运行在网络受限的环境下。仅依靠底层的TCP传输协议,并不能完全保证消息的可靠到达。因此,MQTT提供了QoS机制,通过设计多种消息交互机制来提供不同的服务质量,以满足用户在各种场景下对消息可靠性的要求。

MQTT定义了三个QoS等级:

  • QoS 0:最多交付一次
  • QoS 1:至少交付一次
  • QoS 2:只交付一次

其中,使用QoS 0可能会丢失消息,使用QoS 1可以保证收到消息但消息可能重复,使用QoS 2可以保证消息既不丢失也不重复。QoS等级从低到高,不仅意味着消息可靠性的提升,也意味着传输复杂程度的提升。

在一个完整的从发布者到订阅者的消息投递流程中,QoS等级是由发布者在PUBLISH报文中指定的。大部分情况下,Broker向订阅者转发消息时都会维持原始的QoS不变。不过也有一些例外的情况,根据订阅者的订阅要求,消息的QoS等级可能会在转发的时候发生降级。

例如,订阅者在订阅时要求Broker可以向其转发的消息的最大QoS等级为QoS 1,那么后续所有QoS 2消息都会降级至QoS 1转发给此订阅者,而所有QoS 0和QoS 1消息则会保持原始的QoS等级转发。

1. 精细MQS TT QoS的行为

让我们来进一步明确每种MQS TT QoS的行为,特别是消息传输过程中丢失与重复的风险和保障:

1.1 QoS 0: 最多交付一次(At Most Once)

  • 特征
  • 无消息确认:发送者发送消息后,不需要确认消息是否到达接收者。
  • 无重试:如果消息在传输过程中丢失,发送者不会再次发送该消息。
  • 风险:消息可能丢失。在网络不稳定或发生传输错误时,消息可能不会到达接收者。
  • 适用场景:适合对消息丢失不敏感的应用,例如发送传感器数据,实时监测数据,或日志记录。

1.2 QoS 1: 至少交付一次(At Least Once)

  • 特征
  • 消息确认:发送者发送消息后,需要接收者(或代理)确认消息已接收(通过PUBACK)。
  • 支持重试:如果发送者在规定时间内未收到确认,将重新发送消息,直到收到确认。
  • 风险:消息可能重复。由于重试机制,如果网络中断或接收确认消息丢失,发送者会重发,可能导致接收者收到重复的消息。
  • 适用场景:适合需要确保消息到达但能处理重复消息的应用,例如状态更新、简单的事务操作。

1.3 QoS 2: 只交付一次(Exactly Once)

  • 特征
  • 高级消息确认:通过复杂的四步握手过程(PUBREC、PUBREL、PUBCOMP),确保消息仅传输一次,避免重复。
  • 支持重试:如果在任何一步未收到确认,发送者和接收者都会重试相应步骤,直到完成整个确认过程。
  • 风险:消息不会丢失或重复。确保了消息在传输中不会丢失,并且不会重复到达接收者。
  • 适用场景:适合不能接受消息丢失或重复的应用,例如金融交易、订单处理等关键业务场景。

1.4 传输过程图示

QoS 级别
发送者行为
接收者行为
过程图示
QoS 0
发送一次
立即处理
Publisher -> Broker -> Subscriber
QoS 1
发送->等待确认
确认->处理
Publisher -> Broker <-> PUBACK->Subscriber
QoS 2
发送->等待PUBREC->PUBREL->PUBCOMP
确认PUBREC-> 等待PUBREL-> 确认PUBCOMP
Publisher -> Broker <-> PUBREC <-> PUBREL <-> PUBCOMP->Subscriber

1.5 总结

  • QoS 0:适用于对消息丢失无所谓的场景。消息可能丢失。
  • QoS 1:适用于需要保证消息到达但能接受重复消息的场景。消息可能重复。
  • QoS 2:适用于需要严格保证消息不丢失且不重复的场景。消息不会丢失也不会重复。

选择合适的QoS级别取决于应用的可靠性需求和可以容忍的传输错误类型。

2. MQTT 数据大小限制和发送原理

2.1 EMQX 数据大小限制

  • 默认最大数据大小:1 MB
  • 最大可配置数据大小:256 MB
  • 设置项:可以通过配置文件emqx.conf或EMQX Dashboard中的Max Packet Size来调整。

2.2 Mosquitto 数据大小限制

  • 默认最大数据大小:可以通过mosquitto.conf文件中的message_size_limit配置项调整,具体默认值随版本和配置不同而异,一般设置为268435455字节(约256 MB)。

2.3 发送数据的原理

MQTT发送数据的基本流程:

  1. 连接:客户端与MQTT Broker建立连接。
  2. 订阅:客户端订阅一个或多个主题。
  3. 发布:客户端向订阅的主题发布消息。
  4. 接收:订阅该主题的客户端接收消息。
  5. 确认:根据QoS(服务质量)等级,可能会有确认消息的发送。

详细步骤

  • 建立连接:客户端使用MQTT协议的CONNECT报文连接到Broker。
  • 订阅主题:客户端发送SUBSCRIBE报文,指定要订阅的主题。
  • 发布消息:使用PUBLISH报文发布消息到某个主题。
  • 消息转发:Broker接收到消息后,将其转发给所有订阅该主题的客户端。
  • 消息接收和确认:客户端接收消息,若QoS级别要求,需要发送PUBACK(QoS 1)或PUBREC/PUBREL/PUBCOMP(QoS 2)确认消息的递送。

2.4 MQTT 原理的时序图

MQTT(Message Queuing Telemetry Transport)协议是一种基于发布/订阅模式的轻量级消息传输协议,广泛应用于物联网(IoT)领域。以下是MQTT消息从客户端到Broker再到订阅者的完整时序图。

解释:

  • CONNECT: 客户端发起连接请求。
  • CONNACK: Broker响应连接请求。
  • SUBSCRIBE: 客户端订阅一个或多个主题。
  • SUBACK: Broker确认订阅。
  • PUBLISH (QoS 0): 客户端发布消息,QoS 0表示最多一次交付,不需要确认。
  • PUBLISH (QoS 1): 客户端发布消息,QoS 1表示至少一次交付,需要确认。
  • PUBLISH (QoS 2): 客户端发布消息,QoS 2表示精确一次交付,需经过四次握手确认。
  • DISCONNECT: 客户端断开连接。

2.5 Qos中的四次握手

MQTT(Message Queuing Telemetry Transport)协议中的QoS(Quality of Service)级别有三个等级:0、1、2。QoS 2是最高级别的保证消息传递的质量。

在MQTT中,QoS 2使用了四次握手来确保消息的可靠传递:

  1. 发起请求:发送端(Publisher)将消息发送给接收端(Subscriber),并请求QoS 2级别的确认。
  2. 接收确认:接收端收到消息后,向发送端发送确认收到的消息(PUBREC)。
  3. 发送确认:发送端接收到确认消息后,发送PUBREL给接收端,表示可以释放消息。
  4. 完成确认:接收端收到PUBREL后,发送最终的确认消息(PUBCOMP),表示消息已经完成传递。

这四次握手确保了消息的可靠性和顺序性,即使在网络不稳定或断开连接后,也能够确保消息不会丢失或重复传输。

2.6 相关配置示例

2.6.1 EMQX 配置 QoS 示例

在emqx.conf中:

mqtt.max_qos = 2

2.6.2 Mosquitto 配置 QoS 示例

Mosquitto配置QoS示例

max_qos 2
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号