Издатель Mosquitto не публикует никаких сообщений

Я пытался разработать код C, используя mosquitto lib, для публикации сообщения на брокере mosquitto через TLS. Я настроил TLS на стороне москита, и он работал нормально. Я мог отправлять и получать сообщения с помощью mosquitto_pub и mosquitto_sub.

Однако когда я попытался опубликовать сообщение, используя свой код C, это не сработало. Судя по всему, код подключается нормально и отправляет сообщение, ошибки нет, но подписчик ничего не читает.

Ниже приведен код издателя, который я использую:

ReportSender::ReportSender()
{
    mosquitto_lib_init();

    mosquitoStruct = mosquitto_new (NULL, true, NULL);

    mosquitto_tls_opts_set(mosquitoStruct, 1, NULL, NULL);

    mosquitto_tls_set(mosquitoStruct, "~/temp/keys/secondAttempt/server.crt", NULL, NULL, NULL, NULL);

    mosquitto_tls_insecure_set(mosquitoStruct, false);

    mosquitto_connect_callback_set(mosquitoStruct, connect_cb);
    mosquitto_publish_callback_set(mosquitoStruct, publish_cb);
    mosquitto_log_callback_set(mosquitoStruct, log_cb);

    mosquitto_connect (mosquitoStruct, MQTT_BROKER, MQTT_PORT, 0);

    const char *reportRef = "Hello Word!";

    // Publish the message to the topic
    mosquitto_publish (mosquitoStruct, NULL, MQTT_TOPIC,
              strlen(reportRef), reportRef, 0, false);

    sleep (20);
}

А подписчик:

mosquitto_sub -h 192.168.56.101 -p 8883 -t "#" -v --cafile server.crt

Что случилось?

Спасибо, Мауро


person Mauro Silva    schedule 29.04.2018    source источник
comment
Вы уверены, что mosquitto_connect является блокирующим вызовом ?. В противном случае вы вызовете публикацию до того, как соединение будет завершено. Возможно, вам придется переместить вызов mosquitto_publish в обратный вызов connect_cb   -  person hardillb    schedule 30.04.2018


Ответы (1)


Вы должны посмотреть на набор функций loop * (), они нужны для обработки фонового сетевого трафика. publish () не является блокирующим вызовом.

person ralight    schedule 30.04.2018
comment
Просто проверяю, а как насчет подключения? Я предполагаю, что это тоже должно быть асинхронным (с учетом обратного вызова) - person hardillb; 30.04.2018
comment
Подключение блокируется только до установления сетевого сокета. Успешный возврат из него означает, что сокет установлен. Это ничего не значит о потоке пакетов mqtt - вы получаете это из обратного вызова. - person ralight; 01.05.2018
comment
круто, поэтому нам нужны функции цикла (для обработки фактического MQTT взад и вперед) и для перемещения вызова publish в обратный вызов on_connect, чтобы он не вызывался, пока клиент не будет готов - person hardillb; 01.05.2018
comment
Переносить публикацию в on_connect не обязательно, но это не повредит. Конечно, это будет означать, что он будет переиздаваться каждый раз при повторном подключении. - person ralight; 01.05.2018
comment
Большое спасибо за вашу помощь! Это сработало! Проблема заключалась в том, что функция подключения не блокировалась! Я быстро изменил код, чтобы проверить его, и как только у меня будет окончательный код, я публикую здесь. Спасибо еще раз. - person Mauro Silva; 03.05.2018