@@ -79,6 +79,8 @@ ArduinoIoTCloudTCP::ArduinoIoTCloudTCP()
79
79
, _last_connection_attempt_cnt{0 }
80
80
, _last_sync_request_tick{0 }
81
81
, _last_sync_request_cnt{0 }
82
+ , _last_subscribe_request_tick{0 }
83
+ , _last_subscribe_request_cnt{0 }
82
84
, _mqtt_data_buf{0 }
83
85
, _mqtt_data_len{0 }
84
86
, _mqtt_data_request_retransmit{false }
@@ -404,6 +406,27 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SubscribeMqttTopics()
404
406
return State::ConnectPhy;
405
407
}
406
408
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
+
407
430
if (!_mqttClient.subscribe (_dataTopicIn))
408
431
{
409
432
DEBUG_ERROR (" ArduinoIoTCloudTCP::%s could not subscribe to %s" , __FUNCTION__, _dataTopicIn.c_str ());
@@ -427,11 +450,14 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SubscribeMqttTopics()
427
450
428
451
DEBUG_INFO (" Connected to Arduino IoT Cloud" );
429
452
execCloudEventCallback (ArduinoIoTCloudEvent::CONNECT);
453
+ _last_subscribe_request_cnt = 0 ;
454
+ _last_subscribe_request_tick = 0 ;
430
455
431
456
if (_shadowTopicIn != " " )
432
457
return State::RequestLastValues;
433
458
else
434
459
return State::Connected;
460
+
435
461
}
436
462
437
463
ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_RequestLastValues ()
0 commit comments