@@ -44,7 +44,9 @@ static unsigned long getTime() {
4444
4545ArduinoIoTCloudTCP::ArduinoIoTCloudTCP ():
4646 _connection(NULL ),
47-
47+ _mqtt_data_buf{0 },
48+ _mqtt_data_len{0 },
49+ _mqtt_data_request_retransmit{false },
4850 _sslClient (NULL ),
4951 #ifdef BOARD_ESP
5052 _password (" " ),
@@ -182,7 +184,6 @@ int ArduinoIoTCloudTCP::connect() {
182184 if (_mqttClient->subscribe (_shadowTopicIn) == 0 ) {
183185 return CONNECT_FAILURE_SUBSCRIBE;
184186 }
185-
186187 _syncStatus = ArduinoIoTSynchronizationStatus::SYNC_STATUS_WAIT_FOR_CLOUD_VALUES;
187188 _lastSyncRequestTickTime = 0 ;
188189 }
@@ -201,10 +202,11 @@ void ArduinoIoTCloudTCP::update() {
201202 // Check if a primitive property wrapper is locally changed
202203 Thing.updateTimestampOnLocallyChangedProperties ();
203204
204- connectionCheck ();
205+ if ( connectionCheck () != ArduinoIoTConnectionStatus::CONNECTED) return ;
205206
206- if (_iotStatus != ArduinoIoTConnectionStatus::CONNECTED) {
207- return ;
207+ if (_mqtt_data_request_retransmit && (_mqtt_data_len > 0 )) {
208+ writeProperties (_mqtt_data_buf, _mqtt_data_len);
209+ _mqtt_data_request_retransmit = false ;
208210 }
209211
210212 // MTTQClient connected!, poll() used to retrieve data from MQTT broker
@@ -235,8 +237,15 @@ void ArduinoIoTCloudTCP::update() {
235237void ArduinoIoTCloudTCP::sendPropertiesToCloud () {
236238 uint8_t data[MQTT_TRANSMIT_BUFFER_SIZE];
237239 int const length = Thing.encode (data, sizeof (data));
238- if (length > 0 ) {
239- writeProperties (data, length);
240+ if (length > 0 )
241+ {
242+ /* If properties have been encoded store them in the back-up buffer
243+ * in order to allow retransmission in case of failure.
244+ */
245+ _mqtt_data_len = length;
246+ memcpy (_mqtt_data_buf, data, _mqtt_data_len);
247+ /* Transmit the properties to the MQTT broker */
248+ writeProperties (_mqtt_data_buf, _mqtt_data_len);
240249 }
241250}
242251
@@ -337,7 +346,7 @@ void ArduinoIoTCloudTCP::requestLastValue() {
337346 writeShadowOut (CBOR_REQUEST_LAST_VALUE_MSG, sizeof (CBOR_REQUEST_LAST_VALUE_MSG));
338347}
339348
340- void ArduinoIoTCloudTCP::connectionCheck () {
349+ ArduinoIoTConnectionStatus ArduinoIoTCloudTCP::connectionCheck () {
341350
342351 if (_connection != NULL ) {
343352
@@ -348,7 +357,7 @@ void ArduinoIoTCloudTCP::connectionCheck() {
348357 _iotStatus = ArduinoIoTConnectionStatus::DISCONNECTED;
349358 printConnectionStatus (_iotStatus);
350359 }
351- return ;
360+ return _iotStatus ;
352361 }
353362 }
354363
@@ -366,6 +375,7 @@ void ArduinoIoTCloudTCP::connectionCheck() {
366375 case ArduinoIoTConnectionStatus::CONNECTED: {
367376 if (!_mqttClient->connected ()) {
368377 _iotStatus = ArduinoIoTConnectionStatus::DISCONNECTED;
378+ _mqtt_data_request_retransmit = true ;
369379 printConnectionStatus (_iotStatus);
370380 execCloudEventCallback (_on_disconnect_event_callback, 0 /* callback_arg - e.g. could be error code casted to void * */ );
371381 }
@@ -403,6 +413,8 @@ void ArduinoIoTCloudTCP::connectionCheck() {
403413 }
404414 break ;
405415 }
416+
417+ return _iotStatus;
406418}
407419
408420void ArduinoIoTCloudTCP::printDebugInfo () {
0 commit comments