Skip to content

Commit 33bfe4e

Browse files
committed
Use incremental long delay before retry subscribtion when the device is not attached to a thing
1 parent 5db06b8 commit 33bfe4e

File tree

3 files changed

+11
-6
lines changed

3 files changed

+11
-6
lines changed

src/AIoTC_Config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
#define AIOT_CONFIG_MAX_RECONNECTION_RETRY_DELAY_ms (32000UL)
145145
#define AIOT_CONFIG_DEVICE_TOPIC_SUBSCRIBE_RETRY_DELAY_ms (5*1000UL)
146146
#define AIOT_CONFIG_MAX_DEVICE_TOPIC_SUBSCRIBE_RETRY_DELAY_ms (32000UL)
147+
#define AIOT_CONFIG_MAX_DEVICE_TOPIC_ATTACH_RETRY_DELAY_ms (1280000UL)
147148
#define AIOT_CONFIG_TIMEOUT_FOR_LASTVALUES_SYNC_ms (30000UL)
148149
#define AIOT_CONFIG_LASTVALUES_SYNC_MAX_RETRY_CNT (10UL)
149150

src/ArduinoIoTCloudTCP.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_WaitDeviceConfig()
473473

474474
if (millis() > _next_device_subscribe_attempt_tick)
475475
{
476-
/* Configuration not received try to resubscribe */
476+
/* Configuration not received or device not attached to a valid thing. Try to resubscribe */
477477
if (_mqttClient.unsubscribe(_deviceTopicIn))
478478
{
479479
return State::SubscribeDeviceTopic;
@@ -494,7 +494,6 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_CheckDeviceConfig()
494494
/* Unsubscribe from old things topics and go on with a new subsctiption */
495495
_mqttClient.unsubscribe(_shadowTopicIn);
496496
_mqttClient.unsubscribe(_dataTopicIn);
497-
498497
_deviceSubscribedToThing = false;
499498
}
500499

@@ -503,13 +502,16 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_CheckDeviceConfig()
503502
if (deviceNotAttached())
504503
{
505504
/* Configuration received but device not attached. Wait: 40s */
506-
unsigned long subscribe_retry_delay = (1 << _last_device_subscribe_cnt) * AIOT_CONFIG_DEVICE_TOPIC_SUBSCRIBE_RETRY_DELAY_ms * 10;
507-
subscribe_retry_delay = min(subscribe_retry_delay, static_cast<unsigned long>(AIOT_CONFIG_MAX_RECONNECTION_RETRY_DELAY_ms * 10));
508-
_next_device_subscribe_attempt_tick = millis() + subscribe_retry_delay;
509-
_last_device_subscribe_cnt++;
505+
unsigned long attach_retry_delay = (1 << _last_device_attach_cnt) * AIOT_CONFIG_DEVICE_TOPIC_SUBSCRIBE_RETRY_DELAY_ms;
506+
attach_retry_delay = min(attach_retry_delay, static_cast<unsigned long>(AIOT_CONFIG_MAX_DEVICE_TOPIC_ATTACH_RETRY_DELAY_ms));
507+
_next_device_subscribe_attempt_tick = millis() + attach_retry_delay;
508+
_last_device_attach_cnt++;
510509
return State::WaitDeviceConfig;
511510
}
512511

512+
DEBUG_VERBOSE("ArduinoIoTCloudTCP::%s Device attached to a new valid Thing %s", __FUNCTION__, getThingId().c_str());
513+
_last_device_attach_cnt = 0;
514+
513515
return State::SubscribeThingTopics;
514516
}
515517

@@ -547,6 +549,7 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SubscribeThingTopics()
547549
execCloudEventCallback(ArduinoIoTCloudEvent::CONNECT);
548550
_deviceSubscribedToThing = true;
549551

552+
/*Add retry wait time otherwise we are trying to reconnect every 250ms...*/
550553
return State::RequestLastValues;
551554
}
552555

src/ArduinoIoTCloudTCP.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
123123
unsigned int _last_connection_attempt_cnt;
124124
unsigned long _next_device_subscribe_attempt_tick;
125125
unsigned int _last_device_subscribe_cnt;
126+
unsigned int _last_device_attach_cnt;
126127
unsigned long _last_sync_request_tick;
127128
unsigned int _last_sync_request_cnt;
128129
String _brokerAddress;

0 commit comments

Comments
 (0)