MQTT QoS

原文

MQTT V3.1 Protocol Specification

译文(摘取一部分)

MQTT根据QoS定义的等级来传输消息。等级描述如下:

level 0:最多一次的传输

消息是基于TCP/IP网络传输的。没有回应,在协议中也没有定义重传的语义。消息可能到达服务器1次,也可能根本不会到达。

level 1:至少一次的传输

服务器接收到消息会被确认,通过传输一个PUBACK信息。如果有一个可以辨认的传输失败,无论是通讯连接还是发送设备,还是过了一段时间确认信息没有收到,发送方都会将消息头的DUP位置1,然后再次发送消息。消息最少一次到达服务器。SUBSCRIBE和UNSUBSCRIBE都使用level 1 的QoS。

如果客户端没有接收到PUBACK信息(无论是应用定义的超时,还是检测到失败然后通讯session重启),客户端都会再次发送PUBLISH信息,并且将DUP位置1。

当它从客户端接收到重复的数据,服务器重新发送消息给订阅者,并且发送另一个PUBACK消息。

level 2: 只有一次的传输

在QoS level 1上附加的协议流保证了重复的消息不会传送到接收的应用。这是最高级别的传输,当重复的消息不被允许的情况下使用。这样增加了网络流量,但是它通常是可以接受的,因为消息内容很重要。

QoS level 2在消息头有Message ID。

### MQTT QoS Levels Explained MQTT (Message Queuing Telemetry Transport) 协议提供了三种服务质量级别(Quality of Service, QoS),用于定义消息传递的可靠性。这些级别的设计旨在满足不同场景下的需求,平衡可靠性和资源消耗。 #### QoS Level 0 QoS 0 是最低的服务质量等级,表示“最多一次”交付模式。在这种模式下,消息不会被确认接收,也不会存储在代理中。一旦消息从发布者发送出去,无论订阅者是否成功接收到消息,都不会有进一步的操作[^1]。这种机制适用于对实时性要求较高但对丢失容忍度较高的应用场景,例如天气更新或股票价格变化。 #### QoS Level 1 QoS 1 提供了“至少一次”的交付保障。这意味着消息会被确保送达目标节点,但如果网络状况不佳或其他原因导致重复传输,则可能会多次接收到相同的消息。为了实现这一点,在每次数据包交换过程中都会附加一个唯一的标识符,并且只有当双方都认可之后才会认为此次通信已完成[^1]。因此,相较于 QoS 0 来说更加安全但也稍微复杂一点。 #### QoS Level 2 最高级别的服务品质称为 QoS 2 或者说是“确切仅一次”。这是最可靠的选项之一,因为它不仅保证每条信息都能到达目的地而且还防止任何可能存在的冗余副本出现。具体做法涉及到额外的状态跟踪以及四步握手过程来完成整个事务处理链条上的每一个环节直到最终确认无误为止。尽管如此高的精确程度带来了更好的用户体验,但它同时也增加了系统的负载量并降低了整体性能表现速度。 以下是 Python 中设置不同 QoS 的简单示例: ```python import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print(f"Connected with result code {rc}") client.subscribe("test/topic", qos=1) client = mqtt.Client() client.on_connect = on_connect client.connect("broker.hivemq.com", 1883, 60) client.loop_forever() ``` 在这个例子当中,默认采用的是 QoS level 1 进行订阅操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值