@@ -44,7 +44,9 @@ static unsigned long getTime() {
44
44
45
45
ArduinoIoTCloudTCP::ArduinoIoTCloudTCP ():
46
46
_connection(NULL ),
47
-
47
+ _mqtt_data_buf{0 },
48
+ _mqtt_data_len{0 },
49
+ _mqtt_data_request_retransmit{false },
48
50
_sslClient (NULL ),
49
51
#ifdef BOARD_ESP
50
52
_password (" " ),
@@ -182,7 +184,6 @@ int ArduinoIoTCloudTCP::connect() {
182
184
if (_mqttClient->subscribe (_shadowTopicIn) == 0 ) {
183
185
return CONNECT_FAILURE_SUBSCRIBE;
184
186
}
185
-
186
187
_syncStatus = ArduinoIoTSynchronizationStatus::SYNC_STATUS_WAIT_FOR_CLOUD_VALUES;
187
188
_lastSyncRequestTickTime = 0 ;
188
189
}
@@ -201,10 +202,11 @@ void ArduinoIoTCloudTCP::update() {
201
202
// Check if a primitive property wrapper is locally changed
202
203
Thing.updateTimestampOnLocallyChangedProperties ();
203
204
204
- connectionCheck ();
205
+ if ( connectionCheck () != ArduinoIoTConnectionStatus::CONNECTED) return ;
205
206
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 ;
208
210
}
209
211
210
212
// MTTQClient connected!, poll() used to retrieve data from MQTT broker
@@ -235,8 +237,15 @@ void ArduinoIoTCloudTCP::update() {
235
237
void ArduinoIoTCloudTCP::sendPropertiesToCloud () {
236
238
uint8_t data[MQTT_TRANSMIT_BUFFER_SIZE];
237
239
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);
240
249
}
241
250
}
242
251
@@ -337,7 +346,7 @@ void ArduinoIoTCloudTCP::requestLastValue() {
337
346
writeShadowOut (CBOR_REQUEST_LAST_VALUE_MSG, sizeof (CBOR_REQUEST_LAST_VALUE_MSG));
338
347
}
339
348
340
- void ArduinoIoTCloudTCP::connectionCheck () {
349
+ ArduinoIoTConnectionStatus ArduinoIoTCloudTCP::connectionCheck () {
341
350
342
351
if (_connection != NULL ) {
343
352
@@ -348,7 +357,7 @@ void ArduinoIoTCloudTCP::connectionCheck() {
348
357
_iotStatus = ArduinoIoTConnectionStatus::DISCONNECTED;
349
358
printConnectionStatus (_iotStatus);
350
359
}
351
- return ;
360
+ return _iotStatus ;
352
361
}
353
362
}
354
363
@@ -366,6 +375,7 @@ void ArduinoIoTCloudTCP::connectionCheck() {
366
375
case ArduinoIoTConnectionStatus::CONNECTED: {
367
376
if (!_mqttClient->connected ()) {
368
377
_iotStatus = ArduinoIoTConnectionStatus::DISCONNECTED;
378
+ _mqtt_data_request_retransmit = true ;
369
379
printConnectionStatus (_iotStatus);
370
380
execCloudEventCallback (_on_disconnect_event_callback, 0 /* callback_arg - e.g. could be error code casted to void * */ );
371
381
}
@@ -403,6 +413,8 @@ void ArduinoIoTCloudTCP::connectionCheck() {
403
413
}
404
414
break ;
405
415
}
416
+
417
+ return _iotStatus;
406
418
}
407
419
408
420
void ArduinoIoTCloudTCP::printDebugInfo () {
0 commit comments