diff --git a/docs/use/gateway.md b/docs/use/gateway.md index 13224922..d88c65b5 100644 --- a/docs/use/gateway.md +++ b/docs/use/gateway.md @@ -140,6 +140,10 @@ mosquitto_pub -t "home/OpenMQTTGateway/commands/MQTTtoSYS/config" -m }' ``` +::: tip +If the client can't connect to the MQTT broker corresponding to the current `cnt_index`, it will increment the index to the next valid connection set and restart with it. +::: + ## Saving/Loading connection parameters/certificates at runtime This chapter details the process for managing certificates/connections parameters used for secure MQTT communication with OpenMQTTGateway diff --git a/main/User_config.h b/main/User_config.h index bed07554..f8d0915d 100644 --- a/main/User_config.h +++ b/main/User_config.h @@ -284,8 +284,9 @@ struct ss_cnt_parameters { // Index 0 is used for connection parameters provided in the build that can be overloaded by WiFi Manager/Onboarding/WebUI,MQTT #define CNT_DEFAULT_INDEX 0 // Index 1 and more are used for connection parameters provided at runtime by MQTT +#define cnt_parameters_array_size 3 -ss_cnt_parameters cnt_parameters_array[3] = { +ss_cnt_parameters cnt_parameters_array[cnt_parameters_array_size] = { {ss_server_cert, ss_client_cert, ss_client_key, OTAserver_cert, MQTT_SERVER, MQTT_PORT, MQTT_USER, MQTT_PASS, MQTT_SECURE_DEFAULT, MQTT_CERT_VALIDATE_DEFAULT, true}, {"", "", "", "", MQTT_SERVER, MQTT_PORT, MQTT_USER, MQTT_PASS, MQTT_SECURE_DEFAULT, MQTT_CERT_VALIDATE_DEFAULT, false}, {"", "", "", "", MQTT_SERVER, MQTT_PORT, MQTT_USER, MQTT_PASS, MQTT_SECURE_DEFAULT, MQTT_CERT_VALIDATE_DEFAULT, false}}; diff --git a/main/main.ino b/main/main.ino index 470258e4..100b3ac0 100644 --- a/main/main.ino +++ b/main/main.ino @@ -886,7 +886,26 @@ void connectMQTT() { delayWithOTA(5000); ErrorIndicatorOFF(); delayWithOTA(5000); + + // If we have failed to connect to the MQTT broker, we will try to connect to the next set of connection parameters if (failure_number_mqtt > maxRetryWatchDog) { +#ifndef ESPWifiManualSetup + // Look for the next valid connection + for (int i = 0; i < cnt_parameters_array_size; i++) { + cnt_index++; + if (cnt_index >= cnt_parameters_array_size) { + cnt_index = 0; + } + if (cnt_parameters_array[cnt_index].validConnection) { + Log.notice(F("Connection %d valid, switching" CR), cnt_index); + saveConfig(); + break; + } else { + Log.notice(F("Connection %d not valid" CR), cnt_index); + } + } +#endif + unsigned long millis_since_last_ota; while ( // When