From 8094bbfca2953e1e9147bbc1ef528ab2d63532ca Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Fri, 24 May 2024 14:10:11 +0200 Subject: [PATCH 1/3] implementing non blocking download functions in ota interface --- libraries/OTAUpdate/src/OTAUpdate.cpp | 43 +++++++++++++++++++++++++++ libraries/OTAUpdate/src/OTAUpdate.h | 6 ++++ 2 files changed, 49 insertions(+) diff --git a/libraries/OTAUpdate/src/OTAUpdate.cpp b/libraries/OTAUpdate/src/OTAUpdate.cpp index 50ce5723..b6ff0833 100644 --- a/libraries/OTAUpdate/src/OTAUpdate.cpp +++ b/libraries/OTAUpdate/src/OTAUpdate.cpp @@ -87,6 +87,49 @@ int OTAUpdate::download(const char* url, const char* file_path) { return ret; } +int OTAUpdate::startDownload(const char* url) { + string res = ""; + int ret = -1; + if ( url != nullptr && strlen(url) > 0) { + modem.timeout(EXTENDED_MODEM_TIMEOUT); + if(modem.write(string(PROMPT(_OTA_DOWNLOAD_START)), res, "%s%s\r\n", CMD_WRITE(_OTA_DOWNLOAD_START), url)) { + ret = atoi(res.c_str()); + } else { + ret = static_cast(Error::Modem); + } + } else { + ret = static_cast(Error::Library); + } + modem.timeout(MODEM_TIMEOUT); + return ret; +} + +int OTAUpdate::startDownload(const char* url, const char* file_path) { + string res = ""; + int ret = -1; + + if ( url != nullptr && strlen(url) > 0 && file_path != nullptr && strlen(file_path) >0) { + modem.timeout(EXTENDED_MODEM_TIMEOUT); + if(modem.write(string(PROMPT(_OTA_DOWNLOAD_START)), res, "%s%s,%s\r\n", CMD_WRITE(_OTA_DOWNLOAD_START), url, file_path)) { + ret = atoi(res.c_str()); + } else { + ret = static_cast(Error::Modem); + } + } else { + ret = static_cast(Error::Library); + } + modem.timeout(MODEM_TIMEOUT); + return ret; +} + +int OTAUpdate::downloadProgress() { + string res = ""; + if (modem.write(string(PROMPT(_OTA_DOWNLOAD_PROGRESS)), res, "%s", CMD(_OTA_DOWNLOAD_PROGRESS))) { + return atoi(res.c_str()); + } + return static_cast(Error::Modem); +} + int OTAUpdate::verify() { string res = ""; if (modem.write(string(PROMPT(_OTA_VERIFY)), res, "%s", CMD(_OTA_VERIFY))) { diff --git a/libraries/OTAUpdate/src/OTAUpdate.h b/libraries/OTAUpdate/src/OTAUpdate.h index 9b1b171c..69266a9e 100644 --- a/libraries/OTAUpdate/src/OTAUpdate.h +++ b/libraries/OTAUpdate/src/OTAUpdate.h @@ -42,6 +42,12 @@ class OTAUpdate { int begin(const char* file_path); int download(const char* url); int download(const char* url, const char* file_path); + + int startDownload(const char* url); + int startDownload(const char* url, const char* file_path); + + int downloadProgress(); + int verify(); int update(); int update(const char* file_path); From d8c676b9a0ccf197f7cf22c539c78d721f67cf81 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Fri, 24 May 2024 14:10:58 +0200 Subject: [PATCH 2/3] adding example for ota non blocking download --- .../OTANonBlocking/OTANonBlocking.ino | 136 ++++++++++++++++++ .../examples/OTANonBlocking/arduino_secrets.h | 2 + .../examples/OTANonBlocking/root_ca.h | 106 ++++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 libraries/OTAUpdate/examples/OTANonBlocking/OTANonBlocking.ino create mode 100644 libraries/OTAUpdate/examples/OTANonBlocking/arduino_secrets.h create mode 100644 libraries/OTAUpdate/examples/OTANonBlocking/root_ca.h diff --git a/libraries/OTAUpdate/examples/OTANonBlocking/OTANonBlocking.ino b/libraries/OTAUpdate/examples/OTANonBlocking/OTANonBlocking.ino new file mode 100644 index 00000000..2021c4fe --- /dev/null +++ b/libraries/OTAUpdate/examples/OTANonBlocking/OTANonBlocking.ino @@ -0,0 +1,136 @@ +/* + OTANonBlocking + + This sketch demonstrates how to make an OTA Update on the UNO R4 WiFi. + Upload the sketch and wait for the invasion! + +*/ + + +#include "WiFiS3.h" +#include "OTAUpdate.h" +#include "root_ca.h" +#include "arduino_secrets.h" + +char ssid[] = SECRET_SSID; // your network SSID (name) +char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP) + +int status = WL_IDLE_STATUS; + +OTAUpdate ota; +static char const OTA_FILE_LOCATION[] = "https://downloads.arduino.cc/ota/UNOR4WIFI_Animation.ota"; + +/* -------------------------------------------------------------------------- */ +void setup() { +/* -------------------------------------------------------------------------- */ + //Initialize serial and wait for port to open: + Serial.begin(115200); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the Wi-Fi module: + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with Wi-Fi module failed!"); + // don't continue + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv < WIFI_FIRMWARE_LATEST_VERSION) { + Serial.println("Please upgrade the firmware"); + } + + // attempt to connect to Wi-Fi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid, pass); + + // wait 1 seconds for connection: + delay(1000); + } + + printWiFiStatus(); + + Serial.println("ota.begin()"); + int ret = ota.begin("/update.bin"); + if(ret != OTAUpdate::OTA_ERROR_NONE) { + Serial.println("ota.begin() error: "); + Serial.println((int)ret); + return; + } + + Serial.println("ota.setCACert()"); + ret = ota.setCACert(root_ca); + if(ret != OTAUpdate::OTA_ERROR_NONE) { + Serial.println("ota.setCACert() error: "); + Serial.println((int)ret); + return; + } + + Serial.println("ota.startDownload()"); + int ota_size = ota.startDownload(OTA_FILE_LOCATION, "/update.bin"); + if(ota_size <= 0) { + Serial.println("ota.startDownload() error: "); + Serial.println(ota_size); + return; + } + + Serial.println("ota.downloadProgress()"); + while((ret = ota.downloadProgress()) < ota_size) { + Serial.print("Progress "); + Serial.print(ret); + Serial.print("/"); + Serial.println(ota_size); + delay(100); + } + + if(ret < 0){ + Serial.println("ota.downloadProgress() error: "); + Serial.println((int)ret); + return; + } + + Serial.println("ota.verify()"); + ret = ota.verify(); + if(ret != OTAUpdate::OTA_ERROR_NONE) { + Serial.println("ota.verify() error: "); + Serial.println((int)ret); + return; + } +\ + Serial.println("ota.update()"); + ret = ota.update("/update.bin"); + if(ret != OTAUpdate::OTA_ERROR_NONE) { + Serial.println("ota.update() error: "); + Serial.println((int)ret); + return; + } +} + +/* -------------------------------------------------------------------------- */ +void loop() { +/* -------------------------------------------------------------------------- */ + delay(1000); +} + +/* -------------------------------------------------------------------------- */ +void printWiFiStatus() { +/* -------------------------------------------------------------------------- */ + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your board's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} diff --git a/libraries/OTAUpdate/examples/OTANonBlocking/arduino_secrets.h b/libraries/OTAUpdate/examples/OTANonBlocking/arduino_secrets.h new file mode 100644 index 00000000..0c9fdd55 --- /dev/null +++ b/libraries/OTAUpdate/examples/OTANonBlocking/arduino_secrets.h @@ -0,0 +1,2 @@ +#define SECRET_SSID "" +#define SECRET_PASS "" diff --git a/libraries/OTAUpdate/examples/OTANonBlocking/root_ca.h b/libraries/OTAUpdate/examples/OTANonBlocking/root_ca.h new file mode 100644 index 00000000..57e61f92 --- /dev/null +++ b/libraries/OTAUpdate/examples/OTANonBlocking/root_ca.h @@ -0,0 +1,106 @@ +const char* root_ca = \ +/* GTS Root R1 */ +"-----BEGIN CERTIFICATE-----\n" \ +"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\n" \ +"bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c\n" \ +"-----END CERTIFICATE-----\n" \ +/* GTS Root R2 */ +"-----BEGIN CERTIFICATE-----\n" \ +"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\n" \ +"6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL\n" \ +"-----END CERTIFICATE-----\n" \ +/* GTS Root R3 */ +"-----BEGIN CERTIFICATE-----\n" \ +"MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD\n" \ +"VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG\n" \ +"A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw\n" \ +"WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz\n" \ +"IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi\n" \ +"AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G\n" \ +"jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2\n" \ +"4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\n" \ +"BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7\n" \ +"VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm\n" \ +"ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X\n" \ +"-----END CERTIFICATE-----\n" \ +/* GTS Root R4 */ +"-----BEGIN CERTIFICATE-----\n" \ +"MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD\n" \ +"VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG\n" \ +"A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw\n" \ +"WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz\n" \ +"IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi\n" \ +"AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi\n" \ +"QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR\n" \ +"HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\n" \ +"BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D\n" \ +"9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8\n" \ +"p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD\n" \ +"-----END CERTIFICATE-----\n" \ +/* GlobalSign R4 */ +"-----BEGIN CERTIFICATE-----\n" \ +"MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD\n" \ +"VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh\n" \ +"bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw\n" \ +"MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g\n" \ +"UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT\n" \ +"BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx\n" \ +"uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV\n" \ +"HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/\n" \ +"+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147\n" \ +"bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm\n" \ +"-----END CERTIFICATE-----\n"; From 3bd4ebd1f8a2cb07dd4b96289dafce87158bc7fe Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 28 Nov 2024 09:17:10 +0100 Subject: [PATCH 3/3] OTANonBlocking: add info about minimum required firmware version --- libraries/OTAUpdate/examples/OTANonBlocking/OTANonBlocking.ino | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/OTAUpdate/examples/OTANonBlocking/OTANonBlocking.ino b/libraries/OTAUpdate/examples/OTANonBlocking/OTANonBlocking.ino index 2021c4fe..534f77bb 100644 --- a/libraries/OTAUpdate/examples/OTANonBlocking/OTANonBlocking.ino +++ b/libraries/OTAUpdate/examples/OTANonBlocking/OTANonBlocking.ino @@ -4,6 +4,8 @@ This sketch demonstrates how to make an OTA Update on the UNO R4 WiFi. Upload the sketch and wait for the invasion! + It requires at least version 0.5.0 of USB Wifi bridge firmware + */ @@ -75,6 +77,7 @@ void setup() { if(ota_size <= 0) { Serial.println("ota.startDownload() error: "); Serial.println(ota_size); + Serial.println("Make sure your WiFi firmware version is at least 0.5.0"); return; }