Я хочу сохранить учетные данные Wi-Fi и некоторые другие конфигурации во флэш-памяти / EEPROM моего ESP8285.
Я получу строки из поля ввода веб-сервера. Я написал небольшой тестовый код, чтобы выяснить, работает ли сохранение и преобразование. Оказывается, это не так. Я не могу понять, как преобразовать массив символов в байтовый массив и игнорировать некоторые символы, такие как «:», когда я хочу сохранить MAC-адрес. Хранение SSID, пароля и канала работает хорошо, но MAC-адрес - нет.
Вот мой фрагмент кода при записи в EEPROM:
void writeCredentials() {
String newSSID = "WRT";
String newPass = "45568798789098794879784";
String newBSSID = "3A:79:16:A8:B5:76";
char buff[sizeof(settings.eeBSSID)];
byte mac[6];
char chBuff[3];
char *ptr;
newBSSID.toCharArray(buff, newBSSID.length() + 1);
Serial.println(buff);
ptr = strtok(buff, ":");
int index = 0;
while (ptr != NULL) {
strcpy(chBuff, ptr);
Serial.print(" Mac: ");
Serial.print(chBuff);
sscanf(&chBuff[2], "%02xd", &mac[index]); //no idea here maybe completely wrong
index++;
ptr = strtok(NULL, ":");
}
Serial.println("");
newSSID.toCharArray(settings.eeSSID, newSSID.length() + 1);
newPass.toCharArray(settings.eePass, newPass.length() + 1);
for (int i = 0; i < sizeof(mac); i++) {
Serial.println(char(mac[i]));
}
settings.eeChannel = 12345;
memcpy(settings.eeBSSID, mac, sizeof(mac));
EEPROM.put(0, settings);
Serial.println("Settings saved!");
}
В целях тестирования я добавляю строки в функцию writeCredentials (). Позже они будут поступать из формы ввода текста на веб-сервере. Все управляется такой конфигурационной структурой:
typedef struct WiFi_Settings {
char eeSSID[32];
char eePass[32];
byte eeBSSID[6];
int eeChannel;
};
WiFi_Settings settings {
"",
"",
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1
};
Я изо всех сил в течение нескольких часов пытаюсь преобразовать newBSSID в массив byte / uint8_t, который я могу сохранить в своей структуре и который позже будет использован для функции WiFi.begin ESP ...
Протестировал множество вариантов с помощью strtok, sscanf и попытался разбить массив char (сохраненный в buff) на биты по 2 части char, которые я затем могу преобразовать в байт и передать в байтовый массив, но каждый раз что-то не работает. Может кто-нибудь может мне помочь?
2 ответа
Я упростил код, чтобы охватить проблему с MAC-адресами.
typedef struct WiFi_Settings {
byte eeBSSID[6];
};
WiFi_Settings settings {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
};
void writeCredentials() {
String newBSSID = "3A:79:16:A8:B5:76";
char buff[18];
newBSSID.toCharArray(buff, newBSSID.length() + 1);
sscanf(buff, "%02xhhd:%02xhhd:%02xhhd:%02xhhd:%02xhhd:%02xhhd", &settings.eeBSSID[0], &settings.eeBSSID[1], &settings.eeBSSID[2], &settings.eeBSSID[3], &settings.eeBSSID[4], &settings.eeBSSID[5]);
EEPROM.put(0, settings);
Serial.println("Settings saved!");
Serial.print("Saved MAC: ");
for (int i = 0; i < sizeof(settings.eeBSSID); i++) {
Serial.print(settings.eeBSSID[i]);
if (i < 5) Serial.print(":");
}
Serial.println("");
}
Я попробовал решение, упомянутое П. Коуваракисом. К сожалению, это не работает полностью. Серийный выход:
Settings saved!
Saved MAC: 58:0:0:0:0:0
Итак, первый байт правильный. Остальное не так.
Если я правильно понял, вы хотите сохранить новый SSID и пароль с веб-сервера. Я сделал большой проект в прошлом году и сам создал WiFi Manager. Я только что нашел библиотеку, которую я создал, и вот как я делаю, чтобы загрузить новый SSID и pwd в EEPROM. Я надеюсь, что это помогает в вашей проблеме.
.
.
.
//New_ssid and New_pass were declared has String
if(New_Input == true){
int i=0;
char *SNew_ssid = &New_ssid[0u]; //Convert String to char
char *SNew_pass = &New_pass[0u];
Serial.print("Trying to connect to: ");
Serial.println(New_ssid);
WiFi.mode(WIFI_AP_STA); //AP e station
WiFi.begin(SNew_ssid,SNew_pass); //Connecting to new WiFi
while(WiFi.status() != WL_CONNECTED && i<100){
delay(200);
Serial.print(".");
i++;
}
if(WiFi.status() == WL_CONNECTED){ //Connected to new WiFi
Serial.println("");
//cleaning EEPROM
if(New_ssid.length() > 0 && New_pass.length() > 0){
Serial.println("Cleaning EEPROM...");
for(i = 0;i < 96;i++){
EEPROM.write(i,0);
}
}
//Writing to EEPROM
Serial.println("Writing SSID to EEPROM...");
for(i = 0;i < New_ssid.length(); i++){
EEPROM.write(i,New_ssid[i]);
}
Serial.println("Writing Password to EEPROM...");
for(i = 0;i < New_pass.length(); i++){
EEPROM.write(32+i,New_pass[i]);
}
EEPROM.commit();
.
.
.
Вот как можно получить данные из EEPROM, не зная, помогает вам это или нет. Эта часть кода является не библиотекой WiFiManager, а основным кодом.
.
.
.
Str_Buffer = "Reading SSID and PASSWORD from EEPROM...";
SendToPrinter(0,"aa",0);
eSSID = "\0";
for(int i = 0; i < 32; i++){
eSSID += char(EEPROM.read(i));
//Str_Buffer = char(EEPROM.read(i));
}
for(int i = 32; i < 96; i++){
ePASS += char(EEPROM.read(i));
}
//Ligação à rede Wifi
WiFi.mode(WIFI_STA); //Modo station
if(eSSID.length() > 1){ //If got any SSID stored at EEPROM
WiFi.begin(eSSID.c_str(),ePASS.c_str());
Str_Buffer = "Connecting to: ";
Str_Buffer += eSSID.c_str();
SendToPrinter(0,"aa",0);
}else{
WiFi.begin(ssid,pass);
Str_Buffer = "Connecting to: "; //Rede xhockware como definição
Str_Buffer += ssid;
SendToPrinter(0,"aa",0);
}
int i = 0;
//Checking Wi-Fi status
while(WiFi.status() != WL_CONNECTED && i<50){
delay(200);
Serial.print(".");
i++;
}
if(WiFi.status() == WL_CONNECTED){
Serial.println("");
Str_Buffer = "Connected to network";
SendToPrinter(0,"aa",0);
flag_ifWifiConnected = true;
}
if(i == 50){
Serial.println("");
Str_Buffer = "Error connecting to network";
SendToPrinter(0,"aa",0);
flag_ifWifiConnected = false;
}
.
.
.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.