@@ -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
437463ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_RequestLastValues ()
0 commit comments