From 8fe68c169c0e247fcca6a8a63bc228180dbc18c7 Mon Sep 17 00:00:00 2001 From: fabik111 Date: Thu, 10 Apr 2025 17:57:34 +0200 Subject: [PATCH] add GET_PROVISIONING_SKETCH_VERSION and GET_NET_CONF_LIB_VERSION commands --- extras/test/CMakeLists.txt | 8 +-- .../src/test_provisioning_command_decode.cpp | 1 + .../src/test_provisioning_command_encode.cpp | 56 +++++++++++++++++++ src/ANetworkConfigurator_Config.h | 12 +++- src/Arduino_NetworkConfigurator.cpp | 21 +++++-- src/Arduino_NetworkConfigurator.h | 5 +- src/ConfiguratorAgents/AgentsManager.cpp | 26 +++++---- src/ConfiguratorAgents/AgentsManager.h | 6 +- src/ConfiguratorAgents/MessagesDefinitions.h | 20 ++++--- .../BoardConfigurationProtocol.cpp | 24 ++++++-- .../BoardConfigurationProtocol.h | 2 +- .../CBORAdapter.cpp | 28 ++++++++++ .../BoardConfigurationProtocol/CBORAdapter.h | 4 ++ .../cbor/CBORInstances.h | 2 + .../cbor/Encoder.cpp | 38 +++++++++++++ .../BoardConfigurationProtocol/cbor/Encoder.h | 16 ++++++ .../cbor/ProvisioningMessage.h | 18 ++++++ 17 files changed, 249 insertions(+), 38 deletions(-) diff --git a/extras/test/CMakeLists.txt b/extras/test/CMakeLists.txt index 806b2e3..1393140 100644 --- a/extras/test/CMakeLists.txt +++ b/extras/test/CMakeLists.txt @@ -16,8 +16,8 @@ FetchContent_Declare( FetchContent_Declare( cloudutils - GIT_REPOSITORY https://github.com/andreagilardoni/Arduino_CloudUtils.git - GIT_TAG cbor-messages + GIT_REPOSITORY https://github.com/arduino-libraries/Arduino_CloudUtils.git + GIT_TAG main CONFIGURE_COMMAND "" BUILD_COMMAND "" ) @@ -125,12 +125,12 @@ set(TEST_TARGET_SRCS ########################################################################## -add_compile_definitions(BOARD_HAS_LORA BOARD_HAS_CATM1_NBIOT BOARD_HAS_WIFI BOARD_HAS_ETHERNET BOARD_HAS_CELLULAR BOARD_HAS_NB BOARD_HAS_GSM) +add_compile_definitions(CI_TEST BOARD_HAS_LORA BOARD_HAS_CATM1_NBIOT BOARD_HAS_WIFI BOARD_HAS_ETHERNET BOARD_HAS_CELLULAR BOARD_HAS_NB BOARD_HAS_GSM) add_compile_options(-Wextra -Werror) add_compile_options(-Wno-cast-function-type) set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "--coverage") -set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "--coverage -Wno-deprecated-copy") +set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "--coverage -Wno-deprecated-copy -Wno-missing-field-initializers") ########################################################################## diff --git a/extras/test/src/test_provisioning_command_decode.cpp b/extras/test/src/test_provisioning_command_decode.cpp index 0325c02..8571697 100644 --- a/extras/test/src/test_provisioning_command_decode.cpp +++ b/extras/test/src/test_provisioning_command_decode.cpp @@ -14,6 +14,7 @@ #include #include #include "../../src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBOR.h" + #include "../../src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBORInstances.h" #include /****************************************************************************** diff --git a/extras/test/src/test_provisioning_command_encode.cpp b/extras/test/src/test_provisioning_command_encode.cpp index 9de79dc..28ef8f5 100644 --- a/extras/test/src/test_provisioning_command_encode.cpp +++ b/extras/test/src/test_provisioning_command_encode.cpp @@ -12,6 +12,7 @@ #include #include #include "../../src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBOR.h" + #include "../../src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBORInstances.h" /****************************************************************************** TEST CODE @@ -233,4 +234,59 @@ REQUIRE(memcmp(buffer, expected_result, sizeof(expected_result)) == 0); } } + + WHEN("Encode a message with provisioning sketch version ") + { + ProvSketchVersionProvisioningMessage command; + command.c.id = ProvisioningMessageId::ProvSketchVersionProvisioningMessageId; + command.provSketchVersion = "1.6.0"; + uint8_t buffer[512]; + size_t bytes_encoded = sizeof(buffer); + + CBORMessageEncoder encoder; + MessageEncoder::Status err = encoder.encode((Message*)&command, buffer, bytes_encoded); + + uint8_t expected_result[] = { + 0xda, 0x00, 0x01, 0x20, 0x15, 0x81, 0x65, 0x31, 0x2E, 0x36, 0x2E, 0x30 + }; + + // Test the encoding is + // DA 00012015 # tag(73749) + // 81 # array(1) + // 65 # text(5) + // 312E362E30 # "1.6.0" + THEN("The encoding is successful") { + REQUIRE(err == MessageEncoder::Status::Complete); + REQUIRE(bytes_encoded == sizeof(expected_result)); + REQUIRE(memcmp(buffer, expected_result, sizeof(expected_result)) == 0); + } + } + + WHEN("Encode a message with provisioning Network Configurator lib version ") + { + NetConfigLibVersionProvisioningMessage command; + command.c.id = ProvisioningMessageId::NetConfigLibVersProvisioningMessageId; + command.netConfigLibVersion = "1.6.0"; + uint8_t buffer[512]; + size_t bytes_encoded = sizeof(buffer); + + CBORMessageEncoder encoder; + MessageEncoder::Status err = encoder.encode((Message*)&command, buffer, bytes_encoded); + + uint8_t expected_result[] = { + 0xda, 0x00, 0x01, 0x20, 0x16, 0x81, 0x65, 0x31, 0x2E, 0x36, 0x2E, 0x30 + }; + + // Test the encoding is + // DA 00012016 # tag(73750) + // 81 # array(1) + // 65 # text(5) + // 312E362E30 # "1.6.0" + printf("res %d\n", (int)err); + THEN("The encoding is successful") { + REQUIRE(err == MessageEncoder::Status::Complete); + REQUIRE(bytes_encoded == sizeof(expected_result)); + REQUIRE(memcmp(buffer, expected_result, sizeof(expected_result)) == 0); + } + } } diff --git a/src/ANetworkConfigurator_Config.h b/src/ANetworkConfigurator_Config.h index 6c8faee..123c23e 100644 --- a/src/ANetworkConfigurator_Config.h +++ b/src/ANetworkConfigurator_Config.h @@ -7,8 +7,7 @@ */ #pragma once -#define NETWORK_CONFIGURATOR_COMPATIBLE 0 -#define ZERO_TOUCH_ENABLED 0 +#define ANetworkConfigurator_LIB_VERSION "0.1.0" #if defined(ARDUINO_SAMD_MKRWIFI1010) #define NETWORK_CONFIGURATOR_COMPATIBLE 1 @@ -119,6 +118,15 @@ #define LED_OFF HIGH #endif +#ifdef CI_TEST + #define NETWORK_CONFIGURATOR_COMPATIBLE 1 +#endif + +#ifndef NETWORK_CONFIGURATOR_COMPATIBLE + #define NETWORK_CONFIGURATOR_COMPATIBLE 0 + #define ZERO_TOUCH_ENABLED 0 +#endif + #ifndef RESET_HOLD_TIME #define RESET_HOLD_TIME 3000000 #endif diff --git a/src/Arduino_NetworkConfigurator.cpp b/src/Arduino_NetworkConfigurator.cpp index 25e583f..6ac4dda 100644 --- a/src/Arduino_NetworkConfigurator.cpp +++ b/src/Arduino_NetworkConfigurator.cpp @@ -79,6 +79,8 @@ bool NetworkConfiguratorClass::begin() { _agentsManager->addRequestHandler(RequestType::GET_WIFI_FW_VERSION, getWiFiFWVersionHandler); + _agentsManager->addRequestHandler(RequestType::GET_NETCONFIG_LIB_VERSION, getNetConfLibVersionHandler); + if (!_agentsManager->begin()) { DEBUG_ERROR("NetworkConfiguratorClass::%s Failed to initialize the AgentsManagerClass", __FUNCTION__); } @@ -343,6 +345,10 @@ void NetworkConfiguratorClass::getWiFiFWVersionHandler() { _receivedEvent = NetworkConfiguratorEvents::GET_WIFI_FW_VERSION; } +void NetworkConfiguratorClass::getNetConfLibVersionHandler() { + _receivedEvent = NetworkConfiguratorEvents::GET_NET_CONF_LIB_VERSION; +} + bool NetworkConfiguratorClass::handleConnectRequest() { if (_networkSetting.type == NetworkAdapter::NONE) { sendStatus(StatusMessage::PARAMS_NOT_FOUND); @@ -419,6 +425,12 @@ void NetworkConfiguratorClass::handleGetWiFiFWVersion() { _agentsManager->sendMsg(fwVersionMsg); } +void NetworkConfiguratorClass::handleGetNetConfLibVersion() { + ProvisioningOutputMessage libVersionMsg = { MessageOutputType::NETCONFIG_LIB_VERSION }; + libVersionMsg.m.netConfigLibVersion = ANetworkConfigurator_LIB_VERSION; + _agentsManager->sendMsg(libVersionMsg); +} + void NetworkConfiguratorClass::startReconfigureProcedure() { resetStoredConfiguration(); // Set to restart the BLE after reboot @@ -507,10 +519,11 @@ NetworkConfiguratorStates NetworkConfiguratorClass::handleWaitingForConf() { _agentsManager->update(); bool connecting = false; switch (_receivedEvent) { - case NetworkConfiguratorEvents::SCAN_REQ: scanNetworkOptions (); break; - case NetworkConfiguratorEvents::CONNECT_REQ: connecting = handleConnectRequest (); break; - case NetworkConfiguratorEvents::GET_WIFI_FW_VERSION: handleGetWiFiFWVersion(); break; - case NetworkConfiguratorEvents::NEW_NETWORK_SETTINGS: break; + case NetworkConfiguratorEvents::SCAN_REQ: scanNetworkOptions (); break; + case NetworkConfiguratorEvents::CONNECT_REQ: connecting = handleConnectRequest (); break; + case NetworkConfiguratorEvents::GET_WIFI_FW_VERSION: handleGetWiFiFWVersion (); break; + case NetworkConfiguratorEvents::GET_NET_CONF_LIB_VERSION: handleGetNetConfLibVersion(); break; + case NetworkConfiguratorEvents::NEW_NETWORK_SETTINGS: break; } _receivedEvent = NetworkConfiguratorEvents::NONE; diff --git a/src/Arduino_NetworkConfigurator.h b/src/Arduino_NetworkConfigurator.h index 2e8cfe2..bf6cd0a 100644 --- a/src/Arduino_NetworkConfigurator.h +++ b/src/Arduino_NetworkConfigurator.h @@ -171,7 +171,8 @@ class NetworkConfiguratorClass { SCAN_REQ, CONNECT_REQ, NEW_NETWORK_SETTINGS, - GET_WIFI_FW_VERSION }; + GET_WIFI_FW_VERSION, + GET_NET_CONF_LIB_VERSION }; static inline NetworkConfiguratorEvents _receivedEvent; enum class ConnectionResult { SUCCESS, @@ -193,6 +194,7 @@ class NetworkConfiguratorClass { NetworkConfiguratorStates handleErrorState(); bool handleConnectRequest(); void handleGetWiFiFWVersion(); + void handleGetNetConfLibVersion(); void startReconfigureProcedure(); @@ -213,6 +215,7 @@ class NetworkConfiguratorClass { static void connectReqHandler(); static void setNetworkSettingsHandler(models::NetworkSetting *netSetting); static void getWiFiFWVersionHandler(); + static void getNetConfLibVersionHandler(); }; #endif // NETWORK_CONFIGURATOR_COMPATIBLE diff --git a/src/ConfiguratorAgents/AgentsManager.cpp b/src/ConfiguratorAgents/AgentsManager.cpp index 042bbb4..b9ce385 100644 --- a/src/ConfiguratorAgents/AgentsManager.cpp +++ b/src/ConfiguratorAgents/AgentsManager.cpp @@ -302,11 +302,13 @@ void AgentsManagerClass::updateProgressRequest(StatusMessage type) { void AgentsManagerClass::updateProgressRequest(MessageOutputType type) { RequestType key = RequestType::NONE; switch (type) { - case MessageOutputType::NETWORK_OPTIONS: key = RequestType::SCAN ; break; - case MessageOutputType::UHWID: key = RequestType::GET_ID ; break; - case MessageOutputType::JWT: key = RequestType::GET_ID ; break; - case MessageOutputType::BLE_MAC_ADDRESS: key = RequestType::GET_BLE_MAC_ADDRESS; break; - case MessageOutputType::WIFI_FW_VERSION: key = RequestType::GET_WIFI_FW_VERSION; break; + case MessageOutputType::NETWORK_OPTIONS: key = RequestType::SCAN ; break; + case MessageOutputType::UHWID: key = RequestType::GET_ID ; break; + case MessageOutputType::JWT: key = RequestType::GET_ID ; break; + case MessageOutputType::BLE_MAC_ADDRESS: key = RequestType::GET_BLE_MAC_ADDRESS ; break; + case MessageOutputType::WIFI_FW_VERSION: key = RequestType::GET_WIFI_FW_VERSION ; break; + case MessageOutputType::PROV_SKETCH_VERSION: key = RequestType::GET_PROVISIONING_SKETCH_VERSION; break; + case MessageOutputType::NETCONFIG_LIB_VERSION: key = RequestType::GET_NETCONFIG_LIB_VERSION ; break; } if (key == RequestType::NONE) { @@ -336,12 +338,14 @@ void AgentsManagerClass::handleReceivedCommands(RemoteCommands cmd) { RequestType type = RequestType::NONE; switch (cmd) { - case RemoteCommands::CONNECT: type = RequestType::CONNECT ; break; - case RemoteCommands::SCAN: type = RequestType::SCAN ; break; - case RemoteCommands::GET_ID: type = RequestType::GET_ID ; break; - case RemoteCommands::GET_BLE_MAC_ADDRESS: type = RequestType::GET_BLE_MAC_ADDRESS; break; - case RemoteCommands::RESET: type = RequestType::RESET ; break; - case RemoteCommands::GET_WIFI_FW_VERSION: type = RequestType::GET_WIFI_FW_VERSION; break; + case RemoteCommands::CONNECT: type = RequestType::CONNECT ; break; + case RemoteCommands::SCAN: type = RequestType::SCAN ; break; + case RemoteCommands::GET_ID: type = RequestType::GET_ID ; break; + case RemoteCommands::GET_BLE_MAC_ADDRESS: type = RequestType::GET_BLE_MAC_ADDRESS ; break; + case RemoteCommands::RESET: type = RequestType::RESET ; break; + case RemoteCommands::GET_WIFI_FW_VERSION: type = RequestType::GET_WIFI_FW_VERSION ; break; + case RemoteCommands::GET_PROVISIONING_SKETCH_VERSION: type = RequestType::GET_PROVISIONING_SKETCH_VERSION; break; + case RemoteCommands::GET_NETCONFIG_LIB_VERSION: type = RequestType::GET_NETCONFIG_LIB_VERSION ; break; } if(type == RequestType::NONE) { diff --git a/src/ConfiguratorAgents/AgentsManager.h b/src/ConfiguratorAgents/AgentsManager.h index 3404f89..0fc81b0 100644 --- a/src/ConfiguratorAgents/AgentsManager.h +++ b/src/ConfiguratorAgents/AgentsManager.h @@ -54,7 +54,9 @@ enum class RequestType: int { NONE = -1, GET_ID = 2, RESET = 3, GET_WIFI_FW_VERSION = 4, - GET_BLE_MAC_ADDRESS = 5 }; + GET_BLE_MAC_ADDRESS = 5, + GET_PROVISIONING_SKETCH_VERSION = 6, + GET_NETCONFIG_LIB_VERSION = 7}; /** * @class AgentsManagerClass @@ -209,7 +211,7 @@ class AgentsManagerClass { AgentsManagerStates _state; std::list _agentsList; bool _enabledAgents[2]; - ConfiguratorRequestHandler _reqHandlers[6]; + ConfiguratorRequestHandler _reqHandlers[8]; ReturnTimestamp _returnTimestampCb; ReturnNetworkSettings _returnNetworkSettingsCb; ConfiguratorAgent *_selectedAgent; diff --git a/src/ConfiguratorAgents/MessagesDefinitions.h b/src/ConfiguratorAgents/MessagesDefinitions.h index 6296772..f79e888 100644 --- a/src/ConfiguratorAgents/MessagesDefinitions.h +++ b/src/ConfiguratorAgents/MessagesDefinitions.h @@ -42,12 +42,14 @@ enum class StatusMessage { }; /* Commands codes */ -enum class RemoteCommands { CONNECT = 1, - GET_ID = 2, - GET_BLE_MAC_ADDRESS = 3, - RESET = 4, - SCAN = 100, - GET_WIFI_FW_VERSION = 101 +enum class RemoteCommands { CONNECT = 1, + GET_ID = 2, + GET_BLE_MAC_ADDRESS = 3, + RESET = 4, + SCAN = 100, + GET_WIFI_FW_VERSION = 101, + GET_PROVISIONING_SKETCH_VERSION = 200, + GET_NETCONFIG_LIB_VERSION = 201, }; /* Types of outgoing messages */ @@ -56,7 +58,9 @@ enum class MessageOutputType { STATUS, UHWID, JWT, BLE_MAC_ADDRESS, - WIFI_FW_VERSION + WIFI_FW_VERSION, + PROV_SKETCH_VERSION, + NETCONFIG_LIB_VERSION, }; /* Types of ingoing messages */ @@ -80,6 +84,8 @@ struct ProvisioningOutputMessage { const char *jwt; const uint8_t *BLEMacAddress; const char *wifiFwVersion; + const char *provSketchVersion; + const char *netConfigLibVersion; } m; }; diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.cpp b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.cpp index aa698d6..e0d856f 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.cpp +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.cpp @@ -67,7 +67,13 @@ bool BoardConfigurationProtocol::sendMsg(ProvisioningOutputMessage &msg) { res = sendBleMacAddress(msg.m.BLEMacAddress, BLE_MAC_ADDRESS_SIZE); break; case MessageOutputType::WIFI_FW_VERSION: - res = sendWifiFWVersion(msg.m.wifiFwVersion); + res = sendVersion(msg.m.wifiFwVersion, msg.type); + break; + case MessageOutputType::PROV_SKETCH_VERSION: + res = sendVersion(msg.m.provSketchVersion, msg.type); + break; + case MessageOutputType::NETCONFIG_LIB_VERSION: + res = sendVersion(msg.m.netConfigLibVersion, msg.type); break; default: break; @@ -310,21 +316,27 @@ bool BoardConfigurationProtocol::sendBleMacAddress(const uint8_t *mac, size_t le return res; } -bool BoardConfigurationProtocol::sendWifiFWVersion(const char *wifiFWVersion) { +bool BoardConfigurationProtocol::sendVersion(const char *version, MessageOutputType type) { bool res = false; - size_t cborDataLen = CBOR_MIN_WIFI_FW_VERSION_LEN + strlen(wifiFWVersion); + size_t cborDataLen = CBOR_MIN_WIFI_FW_VERSION_LEN + strlen(version); uint8_t data[cborDataLen]; - res = CBORAdapter::wifiFWVersionToCBOR(wifiFWVersion, data, &cborDataLen); + switch (type) + { + case MessageOutputType::WIFI_FW_VERSION: res = CBORAdapter::wifiFWVersionToCBOR (version, data, &cborDataLen); break; + case MessageOutputType::PROV_SKETCH_VERSION: res = CBORAdapter::provSketchVersionToCBOR (version, data, &cborDataLen); break; + case MessageOutputType::NETCONFIG_LIB_VERSION: res = CBORAdapter::netConfigLibVersionToCBOR(version, data, &cborDataLen); break; + default: return false; + } + if (!res) { return res; } res = sendData(PacketManager::MessageType::DATA, data, cborDataLen); if (!res) { - DEBUG_WARNING("BoardConfigurationProtocol::%s failed to send WiFi FW version", __FUNCTION__); - return res; + DEBUG_WARNING("BoardConfigurationProtocol::%s failed to send version of type %d", __FUNCTION__, (int)type); } return res; diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.h b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.h index b997e38..4db3bba 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.h +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.h @@ -97,7 +97,7 @@ class BoardConfigurationProtocol { bool sendUhwid(const byte *uhwid); bool sendJwt(const char *jwt, size_t len); bool sendBleMacAddress(const uint8_t *mac, size_t len); - bool sendWifiFWVersion(const char *wifiFWVersion); + bool sendVersion(const char *version, MessageOutputType type); TransmissionResult transmitStream(); void printPacket(const char *label, const uint8_t *data, size_t len); std::list _outputMessagesList; diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.cpp b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.cpp index 0ae02d8..456a163 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.cpp +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.cpp @@ -97,6 +97,34 @@ bool CBORAdapter::wifiFWVersionToCBOR(const char *wifiFWVersion, uint8_t *data, return status == MessageEncoder::Status::Complete ? true : false; } +bool CBORAdapter::provSketchVersionToCBOR(const char *provSketchVersion, uint8_t *data, size_t *len) { + CBORMessageEncoder encoder; + if(*len < CBOR_MIN_PROV_SKETCH_VERSION_LEN + strlen(provSketchVersion)) { + return false; + } + ProvSketchVersionProvisioningMessage provSketchVersionMsg; + provSketchVersionMsg.c.id = ProvisioningMessageId::ProvSketchVersionProvisioningMessageId; + provSketchVersionMsg.provSketchVersion = provSketchVersion; + + MessageEncoder::Status status = encoder.encode((Message *)&provSketchVersionMsg, data, *len); + + return status == MessageEncoder::Status::Complete ? true : false; +} + +bool CBORAdapter::netConfigLibVersionToCBOR(const char *netConfigLibVersion, uint8_t *data, size_t *len) { + CBORMessageEncoder encoder; + if(*len < CBOR_MIN_NETCONFIG_LIB_VERSION_LEN + strlen(netConfigLibVersion)) { + return false; + } + NetConfigLibVersionProvisioningMessage netConfigLibVersionMsg; + netConfigLibVersionMsg.c.id = ProvisioningMessageId::NetConfigLibVersProvisioningMessageId; + netConfigLibVersionMsg.netConfigLibVersion = netConfigLibVersion; + + MessageEncoder::Status status = encoder.encode((Message *)&netConfigLibVersionMsg, data, *len); + + return status == MessageEncoder::Status::Complete ? true : false; +} + bool CBORAdapter::networkOptionsToCBOR(const NetworkOptions *netOptions, uint8_t *data, size_t *len) { bool result = false; switch (netOptions->type) { diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.h b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.h index b5c9272..40917df 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.h +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.h @@ -19,6 +19,8 @@ #define CBOR_DATA_STATUS_LEN 4 + CBOR_DATA_HEADER_LEN #define CBOR_DATA_BLE_MAC_LEN BLE_MAC_ADDRESS_SIZE + 2 + CBOR_DATA_HEADER_LEN #define CBOR_MIN_WIFI_FW_VERSION_LEN CBOR_DATA_HEADER_LEN + 1 // CBOR_DATA_HEADER_LEN + 1 byte for the length of the string +#define CBOR_MIN_PROV_SKETCH_VERSION_LEN CBOR_DATA_HEADER_LEN + 1 // CBOR_DATA_HEADER_LEN + 1 byte for the length of the string +#define CBOR_MIN_NETCONFIG_LIB_VERSION_LEN CBOR_DATA_HEADER_LEN + 1 // CBOR_DATA_HEADER_LEN + 1 byte for the length of the string class CBORAdapter { public: @@ -26,6 +28,8 @@ class CBORAdapter { static bool jwtToCBOR(const char *jwt, uint8_t *data, size_t *len); static bool BLEMacAddressToCBOR(const uint8_t *mac, uint8_t *data, size_t *len); static bool wifiFWVersionToCBOR(const char *wifiFWVersion, uint8_t *data, size_t *len); + static bool provSketchVersionToCBOR(const char *provSketchVersion, uint8_t *data, size_t *len); + static bool netConfigLibVersionToCBOR(const char *netConfigLibVersion, uint8_t *data, size_t *len); static bool statusToCBOR(StatusMessage msg, uint8_t *data, size_t *len); static bool networkOptionsToCBOR(const NetworkOptions *netOptions, uint8_t *data, size_t *len); static bool getMsgFromCBOR(const uint8_t *data, size_t len, ProvisioningMessageDown *msg); diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBORInstances.h b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBORInstances.h index 829a4e6..b726e0f 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBORInstances.h +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBORInstances.h @@ -9,6 +9,8 @@ static UniqueHardwareIdProvisioningMessageEncoder uniqueHardwareIdProvisioning static JWTProvisioningMessageEncoder jWTProvisioningMessageEncoder; static BLEMacAddressProvisioningMessageEncoder bLEMacAddressProvisioningMessageEncoder; static WiFiFWVersionProvisioningMessageEncoder wiFiFWVersionProvisioningMessageEncoder; +static ProvSketchVersionProvisioningMessageEncoder provSketchVersionProvisioningMessageEncoder; +static NetConfigLibVersProvisioningMessageEncoder netConfigLibVersProvisioningMessageEncoder; static TimestampProvisioningMessageDecoder timestampProvisioningMessageDecoder; static CommandsProvisioningMessageDecoder commandsProvisioningMessageDecoder; diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.cpp b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.cpp index bbb72ee..fd0bb07 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.cpp +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.cpp @@ -135,4 +135,42 @@ MessageEncoder::Status WiFiFWVersionProvisioningMessageEncoder::encode(CborEncod return MessageEncoder::Status::Complete; } +MessageEncoder::Status ProvSketchVersionProvisioningMessageEncoder::encode(CborEncoder* encoder, Message *msg) { + ProvSketchVersionProvisioningMessage * provisioningSketchVersion = (ProvSketchVersionProvisioningMessage*) msg; + CborEncoder array_encoder; + + if(cbor_encoder_create_array(encoder, &array_encoder, 1) != CborNoError) { + return MessageEncoder::Status::Error; + } + + if(cbor_encode_text_stringz(&array_encoder, provisioningSketchVersion->provSketchVersion) != CborNoError) { + return MessageEncoder::Status::Error; + } + + if(cbor_encoder_close_container(encoder, &array_encoder) != CborNoError) { + return MessageEncoder::Status::Error; + } + + return MessageEncoder::Status::Complete; +} + +MessageEncoder::Status NetConfigLibVersProvisioningMessageEncoder::encode(CborEncoder* encoder, Message *msg) { + NetConfigLibVersionProvisioningMessage * netConfigLibVersion = (NetConfigLibVersionProvisioningMessage*) msg; + CborEncoder array_encoder; + + if(cbor_encoder_create_array(encoder, &array_encoder, 1) != CborNoError) { + return MessageEncoder::Status::Error; + } + + if(cbor_encode_text_stringz(&array_encoder, netConfigLibVersion->netConfigLibVersion) != CborNoError) { + return MessageEncoder::Status::Error; + } + + if(cbor_encoder_close_container(encoder, &array_encoder) != CborNoError) { + return MessageEncoder::Status::Error; + } + + return MessageEncoder::Status::Complete; +} + #endif // NETWORK_CONFIGURATOR_COMPATIBLE diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.h b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.h index c32b3f2..fd02dfa 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.h +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.h @@ -59,3 +59,19 @@ class WiFiFWVersionProvisioningMessageEncoder: public CBORMessageEncoderInterfac protected: MessageEncoder::Status encode(CborEncoder* encoder, Message *msg) override; }; + +class ProvSketchVersionProvisioningMessageEncoder: public CBORMessageEncoderInterface { + public: + ProvSketchVersionProvisioningMessageEncoder() + : CBORMessageEncoderInterface(CBORProvSketchVersionProvisioningMessage, ProvSketchVersionProvisioningMessageId) {} + protected: + MessageEncoder::Status encode(CborEncoder* encoder, Message *msg) override; + }; + +class NetConfigLibVersProvisioningMessageEncoder: public CBORMessageEncoderInterface { + public: + NetConfigLibVersProvisioningMessageEncoder() + : CBORMessageEncoderInterface(CBORNetConfigLibVersProvisioningMessage, NetConfigLibVersProvisioningMessageId) {} + protected: + MessageEncoder::Status encode(CborEncoder* encoder, Message *msg) override; + }; diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/ProvisioningMessage.h b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/ProvisioningMessage.h index e2267f7..383c9ef 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/ProvisioningMessage.h +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/ProvisioningMessage.h @@ -48,6 +48,8 @@ enum CBORProvisioningMessageTag: CBORTag { CBORJWTProvisioningMessage = 0x012011, CBORBLEMacAddressProvisioningMessage = 0x012013, CBORWiFiFWVersionProvisioningMessage = 0x012014, + CBORProvSketchVersionProvisioningMessage = 0x012015, + CBORNetConfigLibVersProvisioningMessage = 0x012016, }; enum ProvisioningMessageId: MessageId { @@ -57,6 +59,8 @@ enum ProvisioningMessageId: MessageId { UniqueHardwareIdProvisioningMessageId, BLEMacAddressProvisioningMessageId, WiFiFWVersionProvisioningMessageId, + ProvSketchVersionProvisioningMessageId, + NetConfigLibVersProvisioningMessageId, JWTProvisioningMessageId, TimestampProvisioningMessageId, CommandsProvisioningMessageId, @@ -119,6 +123,20 @@ struct WiFiFWVersionProvisioningMessage { }; }; +struct ProvSketchVersionProvisioningMessage { + ProvisioningMessage c; + struct { + const char *provSketchVersion; //The payload is a string. + }; +}; + +struct NetConfigLibVersionProvisioningMessage { + ProvisioningMessage c; + struct { + const char *netConfigLibVersion; //The payload is a string. + }; +}; + struct TimestampProvisioningMessage { ProvisioningMessage c; struct {