Skip to content

Commit c4b0110

Browse files
pennamandreagilardoni
authored andcommitted
ArduinoIoTCloud integration
1 parent eb6311c commit c4b0110

File tree

3 files changed

+58
-183
lines changed

3 files changed

+58
-183
lines changed

Diff for: src/ArduinoIoTCloudDevice.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ ArduinoCloudDevice::State ArduinoCloudDevice::handleConnected() {
133133
}
134134
return State::SendCapabilities;
135135
}
136-
137136
return State::Connected;
138137
}
139138

Diff for: src/ArduinoIoTCloudTCP.cpp

+45-134
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,11 @@
2222
#include <AIoTC_Config.h>
2323

2424
#ifdef HAS_TCP
25-
#include <ArduinoIoTCloudTCP.h>
26-
27-
#if defined(BOARD_HAS_SECRET_KEY)
28-
#include "tls/AIoTCUPCert.h"
29-
#endif
3025

31-
#ifdef BOARD_HAS_ECCX08
32-
#include "tls/BearSSLTrustAnchors.h"
33-
#endif
34-
35-
#if defined(BOARD_HAS_SE050) || defined(BOARD_HAS_SOFTSE)
36-
#include "tls/AIoTCSSCert.h"
37-
#endif
26+
#include <ArduinoIoTCloudTCP.h>
3827

3928
#if OTA_ENABLED
40-
#include "utility/ota/OTA.h"
29+
#include "ota/OTA.h"
4130
#endif
4231

4332
#include <algorithm>
@@ -67,26 +56,16 @@ ArduinoIoTCloudTCP::ArduinoIoTCloudTCP()
6756
, _mqtt_data_buf{0}
6857
, _mqtt_data_len{0}
6958
, _mqtt_data_request_retransmit{false}
70-
#ifdef BOARD_HAS_ECCX08
71-
, _sslClient(nullptr, ArduinoIoTCloudTrustAnchor, ArduinoIoTCloudTrustAnchor_NUM, getTime)
72-
#endif
7359
#ifdef BOARD_HAS_SECRET_KEY
7460
, _password("")
7561
#endif
7662
, _mqttClient{nullptr}
77-
, _deviceTopicOut("")
78-
, _deviceTopicIn("")
7963
, _messageTopicOut("")
8064
, _messageTopicIn("")
8165
, _dataTopicOut("")
8266
, _dataTopicIn("")
8367
#if OTA_ENABLED
84-
, _ota_cap{false}
85-
, _ota_error{static_cast<int>(OTAError::None)}
86-
, _ota_img_sha256{"Inv."}
87-
, _ota_url{""}
88-
, _ota_req{false}
89-
, _ask_user_before_executing_ota{false}
68+
, _ota(&_message_stream)
9069
, _get_ota_confirmation{nullptr}
9170
#endif /* OTA_ENABLED */
9271
{
@@ -107,8 +86,16 @@ int ArduinoIoTCloudTCP::begin(ConnectionHandler & connection, bool const enable_
10786
_brokerPort = brokerPort;
10887
#endif
10988

89+
/* Setup broker TLS client */
90+
_brokerClient.begin(connection);
91+
92+
#if OTA_ENABLED
93+
/* Setup OTA TLS client */
94+
_otaClient.begin(connection);
95+
#endif
96+
11097
/* Setup TimeService */
111-
_time_service.begin(&connection);
98+
_time_service.begin(_connection);
11299

113100
/* Setup retry timers */
114101
_connection_attempt.begin(AIOT_CONFIG_RECONNECTION_RETRY_DELAY_ms, AIOT_CONFIG_MAX_RECONNECTION_RETRY_DELAY_ms);
@@ -148,33 +135,19 @@ int ArduinoIoTCloudTCP::begin(bool const enable_watchdog, String brokerAddress,
148135
DEBUG_ERROR("ArduinoIoTCloudTCP::%s could not read device certificate.", __FUNCTION__);
149136
return 0;
150137
}
151-
_sslClient.setEccSlot(static_cast<int>(SElementArduinoCloudSlot::Key), _cert.bytes(), _cert.length());
138+
_brokerClient.setEccSlot(static_cast<int>(SElementArduinoCloudSlot::Key), _cert.bytes(), _cert.length());
139+
#if OTA_ENABLED
140+
_otaClient.setEccSlot(static_cast<int>(SElementArduinoCloudSlot::Key), _cert.bytes(), _cert.length());
141+
#endif
152142
#endif
153143
#endif
144+
154145
#if defined(BOARD_HAS_SECRET_KEY)
155146
}
156147
#endif
157148

158-
#if defined(BOARD_HAS_OFFLOADED_ECCX08)
159-
160-
#elif defined(BOARD_HAS_ECCX08)
161-
_sslClient.setClient(_connection->getClient());
162-
#elif defined(ARDUINO_PORTENTA_C33)
163-
_sslClient.setClient(_connection->getClient());
164-
_sslClient.setCACert(AIoTSSCert);
165-
#elif defined(ARDUINO_NICLA_VISION)
166-
_sslClient.appendCustomCACert(AIoTSSCert);
167-
#elif defined(ARDUINO_EDGE_CONTROL)
168-
_sslClient.appendCustomCACert(AIoTUPCert);
169-
#elif defined(ARDUINO_UNOR4_WIFI)
170-
171-
#elif defined(ARDUINO_ARCH_ESP32)
172-
_sslClient.setCACertBundle(x509_crt_bundle);
173-
#elif defined(ARDUINO_ARCH_ESP8266)
174-
_sslClient.setInsecure();
175-
#endif
149+
_mqttClient.setClient(_brokerClient);
176150

177-
_mqttClient.setClient(_sslClient);
178151
#ifdef BOARD_HAS_SECRET_KEY
179152
if(_password.length())
180153
{
@@ -187,32 +160,19 @@ int ArduinoIoTCloudTCP::begin(bool const enable_watchdog, String brokerAddress,
187160
_mqttClient.setConnectionTimeout(1500);
188161
_mqttClient.setId(getDeviceId().c_str());
189162

190-
_deviceTopicOut = getTopic_deviceout();
191-
_deviceTopicIn = getTopic_devicein();
192-
_messageTopicIn = getTopic_messagein();
193163
_messageTopicOut = getTopic_messageout();
164+
_messageTopicIn = getTopic_messagein();
194165

195166
_thing.begin();
196167
_device.begin();
197168

198-
#if OTA_ENABLED
199-
Property* p;
200-
p = new CloudWrapperBool(_ota_cap);
201-
addPropertyToContainer(_device.getPropertyContainer(), *p, "OTA_CAP", Permission::Read, -1);
202-
p = new CloudWrapperInt(_ota_error);
203-
addPropertyToContainer(_device.getPropertyContainer(), *p, "OTA_ERROR", Permission::Read, -1);
204-
p = new CloudWrapperString(_ota_img_sha256);
205-
addPropertyToContainer(_device.getPropertyContainer(), *p, "OTA_SHA256", Permission::Read, -1);
206-
p = new CloudWrapperString(_ota_url);
207-
addPropertyToContainer(_device.getPropertyContainer(), *p, "OTA_URL", Permission::ReadWrite, -1);
208-
p = new CloudWrapperBool(_ota_req);
209-
addPropertyToContainer(_device.getPropertyContainer(), *p, "OTA_REQ", Permission::ReadWrite, -1);
210-
211-
_ota_cap = OTA::isCapable();
212-
213-
_ota_img_sha256 = OTA::getImageSHA256();
214-
DEBUG_VERBOSE("SHA256: HASH(%d) = %s", strlen(_ota_img_sha256.c_str()), _ota_img_sha256.c_str());
215-
#endif // OTA_ENABLED
169+
#if OTA_ENABLED && !defined(OFFLOADED_DOWNLOAD)
170+
_ota.setClient(&_otaClient);
171+
#endif // OTA_ENABLED && !defined(OFFLOADED_DOWNLOAD)
172+
173+
#if OTA_ENABLED && defined(OTA_BASIC_AUTH)
174+
_ota.setAuthentication(getDeviceId().c_str(), _password.c_str());
175+
#endif // OTA_ENABLED && !defined(OFFLOADED_DOWNLOAD) && defined(OTA_BASIC_AUTH)
216176

217177
#ifdef BOARD_HAS_OFFLOADED_ECCX08
218178
if (String(WiFi.firmwareVersion()) < String("1.4.4")) {
@@ -323,9 +283,6 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_ConnectMqttBroker()
323283
/* Subscribe to message topic to receive commands */
324284
_mqttClient.subscribe(_messageTopicIn);
325285

326-
/* Temoporarly subscribe to device topic to receive OTA properties */
327-
_mqttClient.subscribe(_deviceTopicIn);
328-
329286
/* Reconfigure timers for next state */
330287
_connection_attempt.begin(AIOT_CONFIG_DEVICE_TOPIC_SUBSCRIBE_RETRY_DELAY_ms, AIOT_CONFIG_MAX_DEVICE_TOPIC_SUBSCRIBE_RETRY_DELAY_ms);
331288

@@ -360,50 +317,24 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_Connected()
360317
/* Call CloudDevice process to get configuration */
361318
_device.update();
362319

363-
if (_device.isAttached()) {
364-
/* Call CloudThing process to synchronize properties */
365-
_thing.update();
366-
}
367-
368-
#if OTA_ENABLED
369-
if (_device.connected()) {
370-
handle_OTARequest();
320+
#if OTA_ENABLED
321+
if(_get_ota_confirmation != nullptr &&
322+
_ota.getState() == OTACloudProcessInterface::State::OtaAvailable &&
323+
_get_ota_confirmation()) {
324+
_ota.approveOta();
371325
}
372-
#endif /* OTA_ENABLED */
373326

374-
return State::Connected;
375-
}
327+
_ota.update();
328+
#endif // OTA_ENABLED
376329

377-
#if OTA_ENABLED
378-
void ArduinoIoTCloudTCP::handle_OTARequest() {
379-
/* Request a OTA download if the hidden property
380-
* OTA request has been set.
381-
*/
382330

383-
if (_ota_req)
384-
{
385-
bool const ota_execution_allowed_by_user = (_get_ota_confirmation != nullptr && _get_ota_confirmation());
386-
bool const perform_ota_now = ota_execution_allowed_by_user || !_ask_user_before_executing_ota;
387-
if (perform_ota_now) {
388-
/* Clear the error flag. */
389-
_ota_error = static_cast<int>(OTAError::None);
390-
/* Clear the request flag. */
391-
_ota_req = false;
392-
/* Transmit the cleared request flags to the cloud. */
393-
sendDevicePropertyToCloud("OTA_REQ");
394-
/* Call member function to handle OTA request. */
395-
_ota_error = OTA::onRequest(_ota_url, _connection->getInterface());
396-
/* If something fails send the OTA error to the cloud */
397-
sendDevicePropertyToCloud("OTA_ERROR");
398-
}
331+
if (_device.isAttached()) {
332+
/* Call CloudThing process to synchronize properties */
333+
_thing.update();
399334
}
400335

401-
/* Check if we have received the OTA_URL property and provide
402-
* echo to the cloud.
403-
*/
404-
sendDevicePropertyToCloud("OTA_URL");
336+
return State::Connected;
405337
}
406-
#endif /* OTA_ENABLED */
407338

408339
ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_Disconnect()
409340
{
@@ -441,11 +372,6 @@ void ArduinoIoTCloudTCP::handleMessage(int length)
441372
bytes[i] = _mqttClient.read();
442373
}
443374

444-
/* Topic for OTA properties and device configuration */
445-
if (_deviceTopicIn == topic) {
446-
CBORDecoder::decode(_device.getPropertyContainer(), (uint8_t*)bytes, length);
447-
}
448-
449375
/* Topic for user input data */
450376
if (_dataTopicIn == topic) {
451377
CBORDecoder::decode(_thing.getPropertyContainer(), (uint8_t*)bytes, length);
@@ -505,6 +431,14 @@ void ArduinoIoTCloudTCP::handleMessage(int length)
505431
}
506432
break;
507433

434+
#if OTA_ENABLED
435+
case CommandId::OtaUpdateCmdDownId:
436+
{
437+
DEBUG_VERBOSE("ArduinoIoTCloudTCP::%s [%d] ota update received", __FUNCTION__, millis());
438+
_ota.handleMessage((Message*)&command);
439+
}
440+
#endif
441+
508442
default:
509443
break;
510444
}
@@ -525,14 +459,6 @@ void ArduinoIoTCloudTCP::sendMessage(Message * msg)
525459
_thing.getPropertyContainerIndex());
526460
break;
527461

528-
#if OTA_ENABLED
529-
case DeviceBeginCmdId:
530-
sendDevicePropertyToCloud("OTA_CAP");
531-
sendDevicePropertyToCloud("OTA_ERROR");
532-
sendDevicePropertyToCloud("OTA_SHA256");
533-
break;
534-
#endif
535-
536462
default:
537463
break;
538464
}
@@ -565,21 +491,6 @@ void ArduinoIoTCloudTCP::sendPropertyContainerToCloud(String const topic, Proper
565491
}
566492
}
567493

568-
#if OTA_ENABLED
569-
void ArduinoIoTCloudTCP::sendDevicePropertyToCloud(String const name)
570-
{
571-
PropertyContainer temp_device_property_container;
572-
unsigned int last_device_property_index = 0;
573-
574-
Property* p = getProperty(this->_device.getPropertyContainer(), name);
575-
if(p != nullptr)
576-
{
577-
addPropertyToContainer(temp_device_property_container, *p, p->name(), p->isWriteableByCloud() ? Permission::ReadWrite : Permission::Read);
578-
sendPropertyContainerToCloud(_deviceTopicOut, temp_device_property_container, last_device_property_index);
579-
}
580-
}
581-
#endif
582-
583494
void ArduinoIoTCloudTCP::attachThing()
584495
{
585496

Diff for: src/ArduinoIoTCloudTCP.h

+13-48
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,11 @@
3636
#endif
3737
#endif
3838

39-
#if defined(BOARD_HAS_OFFLOADED_ECCX08)
40-
#include "WiFiSSLClient.h"
41-
#elif defined(BOARD_HAS_ECCX08)
42-
#include "tls/BearSSLClient.h"
43-
#elif defined(ARDUINO_PORTENTA_C33)
44-
#include <SSLClient.h>
45-
#elif defined(ARDUINO_NICLA_VISION)
46-
#include <WiFiSSLSE050Client.h>
47-
#elif defined(ARDUINO_EDGE_CONTROL)
48-
#include <GSMSSLClient.h>
49-
#elif defined(ARDUINO_UNOR4_WIFI)
50-
#include <WiFiSSLClient.h>
51-
#elif defined(BOARD_ESP)
52-
#include <WiFiClientSecure.h>
53-
#endif
39+
#include <tls/utility/TLSClientMqtt.h>
40+
#include <tls/utility/TLSClientOta.h>
5441

5542
#if OTA_ENABLED
56-
#include <utility/ota/OTA.h>
43+
#include <ota/OTA.h>
5744
#endif
5845

5946
#include "cbor/MessageDecoder.h"
@@ -107,9 +94,13 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
10794
*/
10895
void onOTARequestCb(onOTARequestCallbackFunc cb) {
10996
_get_ota_confirmation = cb;
110-
_ask_user_before_executing_ota = true;
97+
98+
if(_get_ota_confirmation) {
99+
_ota.setOtaPolicies(OTACloudProcessInterface::ApprovalRequired);
100+
} else {
101+
_ota.setOtaPolicies(OTACloudProcessInterface::None);
102+
}
111103
}
112-
void handle_OTARequest();
113104
#endif
114105

115106
private:
@@ -147,44 +138,21 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
147138
#endif
148139
#endif
149140

150-
#if defined(BOARD_HAS_OFFLOADED_ECCX08)
151-
WiFiBearSSLClient _sslClient;
152-
#elif defined(BOARD_HAS_ECCX08)
153-
BearSSLClient _sslClient;
154-
#elif defined(ARDUINO_PORTENTA_C33)
155-
SSLClient _sslClient;
156-
#elif defined(ARDUINO_NICLA_VISION)
157-
WiFiSSLSE050Client _sslClient;
158-
#elif defined(ARDUINO_EDGE_CONTROL)
159-
GSMSSLClient _sslClient;
160-
#elif defined(ARDUINO_UNOR4_WIFI)
161-
WiFiSSLClient _sslClient;
162-
#elif defined(BOARD_ESP)
163-
WiFiClientSecure _sslClient;
164-
#endif
165-
141+
TLSClientMqtt _brokerClient;
166142
MqttClient _mqttClient;
167143

168-
String _deviceTopicOut;
169-
String _deviceTopicIn;
170144
String _messageTopicOut;
171145
String _messageTopicIn;
172146
String _dataTopicOut;
173147
String _dataTopicIn;
174148

149+
175150
#if OTA_ENABLED
176-
bool _ota_cap;
177-
int _ota_error;
178-
String _ota_img_sha256;
179-
String _ota_url;
180-
bool _ota_req;
181-
bool _ask_user_before_executing_ota;
151+
TLSClientOta _otaClient;
152+
ArduinoCloudOTA _ota;
182153
onOTARequestCallbackFunc _get_ota_confirmation;
183154
#endif /* OTA_ENABLED */
184155

185-
inline String getTopic_deviceout() { return String("/a/d/" + getDeviceId() + "/e/o");}
186-
inline String getTopic_devicein () { return String("/a/d/" + getDeviceId() + "/e/i");}
187-
188156
inline String getTopic_messageout() { return String("/a/d/" + getDeviceId() + "/c/up");}
189157
inline String getTopic_messagein () { return String("/a/d/" + getDeviceId() + "/c/dw");}
190158

@@ -206,9 +174,6 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
206174
void detachThing();
207175
int write(String const topic, byte const data[], int const length);
208176

209-
#if OTA_ENABLED
210-
void sendDevicePropertyToCloud(String const name);
211-
#endif
212177
};
213178

214179
/******************************************************************************

0 commit comments

Comments
 (0)