Skip to content

Commit fb16d9a

Browse files
committed
Implementation of exponential-back-off on reconnection attempt.
1 parent 5ed525d commit fb16d9a

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

src/ArduinoIoTCloudTCP.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ extern "C" unsigned long getTime()
7474

7575
ArduinoIoTCloudTCP::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()
337339
ArduinoIoTCloudTCP::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

345351
ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SyncTime()
@@ -352,7 +358,14 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SyncTime()
352358
ArduinoIoTCloudTCP::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;

src/ArduinoIoTCloudTCP.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
9696

9797
State _state;
9898

99+
unsigned long _next_connection_attempt_tick;
100+
unsigned int _last_connection_attempt_cnt;
99101
unsigned long _lastSyncRequestTickTime;
100102
String _brokerAddress;
101103
uint16_t _brokerPort;

0 commit comments

Comments
 (0)