使用 mqtt QoS 2 发布消息时,会丢失吗?

ang*_*lex 4 mqtt ios-mqtt-client-framework

我正在尝试使用MQTT-Client Framework实现一个 MQTT 客户。我想确保我尝试发布的每条消息都会到达代理。我无法弄清楚 QOS2 的确切含义:它指出一条消息将只发送一次。是不是意味着当连接丢失时,它会在重新连接后自动尝试重传消息?或者这应该由应用程序处理?

同样在这个库中,重新连接是默认自动完成的吗?或者需要检查connectionLost是否发生,然后尝试重新连接?

Ben*_*n T 5

MQTT QoS 级别是对将消息传送到接收者的保证,而不是发送者发送/重新发送消息的频率。请参阅MQTT 规范中QoS 部分MQTT QoS 概述

使用 MQTT QoS2 发布的消息意味着它只会被传递一次。可以多次发送消息以实现这种恰好一次传递的保证。

MQTT 的至少一次交付方面是使用 PUBLISH/PUBREC 握手实现的。如果发布者没有收到确认其发布消息的 PUBREC 数据包,则发布者将继续重新发送设置了 DUP 标志的 PUBLISH 消息。

使用附加的 PUBREL/PUBCOMP 握手实现 QoS2 的恰好一次交付方面。接收者可以选择在两个不同的点转发消息并丢弃重复的消息。

是不是意味着当连接丢失时,它会在重新连接后自动尝试重传消息?或者这应该由应用程序处理?

MQTT 规范涵盖了消息传递重试

当客户端在 CleanSession 设置为 0 的情况下重新连接时,客户端和服务器都必须使用其原始数据包标识符重新发送任何未确认的 PUBLISH 数据包(其中 QoS > 0)和 PUBREL 数据包。这是客户端或服务器需要重新传递消息的唯一情况。

因此,如果您的客户端遵循规范并且您使用的是持久会话 (CleanSession = 0),那么消息将被重新传输。