MQTTAsync_onSuccess 和 MQTTAsync_deliveryComplete 回调有什么区别?

What is difference between MQTTAsync_onSuccess and MQTTAsync_deliveryComplete callbacks?

我正在通过阅读和试验异步 pub/sub 示例的变体来学习 MQTT(特别是 paho C 库)。

MQTTAsync_deliveryComplete callback that you set with MQTTAsync_setCallbacks() vs. the MQTTAsync_onSuccess or MQTTAsync_onSuccess5 callbacks that you set in the MQTTAsync_responseOptions struct that you pass to MQTTAsync_sendMessage()有什么区别?

似乎都处理了 "successful delivery" 的已发布消息,但是从示例代码和 doxygen 的阅读来看,我无法说出它们之间的关系、冲突或补充。感谢您的指导。

基本上 MQTTAsync_deliveryComplete 和 MQTTAsync_onSuccess 做同样的事情,他们通过回调通知您消息的传递。两个回调都在客户端应用程序 运行.

所在线程的单独线程上异步执行

(在当前版本的 Paho 客户端中,两个回调甚至使用相同的线程,但这是一个 non-documented 实现细节。这个线程被 MQTTAsync_deliveryComplete 和 MQTTAsync_onSuccess当然不是应用线程,否则就不是异步回调了)。

不同之处在于 MQTTAsync_deliveryComplete 回调通过 MQTTAsync_setCallbacks 设置 一次 然后你会被告知 传递消息。

与此相反,对于您通过 MQTTAsync_sendMessage() 发送的消息,MQTTAsync_onSuccess 会通知您 一次

您甚至可以同时定义这两个回调,在传递消息时将两者 调用。

这使您可以灵活地选择最适合您需求的方法。

人工例子

假设您有三个不同的函数,每个都发送特定类型的消息(例如 sendTemperature()、sendHumidity()、sendAirPressure()),并且在每个函数中调用 MQTTAsync_sendMessage,并且在每次传递之后您想调用匹配的回调函数,则选择MQTTAsync_onSuccess。然后你不需要跟踪 MQTTAsync_token 并将其与你的回调相关联。

例如,如果您想实现一个日志记录功能,那么使用 MQTTAsync_deliveryComplete 会更有用,因为它会在 every 传递时调用。

当然,人们可以想象,人们希望同时拥有具有某些操作的特定版本和用于日志记录的通用版本,因此在这种情况下,可以同时使用两种变体。

文档

您应该注意到 MQTTAsync_deliveryComplete 在其文档中明确指出它考虑了服务质量集。 MQTTAsync_onSuccess文档中不是这样的,当然不代表实现中没有这样做。但如果这很重要,您应该明确检查源代码。