Skip to content

Commit 3ac2e8a

Browse files
authored
Merge pull request #97 from arduino-libraries/fix-dont-loose-message-on-failed-transmit
Fix - Don't loose messages when MQTT connection was broken on message send
2 parents edbca65 + 1a8bbf7 commit 3ac2e8a

5 files changed

+32
-19
lines changed

src/ArduinoIoTCloud.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class ArduinoIoTCloudClass {
7878

7979
virtual int connected() = 0;
8080

81-
virtual void connectionCheck() = 0;
81+
virtual ArduinoIoTConnectionStatus connectionCheck() = 0;
8282

8383
virtual void printDebugInfo() = 0;
8484

src/ArduinoIoTCloudLPWAN.cpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,7 @@ void ArduinoIoTCloudLPWAN::update() {
6060
// Check if a primitive property wrapper is locally changed
6161
Thing.updateTimestampOnLocallyChangedProperties();
6262

63-
connectionCheck();
64-
65-
if (_iotStatus != ArduinoIoTConnectionStatus::CONNECTED) {
66-
return;
67-
}
63+
if(connectionCheck() != ArduinoIoTConnectionStatus::CONNECTED) return;
6864

6965
if (_connection->available()) {
7066
uint8_t msgBuf[DEFAULT_CBOR_LORA_MSG_SIZE];
@@ -86,7 +82,7 @@ void ArduinoIoTCloudLPWAN::update() {
8682

8783
}
8884

89-
void ArduinoIoTCloudLPWAN::connectionCheck() {
85+
ArduinoIoTConnectionStatus ArduinoIoTCloudLPWAN::connectionCheck() {
9086
if (_connection != NULL) {
9187

9288
_connection->check();
@@ -96,7 +92,7 @@ void ArduinoIoTCloudLPWAN::connectionCheck() {
9692
_iotStatus = ArduinoIoTConnectionStatus::DISCONNECTED;
9793
printConnectionStatus(_iotStatus);
9894
}
99-
return;
95+
return _iotStatus;
10096
}
10197
}
10298

@@ -147,6 +143,8 @@ void ArduinoIoTCloudLPWAN::connectionCheck() {
147143
}
148144
break;
149145
}
146+
147+
return _iotStatus;
150148
}
151149

152150
void ArduinoIoTCloudLPWAN::printDebugInfo() {

src/ArduinoIoTCloudLPWAN.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class ArduinoIoTCloudLPWAN : public ArduinoIoTCloudClass {
3131
bool disconnect();
3232
int connected();
3333
void update();
34-
void connectionCheck();
34+
ArduinoIoTConnectionStatus connectionCheck();
3535
void printDebugInfo();
3636
int begin(LPWANConnectionHandler& connection, bool retry = false);
3737
inline LPWANConnectionHandler* getConnection() {

src/ArduinoIoTCloudTCP.cpp

+21-9
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
}
@@ -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() {
235237
void 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

408420
void ArduinoIoTCloudTCP::printDebugInfo() {

src/ArduinoIoTCloudTCP.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass {
4444
bool disconnect();
4545
int connected();
4646
void update();
47-
void connectionCheck();
47+
ArduinoIoTConnectionStatus connectionCheck();
4848
void printDebugInfo();
4949
#ifdef BOARD_HAS_ECCX08
5050
int begin(TcpIpConnectionHandler & connection, String brokerAddress = DEFAULT_BROKER_ADDRESS_SECURE_AUTH, uint16_t brokerPort = DEFAULT_BROKER_PORT_SECURE_AUTH);
@@ -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)