Я хочу сохранить учетные данные 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, которые я затем могу преобразовать в байт и передать в байтовый массив, но каждый раз что-то не работает. Может кто-нибудь может мне помочь?

1
SturmGhost 20 Дек 2019 в 02:07

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

Итак, первый байт правильный. Остальное не так.

0
SturmGhost 20 Дек 2019 в 10:34

Если я правильно понял, вы хотите сохранить новый 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;
    }
.
.
.
0
Pedro Zenha 20 Дек 2019 в 01:31