Неблокирующая библиотека MQTT
Существуют ли какие-либо библиотеки MQTT, которые не блокируются при подключении?
В настоящее время я использую PubSubClient, и часть подключения содержит этот код: https://github.com/knolleary/pubsubclient/blob/master/src/PubSubClient.cpp
while (!_client->available()) {
unsigned long t = millis();
if (t-lastInActivity >= ((int32_t) MQTT_SOCKET_TIMEOUT*1000UL)) {
_state = MQTT_CONNECTION_TIMEOUT;
_client->stop();
return false;
}
}
Я бы хотел, чтобы мой основной цикл продолжался или вызывался обратный вызов, пока установлено соединение MQTT, а не ждать целую вечность, если сервер MQTT недоступен.
Обновление:
Я написал модификацию, чтобы использовать функцию обратного вызова, и вызвал ее в предложении else, добавленном к этому оператору if, и обнаружил, что задержка блокировки не является этим циклом while. Я думаю, что это находится в _client->connect в начале метода.
@Stephen Denne, 👍5
1 ответ
У меня был тот же вопрос, и я нашел библиотеку mqtt, которая полностью неблокирующая.
- https://github.com/marvinroger/async-mqtt-client
Вам нужно установить его вручную, и в документах даны инструкции:
- https://github.com/marvinroger/async-mqtt-client/blob/develop/docs/1.-Getting-started.md
Для этого требуется одна дополнительная библиотека:
- для esp8266: https://github.com/me-no-dev/ESPAsyncTCP
- для esp32: https://github.com/me-no-dev/AsyncTCP
Мне также понравилось использование библиотеки Ticker в качестве общего инструмента для неблокирующего кода.
- Как передать переменные в пользовательские функции обратного вызова
- Пример класса ESP8266 ASyncTCP
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Как заставить 5-вольтовое реле работать с NodeMCU
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ESP8266 не подключается к Wi-Fi