Skip to content

Commit eef2605

Browse files
committed
Add retry delay on topic subscription failures
1 parent 8e3417a commit eef2605

File tree

3 files changed

+48
-18
lines changed

3 files changed

+48
-18
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

+44-18
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,34 +406,58 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SubscribeMqttTopics()
404406
return State::ConnectPhy;
405407
}
406408

407-
if (!_mqttClient.subscribe(_dataTopicIn))
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+
if (is_first_subscribe_request || is_subscribe_retry_delay_expired)
408413
{
409-
DEBUG_ERROR("ArduinoIoTCloudTCP::%s could not subscribe to %s", __FUNCTION__, _dataTopicIn.c_str());
410-
#if !defined(__AVR__)
411-
DEBUG_ERROR("Check your thing configuration, and press the reset button on your board.");
412-
#endif
413-
return State::SubscribeMqttTopics;
414-
}
414+
if (_last_subscribe_request_cnt > AIOT_CONFIG_SUBSCRIBE_MAX_RETRY_CNT)
415+
{
416+
_last_subscribe_request_cnt = 0;
417+
_last_subscribe_request_tick = 0;
418+
_mqttClient.stop();
419+
execCloudEventCallback(ArduinoIoTCloudEvent::DISCONNECT);
420+
return State::ConnectPhy;
421+
}
415422

416-
if (_shadowTopicIn != "")
417-
{
418-
if (!_mqttClient.subscribe(_shadowTopicIn))
423+
_last_subscribe_request_tick = now;
424+
_last_subscribe_request_cnt++;
425+
426+
if (!_mqttClient.subscribe(_dataTopicIn))
419427
{
420-
DEBUG_ERROR("ArduinoIoTCloudTCP::%s could not subscribe to %s", __FUNCTION__, _shadowTopicIn.c_str());
428+
DEBUG_ERROR("ArduinoIoTCloudTCP::%s could not subscribe to %s", __FUNCTION__, _dataTopicIn.c_str());
421429
#if !defined(__AVR__)
422430
DEBUG_ERROR("Check your thing configuration, and press the reset button on your board.");
423431
#endif
424432
return State::SubscribeMqttTopics;
425433
}
426-
}
427434

428-
DEBUG_INFO("Connected to Arduino IoT Cloud");
429-
execCloudEventCallback(ArduinoIoTCloudEvent::CONNECT);
435+
if (_shadowTopicIn != "")
436+
{
437+
if (!_mqttClient.subscribe(_shadowTopicIn))
438+
{
439+
DEBUG_ERROR("ArduinoIoTCloudTCP::%s could not subscribe to %s", __FUNCTION__, _shadowTopicIn.c_str());
440+
#if !defined(__AVR__)
441+
DEBUG_ERROR("Check your thing configuration, and press the reset button on your board.");
442+
#endif
443+
return State::SubscribeMqttTopics;
444+
}
445+
}
430446

431-
if (_shadowTopicIn != "")
432-
return State::RequestLastValues;
433-
else
434-
return State::Connected;
447+
_last_subscribe_request_cnt = 0;
448+
_last_subscribe_request_tick = 0;
449+
450+
DEBUG_INFO("Connected to Arduino IoT Cloud");
451+
execCloudEventCallback(ArduinoIoTCloudEvent::CONNECT);
452+
453+
if (_shadowTopicIn != "")
454+
return State::RequestLastValues;
455+
else
456+
return State::Connected;
457+
458+
}
459+
460+
return State::SubscribeMqttTopics;
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)