Я пытаюсь понять использование и поведение различных механизмов обратного вызова в библиотеке Paho MQTT C ++ при использовании async_client, а именно:
- mqtt :: callback
- mqtt :: iaction listener
- mqtt :: connection_handler
Чего я добиваюсь: метод инициализации блокировки, который ожидает успешного подключения и успешной подписки к списку тем (одна топи c для начала), а также автоматизированные c повторное подключение и повторная подписка на эти темы в случае прекращения подключения.
Пример 'async_subscribe' (https://github.com/eclipse/paho.mqtt.cpp/blob/master/src/samples/async_subscribe.cpp) предлагает мне подписаться на темы в mqtt :: callback :: connected. Тем не менее, он не показывает, как ждать успешного завершения подписки. Насколько я понимаю, я не должен вызывать 'wait' на маркере подписки внутри подключенного обратного вызова. Если я установил частную переменную _subscribeToken для ожидания, кажется, нет никакой гарантии, была ли она установлена после ожидания завершения подключения, то есть (псевдокод):
void Callback::connected(const std::string& cause){
_subscribeToken = _client->subscribe(topic, qos, nullptr, action_listener);
}
при инициализации :
token_ptr connectToken = connect(connectOpts);
connectToken->wait();
_subscribeToken->wait(); // but _subscribeToken may still be null at this point.
Какой смысл connectToken-> ждать, если он еще не гарантирует, что обратный вызов еще не был вызван? Вполне вероятно, что я что-то неправильно понимаю, но я бы хотел, чтобы меня указали в правильном направлении!