我正在通过阅读和尝试异步pub / sub示例的变体来学习MQTT(特别是Paho C库)。
用MQTTAsync_deliveryComplete设置的MQTTAsync_setCallbacks()回调与在MQTTAsync_onSuccess结构中设置的MQTTAsync_onSuccess5或MQTTAsync_responseOptions回调之间有什么区别,您通过MQTTAsync_sendMessage()吗?
所有人似乎都处理已发布消息的“成功传递”,但是通过阅读示例代码和doxygen,我不知道它们是如何相互关联或冲突或互补的。感谢任何指导。
答案 0 :(得分:1)
基本上,MQTTAsync_deliveryComplete和MQTTAsync_onSuccess都执行相同的操作,它们通过回调通知您消息的传递。这两个回调在与运行客户端应用程序的线程不同的线程上异步执行。
(对于当前版本的Paho客户端,两个回调甚至都使用相同的线程,但这是未记录的实现细节。MQTTAsync_deliveryComplete和MQTTAsync_onSuccess使用的线程当然不是应用程序线程,否则不会是异步回调)。
区别在于,通过MQTTAsync_setCallbacks在一次上设置了MQTTAsync_deliveryComplete回调,然后通知您每条消息的传递。
与此相反,MQTTAsync_onSuccess会准确地通知您 您通过MQTTAsync_sendMessage()发送的消息。
您甚至可以定义两个回调,在发送邮件时将同时调用这两个回调。
这使您可以灵活地选择最适合您的需求的方法。
人工示例
假设您具有三个不同的函数,每个函数发送一种特定类型的消息(例如sendTemperature(),sendHumidity(),sendAirPressure()),并且在每个函数中调用MQTTAsync_sendMessage,并且在每次传递后都希望调用匹配的回调函数,那么您将选择MQTTAsync_onSuccess。然后,您无需跟踪MQTTAsync_token并将其与回调关联。
例如,如果您想改为实现日志记录功能,则使用MQTTAsync_deliveryComplete更为有用,因为它被称为每次传递。
当然,可以想象一个人希望同时具有特定的动作和通用的记录功能,因此在这种情况下,两种变体可以同时使用。
文档
您应该注意,MQTTAsync_deliveryComplete在其文档中明确声明已考虑服务质量集。在MQTTAsync_onSuccess文档中不是这种情况,但是当然,这并不意味着在实现中不会这样做。但是,如果这很重要,则应显式检查源代码。