В чем разница между обратными вызовами MQTTAsync_onSuccess и MQTTAsync_deliveryComplete? - PullRequest
0 голосов
/ 21 мая 2019

Я изучаю MQTT (в частности, библиотеку paho C), читая и экспериментируя с вариациями асинхронных pub / sub примеров.

Что такоеРазница между MQTTAsync_deliveryComplete обратным вызовом, который вы установили с помощью MQTTAsync_setCallbacks () , против MQTTAsync_onSuccess или MQTTAsync_onSuccess *, который вызывает 1015 *, вызывает 1015 *, что вы вызываете 1015 *, которые вызывают , которые вызывают *1015*, вы вызываете 1015 *, которые вызывают *1015*, которые вызывают *1015*, которые вызывают *1015*, которые вызывают *1015*, которые вызывают *1015*, которые вызывают *1015*, которые вызывают *1015*, которые вызывают *1015*, которые вызывают *1015*, которые вызывают *1015*, которые вызывают *1015*, которые вызывают *1015*, которые вызывают *1015* inSback *, которые вызывают 1015 *, которые вызывают у вас 1015 *, которые вызывают *1015*, которые вызывают у вас 1015 *, которые вызывают *1015* inSback *, которые 1015 * вызывают * 5* MQTTAsync_responseOptions структура, которую вы передаете MQTTAsync_sendMessage () ?

Кажется, что все имеют дело с "успешной доставкой" опубликованных сообщений, но из чтения примера кода и doxygen я могуне говорите, как они связаны или конфликтуют или дополняют друг друга.Благодарен за любые советы.

1 Ответ

1 голос
/ 22 мая 2019

В основном 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, но, конечно, это не означает, что это не сделано в реализации.Но если это важно, вы должны явно проверить исходный код.

...