Не блокировать loop() бесконечными попытками подключения к MQTT
mqttClient.connect() блокирует на время TCP-таймаута, если брокер недоступен. Без паузы между попытками это происходило на каждой итерации loop() — веб-интерфейс и опрос датчиков/реле (не зависят от MQTT и должны работать даже без платформы) подвисали. Теперь переподключение пробуется не чаще раза в 5 секунд. В README добавлен раздел "Автономная работа без платформы" — что именно работает локально без docker compose, а что требует брокера.
This commit is contained in:
+16
-1
@@ -63,11 +63,25 @@ void mqttBegin() {
|
||||
mqttClient.setCallback(onMessage);
|
||||
}
|
||||
|
||||
// mqttClient.connect() блокирует на время TCP-таймаута, если брокер
|
||||
// недоступен. Без паузы между попытками это съедало бы почти весь loop() —
|
||||
// а значит и веб-интерфейс, и опрос датчиков/реле, которые от MQTT не
|
||||
// зависят и обязаны работать даже без связи с платформой (см. README,
|
||||
// "Автономная работа без платформы").
|
||||
static unsigned long lastConnectAttempt = 0;
|
||||
static const unsigned long RECONNECT_INTERVAL_MS = 5000;
|
||||
|
||||
void mqttEnsureConnected() {
|
||||
if (mqttClient.connected()) {
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned long now = millis();
|
||||
if (now - lastConnectAttempt < RECONNECT_INTERVAL_MS && lastConnectAttempt != 0) {
|
||||
return;
|
||||
}
|
||||
lastConnectAttempt = now;
|
||||
|
||||
Serial.print("[mqtt] connecting to ");
|
||||
Serial.print(MQTT_BROKER_HOST);
|
||||
if (mqttClient.connect(MQTT_CLIENT_ID)) {
|
||||
@@ -75,7 +89,8 @@ void mqttEnsureConnected() {
|
||||
mqttClient.subscribe("devices/+/commands", 1);
|
||||
} else {
|
||||
Serial.print(" failed, rc=");
|
||||
Serial.println(mqttClient.state());
|
||||
Serial.print(mqttClient.state());
|
||||
Serial.println(" (это ок, если платформа сейчас не поднята — веб-интерфейс и реле работают локально)");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user