有没有办法在到达客户端之前保留MQTT QoS级别?


9

MQTT允许发送方设置服务质量(QoS)级别,该级别为是否将接收消息(以及是否允许重复)提供了一定的保证。HiveMQ的这篇文章着重介绍了降级的问题,在该问题中,具有较低QoS级别的客户端将无法保证发送方要求的情况下收到消息:

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

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

Answers:


8

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

如所述,在发布时设置的QoS完全与代理(B)有关,而不与其他客户端有关。因此,要确保订户(S)收到发布者(P)正在发布的所有内容,就需要使用QoS 1。

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

如果我们对其他QoS做同样的事情。我们将了解订户的QoS1在所有级别上都能很好地工作,因为QoS 1是所有级别的超集。


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


4

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

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

您的用例是什么?


3
不要在答案中提出问题。如果不清楚,请先发表评论。
Bence Kaulics,2013年

我对任何情况都感到好奇,在这种情况下,可能会有传感器将数据发送到消息代理,然后将其转发到计算机或某些其他处理器,而保证QoS保证至关重要
Aurora0001
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.