В основном MQTTAsync_deliveryComplete и MQTTAsync_onSuccess делают то же самое, они уведомляют вас посредством обратного вызова о доставке сообщения.Оба обратных вызова выполняются асинхронно в отдельном потоке к потоку, в котором выполняется клиентское приложение.
(Оба обратных вызова даже используют один и тот же поток в случае текущей версии клиента Paho, но этонедокументированная деталь реализации. Этот поток, используемый MQTTAsync_deliveryComplete и MQTTAsync_onSuccess, конечно, не является потоком приложения, в противном случае это не будет асинхронный обратный вызов.
Разница в том, что обратный вызов MQTTAsync_deliveryComplete устанавливается * 10051006 * через MQTTAsync_setCallbacks, а затем вам сообщают о каждой доставке сообщения.
В отличие от этого, MQTTAsync_onSuccess информирует вас один раз точно о сообщении, которое вы отправляете через MQTTAsync_sendMessage ().
Вы можете даже определить оба обратных вызова, которые будут оба будут вызываться при доставке сообщения.
Это дает вам гибкость в выборе подхода, который наилучшим образом соответствует вашим потребностям.
Искусственный пример
Предположим, у вас есть три разные функции, каждая из которых отправляет определенный тип сообщения (например, sendTempera (), sendHumidity (), sendAirPressure ()) и вкаждая функция, которую вы вызываете MQTTAsync_sendMessage, и после каждой доставки вы хотите вызывать соответствующую функцию обратного вызова, тогда вы выбираете MQTTAsync_onSuccess.Тогда вам не нужно отслеживать MQTTAsync_token и связывать это с вашими обратными вызовами.
Например, если вы хотите вместо этого реализовать функцию ведения журнала, было бы более полезно использовать MQTTAsync_deliveryComplete, потому что она вызывается для каждая доставка.
И, конечно, можно вообразить, что для ведения журнала хотелось бы иметь как конкретное с некоторыми действиями, так и общее для ведения журнала, поэтому в этом случае оба варианта могут использоваться одновременно.
Документация
Следует отметить, что MQTTAsync_deliveryComplete в своей документации прямо заявляет, что она принимает во внимание набор качества обслуживания.Это не относится к документации MQTTAsync_onSuccess, но, конечно, это не означает, что это не сделано в реализации.Но если это важно, вы должны явно проверить исходный код.