libmosquittopp — пример клиента зависает на методе loop_stop ()

Я пытаюсь создать простой клиент MQTT для моего домашнего приложения, и я использую libmosquittopp (это версия libmosquitto для C ++).
Для этой библиотеки не так много документации, но я нашел 2 примера (Вот а также Вот) это помогло мне создать код для моего класса «MQTTWrapper».

Вот мой код:

MQTTWrapper.h:

#pragma once

#include <mosquittopp.h>
#include <string>

class MQTTWrapper : public mosqpp::mosquittopp
{
public:
MQTTWrapper(const char* id, const char* host_, int port_);
virtual ~MQTTWrapper();

void myPublish(std::string topic, std::string value);
private:
void on_connect(int rc);
void on_publish(int mid);

std::string host;
int port;
};

MQTTWrapper.cpp

#include "MQTTWrapper.h"
#include <iostream>

MQTTWrapper::MQTTWrapper(const char* id, const char* host_, int port_) :
mosquittopp(id), host(host_), port(port_)
{
mosqpp::lib_init();

int keepalive = 10;
if (username_pw_set("sampleuser", "samplepass") != MOSQ_ERR_SUCCESS) {
std::cout << "setting passwd failed" << std::endl;
}
connect_async(host.c_str(), port, keepalive);
if (loop_start() != MOSQ_ERR_SUCCESS) {
std::cout << "loop_start failed" << std::endl;
}
}

MQTTWrapper::~MQTTWrapper()
{
std::cout << "1" << std::endl;
if (loop_stop() != MOSQ_ERR_SUCCESS) {
std::cout << "loop_stop failed" << std::endl;
}
std::cout << "2" << std::endl;
mosqpp::lib_cleanup();
std::cout << "3" << std::endl;
}

void MQTTWrapper::on_connect(int rc)
{
std::cout << "Connected with code " << rc << "." << std::endl;
}

void MQTTWrapper::myPublish(std::string topic, std::string value) {
int ret = publish(NULL, topic.c_str(), value.size(), value.c_str(), 1, false);
if (ret != MOSQ_ERR_SUCCESS) {
std::cout << "Sending failed." << std::endl;
}
}

void MQTTWrapper::on_publish(int mid) {
std::cout << "Published message with id: " << mid << std::endl;
}

и мой главный ():

#include <iostream>
#include <string>
#include "MQTTWrapper.h"
int main(int argc, char *argv[])
{
MQTTWrapper* mqtt;
mqtt = new MQTTWrapper("Lewiatan IoT", "my.cloudmqtt.host", 12345);

std::string value("Test123");
mqtt->myPublish("sensors/temp", value);

std::cout << "about to delete mqtt" << std::endl;
delete mqtt;
std::cout << "mqtt deleted" << std::endl;
return 0;
}

Извините за столько кода.

Моя проблема в том, что когда я компилирую его и выполняю — мое приложение бесконечно зависает (я ждал только 9 минут) в деструкторе MQTTWrapper для метода loop_stop ().
Протестировано с libmosquittopp 1.4.8 (пакет debian), а затем после удаления — с версией 1.4.9 из GitHub.

loop_start() а также loop_stop(bool force=false) должен запустить / остановить отдельный поток, который обрабатывает сообщения.

Я проверил это с принудительной остановкой (loop_stop(true)) но так мое приложение останавливается и не публикует никаких данных. loop_stop() с другой стороны, публикует данные, но затем останавливается.

консольный вывод (make && ./executable):

g++ -c MQTTWrapper.cpp
g++ -c main.cpp
g++ -o executable main.o MQTTWrapper.o -lmosquittopp
about to delete mqtt
1
Connected with code 0.
Published message with id: 1
(here it hangs infinitely...)

Мой вопрос:
Почему это loop_stop() зависает и как это исправить?

(любая документация / учебник / пример приветствуется)

2

Решение

Попробуй позвони disconnect() до loop_stop(), Вам также следует помнить, что вы эффективно делаете это:

connect_async();
loop_start();
loop_stop();

У клиента, возможно, даже не было возможности подключиться, и поток на самом деле не был запущен до того, как вы скажете ему остановиться.

Стоит рассмотреть запуск действий в обратных вызовах:

on_connect -> call publish
on_publish -> call disconnect
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]