@@ -74,6 +74,8 @@ extern "C" unsigned long getTime()
74
74
75
75
ArduinoIoTCloudTCP::ArduinoIoTCloudTCP ()
76
76
: _state{State::ConnectPhy}
77
+ , _next_connection_attempt_tick{0 }
78
+ , _last_connection_attempt_cnt{0 }
77
79
, _lastSyncRequestTickTime{0 }
78
80
, _mqtt_data_buf{0 }
79
81
, _mqtt_data_len{0 }
@@ -337,9 +339,13 @@ void ArduinoIoTCloudTCP::printDebugInfo()
337
339
ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_ConnectPhy ()
338
340
{
339
341
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;
343
349
}
344
350
345
351
ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SyncTime ()
@@ -352,7 +358,14 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SyncTime()
352
358
ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_ConnectMqttBroker ()
353
359
{
354
360
if (_mqttClient.connect (_brokerAddress.c_str (), _brokerPort))
361
+ {
362
+ _last_connection_attempt_cnt = 0 ;
355
363
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;
356
369
357
370
DEBUG_ERROR (" ArduinoIoTCloudTCP::%s could not connect to %s:%d" , __FUNCTION__, _brokerAddress.c_str (), _brokerPort);
358
371
return State::ConnectPhy;
0 commit comments