有没有办法保持 MQTT QoS 级别直到它到达客户端?

物联网 MQTT 沟通
2021-06-17 01:30:13

MQTT 允许发送方设置服务质量(QoS) 级别,该级别为是否会收到消息(以及是否允许重复)提供某些保证。这篇来自HiveMQ 的文章强调了降级问题,其中具有较低 QoS 级别的客户端将不会收到具有发送方请求的保证的消息:

如前所述,发布和订阅客户端之间的 QoS 流是两个不同的东西,而且 QoS 可以不同。这意味着 QoS 级别可以不同于发布消息的客户端 A 和接收发布消息的客户端 B。在发送方和代理之间,QoS 由发送方定义。当代理向所有订阅者发送消息时,使用来自客户端 B 的订阅的 QoS。

MQTT 是否提供了一种方法来表明这种降级是不可接受的,并且必须使用原始发送者请求的 QoS 来传递消息传输消息之前确保发送方和接收方都具有所需的 QoS 设置是唯一的选择吗?

2个回答

使用 MQTT 时要记住的一件事是“订阅者和发布者都被视为 MQTT 客户端”。

如上所述,发布时设置的 QoS 完全与 broker(B) 相关,而不是其他客户端。因此,为了确保订阅者(S)接收发布者(P)发布的所有内容,需要使用 QoS 1。

让我们看一下情况: P - 以 QoS 0 发送,这意味着每条消息最多在 B 处出现一次(一次或零次)。在这种情况下,如果 S 以 QoS 0 订阅 B - 即使代理 (B) 收到最终将到达 S 的消息,也无法保证。QoS 1 -- S 肯定会收到 QoS 2 -- S 不会收到多条消息,而 broker 可以

如果我们对其他 QoS 也这样做。我们将了解订户的 QoS1 适用于所有级别,因为 QoS 1 是所有级别的超集。


MQTT 不提供任何指示,但我们可以通过在订阅时使用 QoS 1 来实现发送方的 QoS。

QoS 1 或 2 级别仅确保发布的消息到达代理。订阅者 QoS 1 或 2 向代理保证消息已收到。

用 1 或 2 发布并不意味着有人在听。

你的用例是什么?