Коллеги, покажите, пожалуйста, пример использования connect_async, mosquitto_loop_start для организации подписки в клиенте. Не получается у меня без вызова mosquitto_loop прочитать топик. Может, нужно создать поток, в нем mosquitto_loop_start, цикл с mosquitto_loop внутри, после выхода из цикла mosquitto_stop?
И вообще, mosquittopp может работать в неблокирующем режиме?
Раньше работал с библиотекой Pаho MQTT C++ Client. Там асинхронный режим реализован внутри библиотеки - определяешь обработчики, подключаешься и все. А как это делается в mosquittopp, не понимаю:((
Там же в документации всё написано.
mosquitto_loop_start - само запускает фоновый поток с циклом.
В дереве исходников mosquitto есть примеры, насколько я помню.
Mosquittopp - это тупая обёртка над C-интерфейсом mosquitto, так что всё одинаково.
Можете посмотреть как у нас сделано:
Тут также реализован. Только там нет функции вида set_callback, там библиотека дёргает методы с названиями on_connect, on_message и т.п.
И да, совсем не обязательно использовать libmosquitto, если вам клиент от Paho нравится. Протокол же стандартный, библиотеки Paho прекрасно работают с брокером Mosquitto.
Там пример блокирующих вызовов, что-то типа этого:
while(1){
rc = tempconv->loop();
if(rc){
tempconv->reconnect();
}
}
Так и вас то же самое:
int TMQTTClient::LoopFor(int duration, int timeout)
{
steady_clock::time_point start = steady_clock::now();
int cur_duration;
int rc = 0;
while (1) {
rc = this->loop(timeout);
cur_duration = duration_cast<milliseconds>(steady_clock::now() - start).count();
if (cur_duration > duration) {
return rc;
}
if(rc != 0) {
this->reconnect();
}
}
}
Ну, ладно, хотел быстро. Быстро не получается…
Спасибо.
libmosquitto пытаюсь использовать именно потому, что paho не нравится. Эта либа заточена на постоянное соединение. Мне нужно подключиться, сделать все, что нужно и отключиться. В таком режиме у библиотеки жуткие таймауты, которые гробят все…
Все было просто - при сборке библиотеки забыл указать ключик WITH_THREADING.
Под линуксом теперь летает, в виндах - тормозит примерно на минуту при вызове pthread_join.