diff --git a/src/AIoTC_Config.h b/src/AIoTC_Config.h index 26be67d51..6949524d6 100644 --- a/src/AIoTC_Config.h +++ b/src/AIoTC_Config.h @@ -142,6 +142,8 @@ #define AIOT_CONFIG_RECONNECTION_RETRY_DELAY_ms (1000UL) #define AIOT_CONFIG_MAX_RECONNECTION_RETRY_DELAY_ms (32000UL) +#define AIOT_CONFIG_SUBSCRIBE_RETRY_DELAY_ms (1000UL) +#define AIOT_CONFIG_SUBSCRIBE_MAX_RETRY_CNT (10UL) #define AIOT_CONFIG_TIMEOUT_FOR_LASTVALUES_SYNC_ms (30000UL) #define AIOT_CONFIG_LASTVALUES_SYNC_MAX_RETRY_CNT (10UL) diff --git a/src/ArduinoIoTCloudTCP.cpp b/src/ArduinoIoTCloudTCP.cpp index 8bd632ad8..33c87f32c 100644 --- a/src/ArduinoIoTCloudTCP.cpp +++ b/src/ArduinoIoTCloudTCP.cpp @@ -79,6 +79,8 @@ ArduinoIoTCloudTCP::ArduinoIoTCloudTCP() , _last_connection_attempt_cnt{0} , _last_sync_request_tick{0} , _last_sync_request_cnt{0} +, _last_subscribe_request_tick{0} +, _last_subscribe_request_cnt{0} , _mqtt_data_buf{0} , _mqtt_data_len{0} , _mqtt_data_request_retransmit{false} @@ -404,6 +406,27 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SubscribeMqttTopics() return State::ConnectPhy; } + unsigned long const now = millis(); + bool const is_subscribe_retry_delay_expired = (now - _last_subscribe_request_tick) > AIOT_CONFIG_SUBSCRIBE_RETRY_DELAY_ms; + bool const is_first_subscribe_request = (_last_subscribe_request_cnt == 0); + + if (!is_first_subscribe_request && !is_subscribe_retry_delay_expired) + { + return State::SubscribeMqttTopics; + } + + if (_last_subscribe_request_cnt > AIOT_CONFIG_SUBSCRIBE_MAX_RETRY_CNT) + { + _last_subscribe_request_cnt = 0; + _last_subscribe_request_tick = 0; + _mqttClient.stop(); + execCloudEventCallback(ArduinoIoTCloudEvent::DISCONNECT); + return State::ConnectPhy; + } + + _last_subscribe_request_tick = now; + _last_subscribe_request_cnt++; + if (!_mqttClient.subscribe(_dataTopicIn)) { DEBUG_ERROR("ArduinoIoTCloudTCP::%s could not subscribe to %s", __FUNCTION__, _dataTopicIn.c_str()); @@ -427,11 +450,14 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SubscribeMqttTopics() DEBUG_INFO("Connected to Arduino IoT Cloud"); execCloudEventCallback(ArduinoIoTCloudEvent::CONNECT); + _last_subscribe_request_cnt = 0; + _last_subscribe_request_tick = 0; if (_shadowTopicIn != "") return State::RequestLastValues; else return State::Connected; + } ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_RequestLastValues() diff --git a/src/ArduinoIoTCloudTCP.h b/src/ArduinoIoTCloudTCP.h index c36fae4d8..7d91d86d3 100644 --- a/src/ArduinoIoTCloudTCP.h +++ b/src/ArduinoIoTCloudTCP.h @@ -116,6 +116,8 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass unsigned int _last_connection_attempt_cnt; unsigned long _last_sync_request_tick; unsigned int _last_sync_request_cnt; + unsigned long _last_subscribe_request_tick; + unsigned int _last_subscribe_request_cnt; String _brokerAddress; uint16_t _brokerPort; uint8_t _mqtt_data_buf[MQTT_TRANSMIT_BUFFER_SIZE];