Attempt to fix blocking mqtt reconnect

master
cazagen 5 years ago
parent fd787a05b2
commit 6474447e53
Signed by: cazagen
GPG Key ID: C326FEEE25FF7915
  1. 59
      buttons.cpp

@ -17,11 +17,13 @@ int input3_value = 0;
int input4_value = 0;
int led_timeout = 1000;
long led_time = 0;
long last_wifi_check_time = 0;
long lastReconnectAttempt = 0;
long reconnectAttempts = 0;
long debouncing_time = 1000;
volatile unsigned long last_micros;
@ -94,25 +96,21 @@ void setup_wifi() {
Serial.println(WiFi.localIP());
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// Once connected, publish an announcement...
} else {
Serial.print("failed, rc= ");
Serial.print(client.state());
Serial.println(" try again in 1 second");
// Wait 1 seconds before retrying
delay(1000);
}
boolean reconnect() {
reconnectAttempts++;
#
String clientID = "ESP8266Client-";
clientID += String(random(0xffff), HEX);
if (client.connect(clientID.c_str())) {
Serial.println("MQTT Connected");
} else {
Serial.print("failed, rc = ");
Serial.print(client.state());
Serial.println("Trying again");
}
return client.connected();
}
void setup() {
@ -191,10 +189,6 @@ void Interrupt4() {
void loop() {
long now = millis();
if (!client.connected()) {
reconnect(); // mqtt
}
if (now - last_wifi_check_time > WIFI_TIMEOUT) {
Serial.print("Checking WiFi... ");
if (WiFi.status() != WL_CONNECTED) {
@ -206,10 +200,27 @@ void loop() {
last_wifi_check_time = now;
}
if (!client.connected()) {
if (now - lastReconnectAttempt > 5000) {
lastReconnectAttempt = now;
// Attempt to reconnect
Serial.println("Attempting MQTT reconnect");
if (reconnect()) {
reconnectAttempts = 0;
lastReconnectAttempt = 0;
}
if (reconnectAttempts > 5) {
Serial.println("mqtt failed too many times, restarting wifi");
setup_wifi();
}
}
} else {
client.loop();
}
if (now - led_time > led_timeout) {
digitalWrite(LED_PIN, 0);
}
client.loop(); // mqtt client
ArduinoOTA.handle();
}

Loading…
Cancel
Save