Skip to content

Commit bcccca8

Browse files
authored
Merge pull request #298 from pennam/subscribe_retry_delay
Add retry delay on topic subscription failures
2 parents 8e3417a + 696b48e commit bcccca8

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

src/AIoTC_Config.h

+2
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@
142142

143143
#define AIOT_CONFIG_RECONNECTION_RETRY_DELAY_ms (1000UL)
144144
#define AIOT_CONFIG_MAX_RECONNECTION_RETRY_DELAY_ms (32000UL)
145+
#define AIOT_CONFIG_SUBSCRIBE_RETRY_DELAY_ms (1000UL)
146+
#define AIOT_CONFIG_SUBSCRIBE_MAX_RETRY_CNT (10UL)
145147
#define AIOT_CONFIG_TIMEOUT_FOR_LASTVALUES_SYNC_ms (30000UL)
146148
#define AIOT_CONFIG_LASTVALUES_SYNC_MAX_RETRY_CNT (10UL)
147149

src/ArduinoIoTCloudTCP.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ ArduinoIoTCloudTCP::ArduinoIoTCloudTCP()
7979
, _last_connection_attempt_cnt{0}
8080
, _last_sync_request_tick{0}
8181
, _last_sync_request_cnt{0}
82+
, _last_subscribe_request_tick{0}
83+
, _last_subscribe_request_cnt{0}
8284
, _mqtt_data_buf{0}
8385
, _mqtt_data_len{0}
8486
, _mqtt_data_request_retransmit{false}
@@ -404,6 +406,27 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SubscribeMqttTopics()
404406
return State::ConnectPhy;
405407
}
406408

409+
unsigned long const now = millis();
410+
bool const is_subscribe_retry_delay_expired = (now - _last_subscribe_request_tick) > AIOT_CONFIG_SUBSCRIBE_RETRY_DELAY_ms;
411+
bool const is_first_subscribe_request = (_last_subscribe_request_cnt == 0);
412+
413+
if (!is_first_subscribe_request && !is_subscribe_retry_delay_expired)
414+
{
415+
return State::SubscribeMqttTopics;
416+
}
417+
418+
if (_last_subscribe_request_cnt > AIOT_CONFIG_SUBSCRIBE_MAX_RETRY_CNT)
419+
{
420+
_last_subscribe_request_cnt = 0;
421+
_last_subscribe_request_tick = 0;
422+
_mqttClient.stop();
423+
execCloudEventCallback(ArduinoIoTCloudEvent::DISCONNECT);
424+
return State::ConnectPhy;
425+
}
426+
427+
_last_subscribe_request_tick = now;
428+
_last_subscribe_request_cnt++;
429+
407430
if (!_mqttClient.subscribe(_dataTopicIn))
408431
{
409432
DEBUG_ERROR("ArduinoIoTCloudTCP::%s could not subscribe to %s", __FUNCTION__, _dataTopicIn.c_str());
@@ -427,11 +450,14 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SubscribeMqttTopics()
427450

428451
DEBUG_INFO("Connected to Arduino IoT Cloud");
429452
execCloudEventCallback(ArduinoIoTCloudEvent::CONNECT);
453+
_last_subscribe_request_cnt = 0;
454+
_last_subscribe_request_tick = 0;
430455

431456
if (_shadowTopicIn != "")
432457
return State::RequestLastValues;
433458
else
434459
return State::Connected;
460+
435461
}
436462

437463
ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_RequestLastValues()

src/ArduinoIoTCloudTCP.h

+2
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
116116
unsigned int _last_connection_attempt_cnt;
117117
unsigned long _last_sync_request_tick;
118118
unsigned int _last_sync_request_cnt;
119+
unsigned long _last_subscribe_request_tick;
120+
unsigned int _last_subscribe_request_cnt;
119121
String _brokerAddress;
120122
uint16_t _brokerPort;
121123
uint8_t _mqtt_data_buf[MQTT_TRANSMIT_BUFFER_SIZE];

0 commit comments

Comments
 (0)