Skip to content

Commit 1a8bbf7

Browse files
committed
Trigger retransmission in case of a disconnect
The TCP load balancer of the Arduino IoT Cloud terminates a TCP connnection after 350 seconds. Unfortunately this termination is only detected after transmitting the next data set to the Arduino IoT Cloud. This has the unfortunate side effect that the data set sent to the cloud is lost. This change buffers every transmission to the server and requests a retransmission in case of loosing the connection. Note: This can only happen if the keep-alive interval is set to a value > 350 seconds
1 parent 873f116 commit 1a8bbf7

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

src/ArduinoIoTCloudTCP.cpp

+18-4
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ static unsigned long getTime() {
4444

4545
ArduinoIoTCloudTCP::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
}
@@ -203,6 +204,11 @@ void ArduinoIoTCloudTCP::update() {
203204

204205
if(connectionCheck() != ArduinoIoTConnectionStatus::CONNECTED) return;
205206

207+
if(_mqtt_data_request_retransmit && (_mqtt_data_len > 0)) {
208+
writeProperties(_mqtt_data_buf, _mqtt_data_len);
209+
_mqtt_data_request_retransmit = false;
210+
}
211+
206212
// MTTQClient connected!, poll() used to retrieve data from MQTT broker
207213
_mqttClient->poll();
208214

@@ -231,8 +237,15 @@ void ArduinoIoTCloudTCP::update() {
231237
void ArduinoIoTCloudTCP::sendPropertiesToCloud() {
232238
uint8_t data[MQTT_TRANSMIT_BUFFER_SIZE];
233239
int const length = Thing.encode(data, sizeof(data));
234-
if (length > 0) {
235-
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);
236249
}
237250
}
238251

@@ -362,6 +375,7 @@ ArduinoIoTConnectionStatus ArduinoIoTCloudTCP::connectionCheck() {
362375
case ArduinoIoTConnectionStatus::CONNECTED: {
363376
if (!_mqttClient->connected()) {
364377
_iotStatus = ArduinoIoTConnectionStatus::DISCONNECTED;
378+
_mqtt_data_request_retransmit = true;
365379
printConnectionStatus(_iotStatus);
366380
execCloudEventCallback(_on_disconnect_event_callback, 0 /* callback_arg - e.g. could be error code casted to void * */);
367381
}

src/ArduinoIoTCloudTCP.h

+3
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass {
9595
TcpIpConnectionHandler * _connection;
9696
String _brokerAddress;
9797
uint16_t _brokerPort;
98+
uint8_t _mqtt_data_buf[MQTT_TRANSMIT_BUFFER_SIZE];
99+
int _mqtt_data_len;
100+
bool _mqtt_data_request_retransmit;
98101

99102
#ifdef BOARD_HAS_ECCX08
100103
BearSSLClient* _sslClient;

0 commit comments

Comments
 (0)