При использовании библиотеки mosquitto Как вызвать сообщение publi sh, если я использую mosquitto_loop_forever () - PullRequest
0 голосов
/ 17 марта 2020

Я работаю над подключением некоторых встроенных устройств к брокеру Mosquitto с помощью клиента C Mosquitto. Мои устройства работают в нестабильной среде Wi-Fi. Таким образом, мои устройства постоянно теряют связь с брокером комаров случайно.

Мне нужно поддерживать связь с брокером от комаров со стороны устройства. В моем устройстве я периодически проверяю, подключено ли мое устройство к москитному брокеру. однако для этого я не могу использовать KeepAlive, поскольку мое устройство переходит в спящий режим каждые 30 секунд и не может самостоятельно проснуться. Когда устройство переходит в спящий режим, функция отправки поддерживает сообщение с устройства активным, не работает и, следовательно, устройство очень часто отключается от брокера.

Таким образом, в качестве альтернативного метода, убедитесь, что мое устройство подключено к брокер mosquitto, я запускаю поток, который запускается один раз в 5 секунд, и публикует сообщение для брокера с помощью QOS 1. Затем этот поток ожидает в течение определенного периода времени, чтобы получить подтверждение брокера publi sh. Если подтверждение publi sh не получено, этот поток вызывает mosquitto_disconnect () для принудительного отключения от посредника и пытается восстановить соединение.

Мой код в главном потоке, который устанавливает соединение с брокером, выглядит примерно так.

int main()
{
    struct mosquitto *mosq;
    mosq = mosquitto_new("id", true, NULL);

    mosquitto_connect_with_flags_callback_set(mosq, my_connect_callback);
    mosquitto_disconnect_callback_set(mosq, my_disconnect_callback);
    mosquitto_message_callback_set(mosq, my_message_callback);
    mosquitto_publish_callback_set(mosq, my_publish_callback);    
    mosquitto_connect_bind(mosq, szHostName, iMQTTPort, 0, NULL);

    mosquitto_loop_forever(mosq, -1, 1);  // this calls mosquitto_loop() in a loop, it will exit once 
   //    the   disconnects cleanly

    mosquitto_destroy(mosq);
    mosquitto_lib_cleanup(); 
    return 0; 
}

Поскольку вызов mosquitto_loop_forever () никогда не возвращается, пока устройство подключено к брокеру, я вынужден вызывать функцию publish_message () в другом потоке. Проблема заключается в том, что вызов сообщения publi sh в другом потоке вызывает некоторые взаимные блокировки с другими потоками на моем устройстве или несколько раз в потоке в самой библиотеке mosquitto. Из-за этого мое устройство не может обрабатывать команды, полученные от брокера.

Каков наилучший способ вызова publish_message () в этом случае?

...