From fbfd693f5d69cf8f14cbfacb8326b8a2a85d0134 Mon Sep 17 00:00:00 2001 From: Hieromon Ikasamo Date: Tue, 10 Sep 2019 18:05:18 +0900 Subject: [PATCH 1/6] Added CreditMigrate.ino --- .travis.yml | 1 + README.md | 3 + examples/CreditMigrate/CreditMigrate.ino | 115 +++++++++++++++++++++++ library.json | 2 +- library.properties | 2 +- mkdocs/changelog.md | 3 + 6 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 examples/CreditMigrate/CreditMigrate.ino diff --git a/.travis.yml b/.travis.yml index c994c17..58d23d4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,7 @@ install: script: - buildExampleSketch ConfigIP - buildExampleSketch Credential + - if [[ "$BOARD" =~ "esp32:esp32:" ]]; then buildExampleSketch CreditMigrate; fi - buildExampleSketch Elements - buildExampleSketch FileUpload - buildExampleSketch FSBrowser diff --git a/README.md b/README.md index 7a0c4d9..047c849 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,9 @@ Full documentation is available on https://Hieromon.github.io/AutoConnect, some ## Change log +### [1.0.1] Sept. 10, 2019 +- Added a sketch for ESP32 boards that migrates credentials stored in EEPROM partition to the Preferences. + ### [1.0.0] Sept. 7, 2019 - Supports Arduino core for ESP32 1.0.3. - Supports AutoConnectUpdate for the OTA update. diff --git a/examples/CreditMigrate/CreditMigrate.ino b/examples/CreditMigrate/CreditMigrate.ino new file mode 100644 index 0000000..c700bf6 --- /dev/null +++ b/examples/CreditMigrate/CreditMigrate.ino @@ -0,0 +1,115 @@ +/* + CreditMigrate.ino + Copyright (c) 2019, Hieromon Ikasamo + https://github.com/Hieromon/AutoConnect + This software is released under the MIT License. + https://opensource.org/licenses/MIT + This sketch migrates the credentials past saved to EEPROM in ESP32 to + Preferences. + */ + +#ifndef ARDUINO_ARCH_ESP32 +#error This sketch should be compiled with the board of ESP32. +#endif + +#include +#include +#include +#include +#include + +/** + * Retrieve saved credentials from eeprom partition. + * @param size Returns a size of the eeprom partition + * @return Retrieved data buffered pointer + */ +uint8_t* retrievePartition(size_t *size) { + const esp_partition_t* eeprom = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "eeprom"); + + if (!eeprom) { + Serial.println("EEPROM partition not found"); + return nullptr; + } + uint8_t* pBuf = (uint8_t*)malloc(eeprom->size); + if (!pBuf) { + Serial.println("Insufficient memory to retrieve EEPROM partition"); + return nullptr; + } + if (esp_partition_read(eeprom, 0, (void*)pBuf, eeprom->size) != ESP_OK) { + Serial.println("Unable to read EEPROM partition"); + free(pBuf); + return nullptr; + } + *size = eeprom->size; + return pBuf; +} + +/** + * Write credentials in retrieved buffer to Preferences. + * @param eeprom Retrieved data buffered pointer + * @param size Retrieved data size + */ +void convert(uint8_t* eeprom, size_t size) { + uint8_t* ac_credt = (uint8_t*)strstr((const char*)eeprom, "AC_CREDT"); + if (!ac_credt) + Serial.println("AC_CREDT identifier not found in EEPROM partition."); + else { + AutoConnectCredential credential; + uint8_t* bp = ac_credt + sizeof("AC_CREDT") - 1; + uint8_t* dp = bp; + uint8_t entries = *dp++; + size_t dpSize = *dp++; + dpSize += *dp++ << 8; + Serial.printf("%d stored credential(s), size:%d\n", (int)entries, dpSize); + + // Start EEPROM to Preferences migration + uint8_t* ep = dp + dpSize - 1; + for (int ec = 1; dp <= ep; ec++) { + + // Skip erased entry + while (*dp == 0xff) { + if (++dp > ep) + break; + } + if (dp > ep) // It reached at the end of the credential region. + break; + + // Obtain each entry and store to Preferences + struct station_config config; + Serial.printf("[%d] ", ec); + uint8_t ei = 0; + do { + config.ssid[ei++] = *dp; + } while (*dp++); + Serial.print((char*)config.ssid); + ei = 0; + do { + config.password[ei++] = *dp; + } while (*dp++); + Serial.printf("(%s)", config.password); + for (ei = 0; ei < sizeof(config.bssid); ei++) { + config.bssid[ei] = *dp++; + Serial.printf(":%02x", config.bssid[ei]); + } + bool rc = credential.save(&config); + Serial.println(rc ? " saved" : " failed to save"); + } + } +} + +void setup() { + delay(1000); + Serial.begin(115200); + Serial.println(); + + size_t eepromSize; + uint8_t* eepromData = retrievePartition(&eepromSize); + if (eepromData) { + Serial.println("Start EEPROM migration to Preferences"); + convert(eepromData, eepromSize); + Serial.println("Conversion ended"); + free(eepromData); + } +} + +void loop() {} diff --git a/library.json b/library.json index d9d48b2..b2f9f6b 100644 --- a/library.json +++ b/library.json @@ -25,6 +25,6 @@ "espressif8266", "espressif32" ], - "version": "1.0.0", + "version": "1.0.1", "license": "MIT" } diff --git a/library.properties b/library.properties index d54e9d6..58bb112 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=AutoConnect -version=1.0.0 +version=1.0.1 author=Hieromon Ikasamo maintainer=Hieromon Ikasamo sentence=ESP8266/ESP32 WLAN configuration at runtime with web interface. diff --git a/mkdocs/changelog.md b/mkdocs/changelog.md index e30c56b..e66fb60 100644 --- a/mkdocs/changelog.md +++ b/mkdocs/changelog.md @@ -1,3 +1,6 @@ +#### [1.0.1] Sept. 10, 2019 +- Added a sketch for ESP32 boards that migrates credentials stored in EEPROM partition to the Preferences. + #### [1.0.0] Sept. 7, 2019 - Supports Arduino core for ESP32 1.0.3. - Supports AutoConnectUpdate for the [OTA update](otaupdate.md). From ca0002c229ca3e0dca379ff06c4d80a4a5211f68 Mon Sep 17 00:00:00 2001 From: Hieromon Ikasamo Date: Wed, 11 Sep 2019 17:10:35 +0900 Subject: [PATCH 2/6] Added CreditMigrate.ino description --- examples/CreditMigrate/CreditMigrate.ino | 26 +++++++++++------------ examples/CreditMigrate/CreditMigrate.md | 24 +++++++++++++++++++++ mkdocs/images/creditmigrate.png | Bin 0 -> 24675 bytes 3 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 examples/CreditMigrate/CreditMigrate.md create mode 100644 mkdocs/images/creditmigrate.png diff --git a/examples/CreditMigrate/CreditMigrate.ino b/examples/CreditMigrate/CreditMigrate.ino index c700bf6..214c87f 100644 --- a/examples/CreditMigrate/CreditMigrate.ino +++ b/examples/CreditMigrate/CreditMigrate.ino @@ -23,20 +23,20 @@ * @param size Returns a size of the eeprom partition * @return Retrieved data buffered pointer */ -uint8_t* retrievePartition(size_t *size) { - const esp_partition_t* eeprom = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "eeprom"); +uint8_t* retrievePartition(const char* name, size_t *size) { + const esp_partition_t* eeprom = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, name); if (!eeprom) { - Serial.println("EEPROM partition not found"); + Serial.printf("%s partition not found\n", name); return nullptr; } uint8_t* pBuf = (uint8_t*)malloc(eeprom->size); if (!pBuf) { - Serial.println("Insufficient memory to retrieve EEPROM partition"); + Serial.printf("Insufficient memory to retrieve %s partition\n", name); return nullptr; } if (esp_partition_read(eeprom, 0, (void*)pBuf, eeprom->size) != ESP_OK) { - Serial.println("Unable to read EEPROM partition"); + Serial.printf("Unable to read %s partition\n", name); free(pBuf); return nullptr; } @@ -49,18 +49,18 @@ uint8_t* retrievePartition(size_t *size) { * @param eeprom Retrieved data buffered pointer * @param size Retrieved data size */ -void convert(uint8_t* eeprom, size_t size) { +void convert(const uint8_t* eeprom, const size_t size) { uint8_t* ac_credt = (uint8_t*)strstr((const char*)eeprom, "AC_CREDT"); if (!ac_credt) - Serial.println("AC_CREDT identifier not found in EEPROM partition."); + Serial.println("AC_CREDT identifier not found in the partition."); else { AutoConnectCredential credential; - uint8_t* bp = ac_credt + sizeof("AC_CREDT") - 1; + uint8_t* bp = ac_credt + sizeof("AC_CREDT") - sizeof('\0'); uint8_t* dp = bp; uint8_t entries = *dp++; size_t dpSize = *dp++; dpSize += *dp++ << 8; - Serial.printf("%d stored credential(s), size:%d\n", (int)entries, dpSize); + Serial.printf("%d stored credential(s),size:%d\n", (int)entries, dpSize); // Start EEPROM to Preferences migration uint8_t* ep = dp + dpSize - 1; @@ -92,7 +92,7 @@ void convert(uint8_t* eeprom, size_t size) { Serial.printf(":%02x", config.bssid[ei]); } bool rc = credential.save(&config); - Serial.println(rc ? " saved" : " failed to save"); + Serial.println(rc ? " transferred" : " failed to save Preferences"); } } } @@ -103,11 +103,11 @@ void setup() { Serial.println(); size_t eepromSize; - uint8_t* eepromData = retrievePartition(&eepromSize); + uint8_t* eepromData = retrievePartition("eeprom", &eepromSize); if (eepromData) { - Serial.println("Start EEPROM migration to Preferences"); + Serial.println("Start migration to Preferences"); convert(eepromData, eepromSize); - Serial.println("Conversion ended"); + Serial.println("Transfer ended"); free(eepromData); } } diff --git a/examples/CreditMigrate/CreditMigrate.md b/examples/CreditMigrate/CreditMigrate.md new file mode 100644 index 0000000..c1108cf --- /dev/null +++ b/examples/CreditMigrate/CreditMigrate.md @@ -0,0 +1,24 @@ +## CreditMigrate.ino - A migration tool for the saved credentials + +### Description + +Since AutoConnect v1.0.0 for ESP32, the storage location in the flash of established credentials has moved from EEPROM to Preferences. After You update AutoConnect to v1.0.0, past credentials saved by v0.9.12 earlier will *not be accessible* from the AutoConnect menu - **Open SSIDs**. You need to transfer once the stored credentials from the EEPROM area to the Preferences area. + +**CreditMigrate.ino** transports the credentials stored in EEPROM to the Preferences area to inherit them for AutoConnect v1.0.0 or later. + +### Restrictions + +- CreditMigrate.ino is only applicable to ESP32 boards. It cannot be executed with a compile error on the ESP8266 boards. (ESP8266 does not require credential migration.) +- CreditMigrate.ino will work properly with the installed ESP32 core version is 1.0.2 or earlier. (In ESP32 core 1.0.3, EEPROM area has moved from partition to the nvs. CreditMigrate.ino will not work properly with ESP32 core 1.0.3. ESP32 core 1.0.2 is recommended) + +### Saved credentials migration procedure on your ESP32 board + +1. Connect your host PC and ESP32 module with serial and start Arduino IDE. +2. Confirm that the version of the ESP32 core currently installed via the board manager of ArduinoIDE is 1.0.2 or earlier. +3. Open **CreditMigrate.ino** as a sketch in the examples of the AutoConnect library folder. +4. From the Arduino IDE menu: **Tools > Board:** to select the one that matches your ESP32 board and set it up. +5. Open the serial monitor of Arduino IDE. +6. From the Arduino IDE menu: **Sketch > Upload** to compile and upload the sketch. +7. It will transport the past credentials that had been stored in EEPROM to Preferences. You can confirm the result on the serial monitor. + + diff --git a/mkdocs/images/creditmigrate.png b/mkdocs/images/creditmigrate.png new file mode 100644 index 0000000000000000000000000000000000000000..39fd0293de60132caa27d245588eed5c2cc94e05 GIT binary patch literal 24675 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�Z0>KE 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 BjwS#A literal 0 HcmV?d00001 From 618d2522e8fcd199bf5fdfdae1bbd49a1e61bcc0 Mon Sep 17 00:00:00 2001 From: Hieromon Ikasamo Date: Wed, 11 Sep 2019 17:12:38 +0900 Subject: [PATCH 3/6] Rename README.md --- examples/CreditMigrate/{CreditMigrate.md => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/CreditMigrate/{CreditMigrate.md => README.md} (100%) diff --git a/examples/CreditMigrate/CreditMigrate.md b/examples/CreditMigrate/README.md similarity index 100% rename from examples/CreditMigrate/CreditMigrate.md rename to examples/CreditMigrate/README.md From 6766ba4722463b0f7a41a6ad2aab9ae1c317a912 Mon Sep 17 00:00:00 2001 From: Hieromon Ikasamo Date: Thu, 12 Sep 2019 01:28:02 +0900 Subject: [PATCH 4/6] Restored apielements.md --- docs/apielements.html | 823 ++++++++++++++++++++++++++++------ docs/search/search_index.json | 2 +- docs/sitemap.xml | 58 +-- docs/sitemap.xml.gz | Bin 404 -> 408 bytes mkdocs/apielements.md | 229 ++++++++-- 5 files changed, 923 insertions(+), 189 deletions(-) diff --git a/docs/apielements.html b/docs/apielements.html index dbe3af3..699badf 100644 --- a/docs/apielements.html +++ b/docs/apielements.html @@ -660,6 +660,13 @@ enable + + +
  • + + global + +
  • @@ -751,15 +758,22 @@ @@ -832,10 +853,31 @@ @@ -899,29 +969,29 @@ @@ -1015,14 +1092,21 @@
  • - + enable
  • - + + global + + +
  • + +
  • + label @@ -1043,7 +1127,7 @@
  • - + post @@ -1098,7 +1182,7 @@
  • - + size @@ -1151,6 +1235,20 @@ + +
  • + +
  • + + AutoConnectSubmit + + +