在mqtt中实现对代理的应用程序级确认的最佳方法是什么?

在mqtt中实现对代理的应用程序级确认的最佳方法是什么?,mqtt,esp32,Mqtt,Esp32,我正在使用esp32 mqtt客户端库。在这种情况下,只要使用QoS1接收到有效的mqtt消息,mqtt_客户端库就会自动发送Puback消息,而无需等待应用层对有效负载进行身份验证。有两种方法可以克服这种情况- 保留Puback消息直到应用层处理它 在客户端和代理之间打开一个新主题以实现应用程序级身份验证机制 你们能建议最好的方法吗?这是正确的行为,因为ack是协议级别的。持有PUBACK,如果您正在使用的MQTT库允许这样做,则imho不适合这样做,因为您在协议级别以某种方式破坏了契约,并且

我正在使用esp32 mqtt客户端库。在这种情况下,只要使用QoS1接收到有效的mqtt消息,mqtt_客户端库就会自动发送Puback消息,而无需等待应用层对有效负载进行身份验证。有两种方法可以克服这种情况-

  • 保留Puback消息直到应用层处理它
  • 在客户端和代理之间打开一个新主题以实现应用程序级身份验证机制
    你们能建议最好的方法吗?

    这是正确的行为,因为ack是协议级别的。持有PUBACK,如果您正在使用的MQTT库允许这样做,则imho不适合这样做,因为您在协议级别以某种方式破坏了契约,并且如果应用程序花费太多时间处理消息而没有发送PUBACK,则代理将重新发送未按时接收PUBACK的消息。
    Imho最好的解决方案是依赖于不同的主题,客户机在该主题上发布“应用程序级别的ack”。

    发送Puback ack数据包时未经应用程序级别的验证,因为它应该是这样工作的。MQTT中的服务质量(QoS)因素并不意味着在验证数据包中的数据内容时发送ack数据包。它的意思是承认接待。就这些


    对于您尝试执行的操作,您需要实现一个应用程序级协议,以便在验证数据后服务或丢弃数据包(然后用另一个数据包通知发送方)。

    即使在QOS 1或2下,MQTT中也没有发布者到订阅者或订阅者到发布者的传递通知。确认仅在1个客户和代理之间进行。如果您想要端到端确认,那么您必须发送第二条消息。