@@ -74,6 +74,8 @@ extern "C" unsigned long getTime()
7474
7575ArduinoIoTCloudTCP::ArduinoIoTCloudTCP ()
7676: _state{State::ConnectPhy}
77+ , _next_connection_attempt_tick{0 }
78+ , _last_connection_attempt_cnt{0 }
7779, _lastSyncRequestTickTime{0 }
7880, _mqtt_data_buf{0 }
7981, _mqtt_data_len{0 }
@@ -337,9 +339,13 @@ void ArduinoIoTCloudTCP::printDebugInfo()
337339ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_ConnectPhy ()
338340{
339341 if (_connection->check () == NetworkConnectionState::CONNECTED)
340- return State::SyncTime;
341- else
342- return State::ConnectPhy;
342+ {
343+ bool const is_retry_attempt = (_last_connection_attempt_cnt > 0 );
344+ if (!is_retry_attempt || (is_retry_attempt && (_next_connection_attempt_tick > millis ())))
345+ return State::SyncTime;
346+ }
347+
348+ return State::ConnectPhy;
343349}
344350
345351ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SyncTime ()
@@ -352,7 +358,14 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SyncTime()
352358ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_ConnectMqttBroker ()
353359{
354360 if (_mqttClient.connect (_brokerAddress.c_str (), _brokerPort))
361+ {
362+ _last_connection_attempt_cnt = 0 ;
355363 return State::SubscribeMqttTopics;
364+ }
365+
366+ static unsigned long const RECONNECTION_RETRY_DELAY_ms = 1000 ;
367+ _last_connection_attempt_cnt = min (_last_connection_attempt_cnt + 1 , 5 );
368+ _next_connection_attempt_tick = millis () + pow (2 , _last_connection_attempt_cnt) * RECONNECTION_RETRY_DELAY_ms;
356369
357370 DEBUG_ERROR (" ArduinoIoTCloudTCP::%s could not connect to %s:%d" , __FUNCTION__, _brokerAddress.c_str (), _brokerPort);
358371 return State::ConnectPhy;
0 commit comments