MQTT 通信中缺少 SUBACK 会发生什么?

What to expect when SUBACK is missing in MQTT communication?

我目前正在使用 PAHO MQTT C++ 库(但也应该适用于其他风格的 MQTT 库,尤其是 C)来异步实现 MQTT 客户端。有时,在发送 SUBSCRIBE 后,MQTT 服务器不响应 SUBACK,即使后来 PUBLISH/PUBACK 对成功。

我目前对 SUBACK 丢失的原因不感兴趣(我预计这可能只是因为单个数据包丢失...),但在这种情况下我对 MQTT 客户端库有何期待?

我最初的期望是在超时后调用故障处理程序,但我不确定是否存在这样的超时,或者如果我不主动检查(例如通过使用 wait_for) 它永远在队列中待处理?

规范(3.1.1)对这种情况不是很清楚。在我看来它是有缺陷的。

经纪人必须用SUBACK 响应SUBSCRIBE。但是允许在发送 SUBACK 之前发送 PUBLISH 数据包。

subscribe/unsubscribe 消息没有真正的 QoS。此外,SUBACK 数据包不是会话数据的一部分。所以重试与否完全取决于代理的实现。

根据 MQTT 规范版本 3.1.1,当服务器从客户端接收到 SUBSCRIBE 数据包时,服务器必须使用 SUBACK 数据包进行响应。 http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718067

但是规范并没有描述没有SUBACK时客户端应该做什么。所以这绝对取决于你。 (或您的客户)您的应用程序规范应该说明客户端在这种情况下做什么,这不违反 MQTT 规范。

在我看来,最好不要进一步发送PUBLISH。这将是一种故障安全。