Я работаю над подключением некоторых встроенных устройств к брокеру 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 () в этом случае?