From 43e80b30a9c9f91cc96166f2ac46369d0f1a310f Mon Sep 17 00:00:00 2001 From: fabik111 Date: Wed, 3 Sep 2025 09:49:17 +0200 Subject: [PATCH 1/8] add parse date function instead of sscanf --- .../utility/Provisioning_2.0/CSRHandler.cpp | 38 ++++++++++++++++++- .../utility/Provisioning_2.0/CSRHandler.h | 1 + 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/examples/utility/Provisioning_2.0/CSRHandler.cpp b/examples/utility/Provisioning_2.0/CSRHandler.cpp index 1a6101e4b..8235db14a 100644 --- a/examples/utility/Provisioning_2.0/CSRHandler.cpp +++ b/examples/utility/Provisioning_2.0/CSRHandler.cpp @@ -193,6 +193,42 @@ uint32_t CSRHandlerClass::getTimestamp() { return ts; } +bool CSRHandlerClass::parseDateFromStr(char *str) { + char *tok[3]; + int i = 1; + tok[0] = strtok(str, "-"); + for (; i < 3; i++) { + char *t = strtok(NULL, "-"); + if(t == NULL){ + break; + } + tok[i] = t; + } + if (i < 3) { + return false; + } + + char *day = strtok(tok[2], "T"); + char *time = strtok(NULL, "T"); + + if(time == NULL){ + return false; + } + + char *hour = strtok(time, ":"); + + if(strlen(tok[0]) != 4 || strlen(tok[1]) != 2 || strlen(day) != 2 || strlen(hour) != 2){ + return false; + } + + _issueYear = atoi(tok[0]); + _issueMonth = atoi(tok[1]); + _issueDay = atoi(day); + _issueHour = atoi(hour); + + return true; +} + CSRHandlerClass::CSRHandlerStates CSRHandlerClass::handleBuildCSR() { if (!_certForCSR) { _certForCSR = new ECP256Certificate(); @@ -296,7 +332,7 @@ CSRHandlerClass::CSRHandlerStates CSRHandlerClass::handleParseResponse() { if(i < 6 || strlen(token[0]) != 36 || strlen(token[1]) != 40 || strlen(token[2]) < 10 || strlen(token[3]) != 32 || strlen(token[4]) != 64 || strlen(token[5]) != 64 - || sscanf(token[2], "%4d-%2d-%2dT%2d", &_issueYear, &_issueMonth, &_issueDay, &_issueHour) != 4){ + || !parseDateFromStr(token[2])){ updateNextRequestAt(); DEBUG_ERROR("CSRH::%s Error parsing response, retrying in %d ms", __FUNCTION__, _nextRequestAt - millis()); return CSRHandlerStates::REQUEST_SIGNATURE; diff --git a/examples/utility/Provisioning_2.0/CSRHandler.h b/examples/utility/Provisioning_2.0/CSRHandler.h index ae5956b7e..dcc2bc479 100644 --- a/examples/utility/Provisioning_2.0/CSRHandler.h +++ b/examples/utility/Provisioning_2.0/CSRHandler.h @@ -63,6 +63,7 @@ class CSRHandlerClass { uint32_t jitter(uint32_t base = JITTER_BASE, uint32_t max = JITTER_MAX); bool postRequest(const char *url, String &postData); uint32_t getTimestamp(); + bool parseDateFromStr(char *str); CSRHandlerStates handleBuildCSR(); CSRHandlerStates handleRequestSignature(); CSRHandlerStates handleWaitingResponse(); From e3337590ba3cea4eddd862e78bbdcc7a698a70bf Mon Sep 17 00:00:00 2001 From: fabik111 Date: Wed, 3 Sep 2025 09:49:45 +0200 Subject: [PATCH 2/8] add networkconfigurator include --- examples/utility/Provisioning_2.0/thingProperties.h | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/utility/Provisioning_2.0/thingProperties.h b/examples/utility/Provisioning_2.0/thingProperties.h index 7f51fa6ca..9d2a6cdd7 100644 --- a/examples/utility/Provisioning_2.0/thingProperties.h +++ b/examples/utility/Provisioning_2.0/thingProperties.h @@ -12,6 +12,7 @@ #include #include #include +#include "Arduino_NetworkConfigurator.h" #include "configuratorAgents/agents/BLEAgent.h" #include "configuratorAgents/agents/SerialAgent.h" From 201101b1574425e4cfbcb15f9096b0c3105bf0f0 Mon Sep 17 00:00:00 2001 From: fabik111 Date: Wed, 3 Sep 2025 09:50:45 +0200 Subject: [PATCH 3/8] enable NetworkConfigurator for nina boards --- src/AIoTC_Config.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/AIoTC_Config.h b/src/AIoTC_Config.h index b0fba96a3..bd1187765 100644 --- a/src/AIoTC_Config.h +++ b/src/AIoTC_Config.h @@ -155,7 +155,8 @@ #endif #if defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_OPTA) || defined(ARDUINO_GIGA) \ - || defined(ARDUINO_UNOR4_WIFI) || defined(ARDUINO_PORTENTA_C33) + || defined(ARDUINO_UNOR4_WIFI) || defined(ARDUINO_PORTENTA_C33) || defined(ARDUINO_NANO_RP2040_CONNECT) \ + || defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) #define NETWORK_CONFIGURATOR_ENABLED (1) #else #define NETWORK_CONFIGURATOR_ENABLED (0) From 440f9efe502cae469d6a2ef366460d1768344e06 Mon Sep 17 00:00:00 2001 From: fabik111 Date: Wed, 3 Sep 2025 09:51:36 +0200 Subject: [PATCH 4/8] Provisioning sketch version 0.4.0 --- examples/utility/Provisioning_2.0/Provisioning_2.0.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/utility/Provisioning_2.0/Provisioning_2.0.ino b/examples/utility/Provisioning_2.0/Provisioning_2.0.ino index 7f8f44ceb..eb87b4b99 100644 --- a/examples/utility/Provisioning_2.0/Provisioning_2.0.ino +++ b/examples/utility/Provisioning_2.0/Provisioning_2.0.ino @@ -15,7 +15,7 @@ #include #include "utility/LEDFeedback.h" -const char *SKETCH_VERSION = "0.3.3"; +const char *SKETCH_VERSION = "0.4.0"; enum class DeviceState { HARDWARE_CHECK, From c9af6524dc6d615aa5bfde6999c17fccdc59ca3f Mon Sep 17 00:00:00 2001 From: fabik111 Date: Wed, 17 Sep 2025 11:59:12 +0200 Subject: [PATCH 5/8] fix for rp2040 crashes when getting board UHWID --- examples/utility/Provisioning_2.0/SecretsHelper.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/examples/utility/Provisioning_2.0/SecretsHelper.h b/examples/utility/Provisioning_2.0/SecretsHelper.h index bdb6354d1..fba33e25b 100644 --- a/examples/utility/Provisioning_2.0/SecretsHelper.h +++ b/examples/utility/Provisioning_2.0/SecretsHelper.h @@ -14,6 +14,11 @@ inline String GetUHWID() { UniqueHWId Id; if (Id.begin()) { +#ifdef ARDUINO_NANO_RP2040_CONNECT + /*Delay added for avoiding device crashes + on Nano RP2040 Connect when reading the UHWID */ + delay(100); +#endif return Id.get(); } return ""; From a2609c7b0d73ee70329124e0edb8b28df64dff15 Mon Sep 17 00:00:00 2001 From: fabik111 Date: Wed, 17 Sep 2025 12:04:01 +0200 Subject: [PATCH 6/8] Provisioning sketch version 0.4.1 --- examples/utility/Provisioning_2.0/Provisioning_2.0.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/utility/Provisioning_2.0/Provisioning_2.0.ino b/examples/utility/Provisioning_2.0/Provisioning_2.0.ino index eb87b4b99..d0d8bd357 100644 --- a/examples/utility/Provisioning_2.0/Provisioning_2.0.ino +++ b/examples/utility/Provisioning_2.0/Provisioning_2.0.ino @@ -15,7 +15,7 @@ #include #include "utility/LEDFeedback.h" -const char *SKETCH_VERSION = "0.4.0"; +const char *SKETCH_VERSION = "0.4.1"; enum class DeviceState { HARDWARE_CHECK, From 0eb8c3bee1d1e00d8624366992e9e3ebee9b2028 Mon Sep 17 00:00:00 2001 From: fabik111 Date: Fri, 19 Sep 2025 12:04:37 +0200 Subject: [PATCH 7/8] add factory led test --- .../utility/Provisioning_2.0/FactoryTester.h | 80 +++++++++++++++++++ .../Provisioning_2.0/Provisioning_2.0.ino | 7 +- 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 examples/utility/Provisioning_2.0/FactoryTester.h diff --git a/examples/utility/Provisioning_2.0/FactoryTester.h b/examples/utility/Provisioning_2.0/FactoryTester.h new file mode 100644 index 000000000..c29e152ba --- /dev/null +++ b/examples/utility/Provisioning_2.0/FactoryTester.h @@ -0,0 +1,80 @@ +/* + Copyright (c) 2025 Arduino SA + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#pragma once +#include +#include + +#ifdef BOARD_USE_NINA +#include "WiFiNINA.h" +#include "utility/wifi_drv.h" +#endif + +inline void LedFactoryTest() { +#if defined(BOARD_HAS_RGB) +#if defined(BOARD_USE_NINA) + // MKR WiFi 1010, RP2040 Connect + WiFiDrv::pinMode(GREEN_LED, OUTPUT); + WiFiDrv::digitalWrite(GREEN_LED, LED_OFF); + WiFiDrv::pinMode(BLUE_LED, OUTPUT); + WiFiDrv::digitalWrite(BLUE_LED, LED_OFF); + WiFiDrv::pinMode(RED_LED, OUTPUT); + WiFiDrv::digitalWrite(RED_LED, LED_OFF); + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, LED_OFF); + + for(uint8_t i = 0; i<2; i++){ + digitalWrite(LED_BUILTIN, LED_ON); + WiFiDrv::digitalWrite(RED_LED, LED_ON); + delay(300); + digitalWrite(LED_BUILTIN, LED_OFF); + WiFiDrv::digitalWrite(RED_LED, LED_OFF); + WiFiDrv::digitalWrite(GREEN_LED, LED_ON); + delay(300); + digitalWrite(LED_BUILTIN, LED_ON); + WiFiDrv::digitalWrite(GREEN_LED, LED_OFF); + WiFiDrv::digitalWrite(BLUE_LED, LED_ON); + delay(300); + digitalWrite(LED_BUILTIN, LED_OFF); + WiFiDrv::digitalWrite(BLUE_LED, LED_OFF); + delay(200); + } +#else + // Portenta H7, Giga, Nicla Vision, Portenta C33 + pinMode(GREEN_LED, OUTPUT); + digitalWrite(GREEN_LED, LED_OFF); + pinMode(RED_LED, OUTPUT); + digitalWrite(RED_LED, LED_OFF); + pinMode(BLUE_LED, OUTPUT); + digitalWrite(BLUE_LED, LED_OFF); + for(uint8_t i = 0; i<2; i++){ + digitalWrite(RED_LED, LED_ON); + delay(300); + digitalWrite(RED_LED, LED_OFF); + digitalWrite(GREEN_LED, LED_ON); + delay(300); + digitalWrite(GREEN_LED, LED_OFF); + digitalWrite(BLUE_LED, LED_ON); + delay(300); + digitalWrite(BLUE_LED, LED_OFF); + delay(200); + } +#endif +#else // Nano 33 IoT + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, LED_OFF); + uint32_t start = millis(); + while(millis() - start < 2000) { + digitalWrite(LED_BUILTIN, LED_ON); + delay(300); + digitalWrite(LED_BUILTIN, LED_OFF); + delay(300); + } +#endif + +} diff --git a/examples/utility/Provisioning_2.0/Provisioning_2.0.ino b/examples/utility/Provisioning_2.0/Provisioning_2.0.ino index d0d8bd357..997e4b22c 100644 --- a/examples/utility/Provisioning_2.0/Provisioning_2.0.ino +++ b/examples/utility/Provisioning_2.0/Provisioning_2.0.ino @@ -14,7 +14,7 @@ #include #include #include "utility/LEDFeedback.h" - +#include "FactoryTester.h" const char *SKETCH_VERSION = "0.4.1"; enum class DeviceState { @@ -57,6 +57,11 @@ void setup() { setDebugMessageLevel(4); initProperties(); + + #if !defined(ARDUINO_OPTA) && !defined(ARDUINO_UNOR4_WIFI) + LedFactoryTest(); + #endif + AgentsManagerClass::getInstance().begin(); LEDFeedbackClass::getInstance().begin(); DEBUG_INFO("Starting Provisioning version %s", SKETCH_VERSION); From 29edf75b650c5cb694f482f12917a49582a4a648 Mon Sep 17 00:00:00 2001 From: fabik111 Date: Fri, 19 Sep 2025 12:05:40 +0200 Subject: [PATCH 8/8] Provisioning sketch version 0.5.0 --- examples/utility/Provisioning_2.0/Provisioning_2.0.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/utility/Provisioning_2.0/Provisioning_2.0.ino b/examples/utility/Provisioning_2.0/Provisioning_2.0.ino index 997e4b22c..c06e3d087 100644 --- a/examples/utility/Provisioning_2.0/Provisioning_2.0.ino +++ b/examples/utility/Provisioning_2.0/Provisioning_2.0.ino @@ -15,7 +15,7 @@ #include #include "utility/LEDFeedback.h" #include "FactoryTester.h" -const char *SKETCH_VERSION = "0.4.1"; +const char *SKETCH_VERSION = "0.5.0"; enum class DeviceState { HARDWARE_CHECK,