mqtt: attempt to reconfigure in the main loop

- flag is not automatically rescheduled, do so manually
- fix mdns _mqtt._tcp polling without timer being rescheduled
This commit is contained in:
Maxim Prokhorov
2024-09-14 01:21:39 +03:00
parent 9427286a9b
commit 412fc58867

View File

@@ -1042,8 +1042,6 @@ void _mqttMdnsDiscovery() {
mqtt::settings::keys::Port,
_mqtt_mdns_port);
_mqttConfigure();
_mqtt_mdns_server = String();
_mqtt_mdns_port = 0;
@@ -1053,9 +1051,13 @@ void _mqttMdnsDiscovery() {
#endif
struct MqttConfigureGuard {
MqttConfigureGuard() {
_mqtt_reconnect_flag.stop();
_mqtt_reconnect_delay = 0;
explicit MqttConfigureGuard(bool reschedule) {
if (reschedule) {
_mqtt_reconnect_flag.stop();
_mqtt_reconnect_delay = 0;
}
_mqtt_settings.reconnect = false;
}
~MqttConfigureGuard() {
@@ -1075,9 +1077,9 @@ struct MqttConfigureGuard {
}
};
void _mqttConfigure() {
// Reset reconnect delay to reconnect sooner
MqttConfigureGuard _;
void _mqttConfigureImpl(bool reschedule) {
// Generic enter and exit routines, declared externally
MqttConfigureGuard _(reschedule);
// Before going through the settings, make sure there is SERVER:PORT to connect to
_mqtt_error = ErrOk;
@@ -1180,6 +1182,10 @@ void _mqttConfigure() {
_mqtt_skip_time = mqtt::settings::skipTime();
}
void _mqttConfigure() {
_mqttConfigureImpl(true);
}
void _mqttSettingsMigrate(int version) {
if (version < 4) {
STRING_VIEW_INLINE(Identifier, "{identifier}");
@@ -1573,6 +1579,13 @@ void _mqttScheduleConnect() {
mqtt::reconnect::delay(_mqtt_reconnect_delay));
}
void _mqttScheduleReconnect() {
_mqtt_reconnect_delay =
mqtt::reconnect::next(_mqtt_reconnect_delay);
_mqtt_reconnect_flag.wait(
mqtt::reconnect::delay(_mqtt_reconnect_delay));
}
void _mqttStopConnect() {
_mqtt_reconnect_flag.stop();
_mqtt_skip_flag.stop();
@@ -2051,24 +2064,31 @@ void _mqttConnect() {
// Do not connect if disabled or no WiFi
if (!_mqtt_enabled || !_mqtt_network) return;
// Check reconnect interval
// Check reconnect interval...
if (!_mqtt_reconnect_flag) return;
// Increase reconnect delay each attempt
_mqtt_reconnect_delay =
mqtt::reconnect::next(_mqtt_reconnect_delay);
// ...and reschedule immediately when expired
_mqttScheduleReconnect();
// Attempt MDNS discovery when configuration was only partially successful
// Perform MDNS discovery before attempting reconfiguration
#if MDNS_SERVER_SUPPORT
if (_mqtt_error && _mqtt_error == ErrMDNS) {
_mqttMdnsDiscovery();
}
#endif
// Do not connect when configuration was not successful
if (_mqtt_error) return;
// Attempt to reconfigure when configuration was previously unsuccessful
if (_mqtt_error) {
_mqttConfigureImpl(false);
}
// Do not continue if the error is still there
if (_mqtt_error) {
return;
}
_mqtt_state = AsyncClientState::Connecting;
_mqttStopConnect();
DEBUG_MSG_P(PSTR("[MQTT] Connecting to broker at %s:%hu\n"),
_mqtt_settings.server.c_str(), _mqtt_settings.port);