From 552918b1fa7decf6e604ef6d754e48bbbcc77195 Mon Sep 17 00:00:00 2001 From: Francois <thiebolt@irit.fr> Date: Wed, 31 May 2023 00:46:41 +0200 Subject: [PATCH] update --- neosensor/libraries/neocampus/sensocampus.cpp | 95 ++++++++++++++++++- neosensor/libraries/neocampus/sensocampus.h | 10 +- .../libraries/neocampus/wifiParametersMgt.cpp | 26 ++--- 3 files changed, 110 insertions(+), 21 deletions(-) diff --git a/neosensor/libraries/neocampus/sensocampus.cpp b/neosensor/libraries/neocampus/sensocampus.cpp index a503f647..d148f088 100644 --- a/neosensor/libraries/neocampus/sensocampus.cpp +++ b/neosensor/libraries/neocampus/sensocampus.cpp @@ -9,6 +9,7 @@ * duplication in 'loadSensoConfig() * --- * Notes: + * - BASE_TOPIC is not taken from http credentials but from 1st topic of config ! * --- * F.Thiebolt may.23 add NVS support to save sensOCampus given credentials * F.Thiebolt aug.20 removed EEPROM support @@ -367,6 +368,33 @@ bool senso::_saveConfig( JsonObject root ) { /* * add additional parameters to save here */ + + + /* + * NVS: saving mqtt credentials + */ +#ifdef ESP32 + // save SENSO MQTT credentials to NVS + Preferences _nvs; + + if( _nvs.begin(SENSO_NVS_NAMESPACE,false) ) { // R/W mode + + if( _nvs.putBytes(SENSO_MQTT_LOGIN_KEY,_mqtt_login,strlen(_mqtt_login)+1) != strlen(_mqtt_login)+1 ) { + log_error(F("\n[senso] ERROR while saving MQTT_LOGIN to NVS ?!?!"));log_flush(); + } + if( _nvs.putBytes(SENSO_MQTT_PASS_KEY,_mqtt_passwd,strlen(_mqtt_passwd)+1) != strlen(_mqtt_passwd)+1 ) { + log_error(F("\n[senso] ERROR while saving MQTT_PASSWD to NVS ?!?!"));log_flush(); + } + // close NVS namespace + _nvs.end(); + log_debug(F("\n[senso] successfully saved MQTT credentials to NVS namespace '"));log_debug(SENSO_NVS_NAMESPACE);log_debug(F("' ... "));log_flush(); + } + else { + log_error(F("\n[senso] unable to save sensOCampus MQTT credentials in NVS ?!?!"));log_flush(); + } + +#endif /* ESP32 */ + } else { log_debug(F("\n[senso] no change in options to save ..."));log_flush(); @@ -541,9 +569,14 @@ bool senso::_parseCredentials( char *json ) { // no password provided but login matches ours ==> we also have the right password :) log_info(F("\n[senso] found SAME 'login' = "));log_info(_mqtt_login); log_flush(); } - // no password provided and login does not match ... but will it match login from NVS ? - else if( ) { - to be continued + /* so far, no password provided and login does not match + * trying to get credentials from NVS ... if it matches JSON login + */ + else if( _getNVScredentials( (const char *)(root[F("login")]) ) ) { + // ok, JSON['login']==NVS['login'] ==> NVS has valid credentials :) + // ... probably cause SPIFFS SENSO file has been deleted by new SPIFFS format + log_info(F("\n[senso] found NVS'login' = "));log_info(_mqtt_login); log_flush(); + log_info(F("\n[senso] found NVS'password' = "));log_info(_mqtt_passwd); log_flush(); _updated = true; // to save config } else { @@ -607,6 +640,62 @@ bool senso::_parseConfig( const char *json ) { } +/* + * [NVS] retrieve sensOCampus mqtt login/passwd from Non Volatile Storage + * if NVS_login matches the jsonLogin parameter, mqtt credentials will get + * copied to senso object + return true; return false otherwise + * Note: only for ESP32 + */ +bool senso::_getNVScredentials( const char * jsonMQTTlogin ) { +#ifndef ESP32 + log_info(F("\n[senso] sensOCampus NVS credentials not available on this system ..."));log_flush(); + return false; +#else + // ESP32 + Preferences _nvs; + + // open NVS sensOCampus namespace + if( not _nvs.begin(SENSO_NVS_NAMESPACE,true) ) { // readonly mode + log_debug(F("\n[senso] NVS sensOCampus namespace does not exists ..."));log_flush(); + return false; + } + + // ok, NVS sensOCampus namespace exists ... + log_debug(F("\n[senso] opened NVS sensOCampus credentials namespace ..."));log_flush(); + + // check if NVS mqtt_login exists + if( not _nvs.isKey(SENSO_MQTT_LOGIN_KEY) ) { + _nvs.end(); + return false; + } + + // ok NVS mqtt_login exists ... but does it matches the parameter + char _nvs_mqtt_login[SENSO_MQTT_LOGIN_LENGTH]; + _nvs.getBytes(SENSO_MQTT_LOGIN_KEY, _nvs_mqtt_login, sizeof(_nvs_mqtt_login)); + _nvs_mqtt_login[sizeof(_nvs_mqtt_login)-1]='\0'; // just to get sure ... + if( strncmp(_nvs_mqtt_login,jsonMQTTlogin,sizeof(_nvs_mqtt_login)) !=0 ) { + // NVS mqtt_login does not matches JsonMQTTlogin ! + log_debug(F("\n[senso] NVS mqtt_login does NOT matches the one provided by sensOCampus ..."));log_flush(); + _nvs.end(); + return false; + } + + // excellent, NVS mqtt_login == JsonMQTTlogin ... check passwd exists + if( not _nvs.isKey(SENSO_MQTT_PASS_KEY) ) { + log_error(F("\n[senso] NVS mqtt_password does not exists while NVS mqtt_login exists ?!?!"));log_flush(); + _nvs.end(); + return false; + } + // now set credentials from NVS + strncpy(_mqtt_login,_nvs_mqtt_login,sizeof(_mqtt_login)); + _nvs.getBytes(SENSO_MQTT_PASS_KEY, _mqtt_passwd, sizeof(_mqtt_passwd)); + + _nvs.end(); + return true; +#endif /* ESP32 */ +} + + /* * Enable various modules to fetch their configuration that may have been * retrieved from sensOCampus server diff --git a/neosensor/libraries/neocampus/sensocampus.h b/neosensor/libraries/neocampus/sensocampus.h index 914a9a1d..9bef67fb 100644 --- a/neosensor/libraries/neocampus/sensocampus.h +++ b/neosensor/libraries/neocampus/sensocampus.h @@ -75,11 +75,11 @@ private: */ void _applyDefaults( void ); bool _parseCredentials( char * ); - bool _parseConfig( const char * ); // VERY IMPORTANT 'const' as it force ArduinoJson to create a copy - bool _loadConfig( JsonObject ); // interprets JSON buffer from config file - bool _saveConfig( JsonObject ); // fill JSON buffer with things to save to config file - bool _NVSgetLogin( & ); // [NVS] retrieve sensOCampus mqtt_login from NonVolatileStorage - bool _NVSgetPasswd( & ); // [NVS] retrieve sensOCampus mqtt_passwd from NonVolatileStorage + bool _parseConfig( const char * ); // VERY IMPORTANT 'const' as it force ArduinoJson to create a copy + bool _loadConfig( JsonObject ); // interprets JSON buffer from config file + bool _saveConfig( JsonObject ); // fill JSON buffer with things to save to config file + bool _getNVScredentials( const char * ); // [NVS] retrieve sensOCampus mqtt login/passwd from Non Volatile Storage + // if they match the (JSON mqtt_login) parameter /* * private attributes diff --git a/neosensor/libraries/neocampus/wifiParametersMgt.cpp b/neosensor/libraries/neocampus/wifiParametersMgt.cpp index f15c37b1..093d9806 100644 --- a/neosensor/libraries/neocampus/wifiParametersMgt.cpp +++ b/neosensor/libraries/neocampus/wifiParametersMgt.cpp @@ -364,19 +364,19 @@ void wifiParametersMgt::_applyDefaults( void ) { * [may.23] now trying to access wifi credentials from NVS namespace */ #ifdef ESP32 - Preferences nvs_wifi; - if( nvs_wifi.begin(WIFI_NVS_NAMESPACE,true) ) { // readonly mode + Preferences _nvs; + if( _nvs.begin(WIFI_NVS_NAMESPACE,true) ) { // readonly mode log_debug(F("\n[wifiParams] opened NVS WiFi credentials namespace ..."));log_flush(); - if( nvs_wifi.isKey(WIFI_NVS_SSID_KEY) ) { - nvs_wifi.getBytes(WIFI_NVS_SSID_KEY, _ssid, sizeof(_ssid)); + if( _nvs.isKey(WIFI_NVS_SSID_KEY) ) { + _nvs.getBytes(WIFI_NVS_SSID_KEY, _ssid, sizeof(_ssid)); log_debug(F("\n\t[NVS] SSID :"));log_debug(_ssid);log_flush(); } - if( nvs_wifi.isKey(WIFI_NVS_PASS_KEY) ) { - nvs_wifi.getBytes(WIFI_NVS_PASS_KEY, _pass, sizeof(_pass)); + if( _nvs.isKey(WIFI_NVS_PASS_KEY) ) { + _nvs.getBytes(WIFI_NVS_PASS_KEY, _pass, sizeof(_pass)); log_debug(F("\n\t[NVS] PASS :"));log_debug(_pass);log_flush(); } // close NVS namespace - nvs_wifi.end(); + _nvs.end(); } #elif defined (ESP8266) #warning "[ESP8266] retrieving WiFi credentials from WiFi library is experimental" @@ -414,18 +414,18 @@ bool wifiParametersMgt::_saveConfig( JsonObject root ) { root["pass"] = _pass; #ifdef ESP32 // save WiFi credentials to NVS - Preferences nvs_wifi; - if( nvs_wifi.begin(WIFI_NVS_NAMESPACE,false) ) { // R/W mode + Preferences _nvs; + if( _nvs.begin(WIFI_NVS_NAMESPACE,false) ) { // R/W mode log_debug(F("\n[wifiParams] save WiFi credentials to NVS namespace '"));log_debug(WIFI_NVS_NAMESPACE);log_debug(F("' ... "));log_flush(); - if( nvs_wifi.putBytes(WIFI_NVS_SSID_KEY,_ssid,strlen(_ssid)+1) != strlen(_ssid)+1 ) { + if( _nvs.putBytes(WIFI_NVS_SSID_KEY,_ssid,strlen(_ssid)+1) != strlen(_ssid)+1 ) { log_error(F("\n[wifiParams] ERROR while saving SSID to NVS ?!?!"));log_flush(); } - if( nvs_wifi.putBytes(WIFI_NVS_PASS_KEY,_pass,strlen(_pass)+1) != strlen(_pass)+1 ) { - log_error(F("\n[[wifiParams] ERROR while saving PASS to NVS ?!?!"));log_flush(); + if( _nvs.putBytes(WIFI_NVS_PASS_KEY,_pass,strlen(_pass)+1) != strlen(_pass)+1 ) { + log_error(F("\n[wifiParams] ERROR while saving PASS to NVS ?!?!"));log_flush(); } // close NVS namespace - nvs_wifi.end(); + _nvs.end(); } else { log_error(F("\n[wifiParams] unable to create WiFi credentials namespace in NVS ?!?!"));log_flush(); -- GitLab