ESP32 writeStringEEPROM добавляет нежелательные элементы, когда я использую букву «

#arduino #esp32 #eeprom

#arduino #esp32 #eeprom

Вопрос:

Я пытаюсь использовать этот код:https://github.com/jatocode/WifiConnect/blob/master/WifiConnect/WifiConnect.ino с моим ESP32. Проблема в том, что имя моей сети Wi-Fi «y amp; t», и когда я пытаюсь его использовать, программа сохраняет в EEPROM «y amp; 26t», с именами других сетей в моем регионе проблем нет.

введите описание изображения здесь
введите описание изображения здесь

Я буду очень признателен, если кто-нибудь знает, как решить эту проблему.

Комментарии:

1. esp32 сохраняет SSID и пароль, используемые в begin (), для прошивки, если значение WiFi.persistent равно true (по умолчанию это так), и использует его при загрузке, если значение WiFi.setAutoConnect равно true (тоже по умолчанию). так зачем хранить это в EEPROM? этот эскиз предназначен для esp8266, но он должен работать и для esp32 с небольшими изменениями github.com/jandrassy/lab/blob/master/ConfigurationAP / …

2. сохранит ли он учетные данные после OTA? спасибо, что пытались помочь!

3. почему бы и нет? OTA не имеет к этому никакого отношения

4. Я попробовал эту программу, и у меня был тот же результат, вместо y amp; t он дает y% 26t :/

5. это кодировка URL из браузера. вы должны ее расшифровать. w3schools.com/tags/ref_urlencode.ASP

Ответ №1:

Благодаря @Juraj я решил проблему.

Я использовал в этом коде декодер отсюда:https://circuits4you.com/2019/03/21/esp8266-url-encode-decode-example /

 /*
  Configuration AP example
  The example shows a very simple Configuration Access Point.
  created in August 2019
  by Juraj Andrassy https://github.com/jandrassy
*/
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>
#include <Arduino.h>
// #include <String.h>

String urldecode(String str);
unsigned char h2int(char c);

void setup() {

  Serial.begin(115200);
  delay(500);

  // WiFi.disconnect(); // forget the persistent connection to test the Configuration AP
  
  WiFi.persistent(true);

  // waiting for connection to remembered  Wifi network
  Serial.println("Waiting for connection to WiFi");
  WiFi.begin(); // use SSID and password stored by SDK
  WiFi.waitForConnectResult();

  if (WiFi.status() != WL_CONNECTED) {
    Serial.println();
    Serial.println("Could not connect to WiFi. Starting configuration AP...");
    configAP();
  } else {
    Serial.println("WiFi connected");
  }
}

void loop() {
}

void configAP() {

  WiFiServer configWebServer(80);

  WiFi.mode(WIFI_AP_STA); // starts the default AP (factory default or setup as persistent)

  Serial.print("Connect your computer to the WiFi network ");
  // Serial.print(WiFi.softAP());
  Serial.println();
  IPAddress ip = WiFi.softAPIP();
  Serial.print("and enter http://");
  Serial.print(ip);
  Serial.println(" in a Web browser");

  configWebServer.begin();

  while (true) {

    WiFiClient client = configWebServer.available();
    if (client) {
      char line[64];
      int l = client.readBytesUntil('n', line, sizeof(line));
      line[l] = 0;
      client.find((char*) "rnrn");
      if (strncmp_P(line, PSTR("POST"), strlen("POST")) == 0) {
        l = client.readBytes(line, sizeof(line));
        line[l] = 0;

        // parse the parameters sent by the html form
        const char* delims = "=amp;";
        strtok(line, delims);
        const char* ssid = strtok(NULL, delims);
        strtok(NULL, delims);
        const char* pass = strtok(NULL, delims);
        
        // decoding the ssid and the password for ASCII characters
        String ssidS = String(ssid);
        String ssidSdecode= urldecode(ssidS);
        ssid=const_cast<char*>(ssidSdecode.c_str());
        String passS = String(pass);
        String passSdecode= urldecode(passS);
        pass=const_cast<char*>(passSdecode.c_str());
        
        // send a response before attemting to connect to the WiFi network
        // because it will reset the SoftAP and disconnect the client station
        client.println(F("HTTP/1.1 200 OK"));
        client.println(F("Connection: close"));
        client.println(F("Refresh: 10")); // send a request after 10 seconds
        client.println();
        client.println(F("<html><body><h3>Configuration AP</h3><br>connecting...</body></html>"));
        client.stop();

        Serial.println();
        Serial.print("Attempting to connect to WPA SSID: ");
        Serial.println(ssid);
        WiFi.begin(ssid, pass);
        WiFi.waitForConnectResult();

        // configuration continues with the next request

      } else {

        client.println(F("HTTP/1.1 200 OK"));
        client.println(F("Connection: close"));
        client.println();
        client.println(F("<html><body><h3>Configuration AP</h3><br>"));

        int status = WiFi.status();
        if (status == WL_CONNECTED) {
          client.println(F("Connection successful. Ending AP."));
        } else {
          client.println(F("<form action='/' method='POST'>WiFi connection failed. Enter valid parameters, please.<br><br>"));
          client.println(F("SSID:<br><input type='text' name='i'><br>"));
          client.println(F("Password:<br><input type='password' name='p'><br><br>"));
          client.println(F("<input type='submit' value='Submit'></form>"));
        }
        client.println(F("</body></html>"));
        client.stop();

        if (status == WL_CONNECTED) {
          delay(1000); // to let the SDK finish the communication
          Serial.println("Connection successful. Ending AP.");
          configWebServer.stop();
          WiFi.mode(WIFI_STA);
        }
      }
    }
  }
}

String urldecode(String str) {
    String encodedString="";
    char c;
    char code0;
    char code1;
    for (int i =0; i < str.length(); i  ) {
        c=str.charAt(i);
      if (c == ' ') {
        encodedString =' ';  
      } else if (c == '%') {
        i  ;
        code0=str.charAt(i);
        i  ;
        code1=str.charAt(i);
        c = (h2int(code0) << 4) | h2int(code1);
        encodedString =c;
      } else {
        encodedString =c;  
      }
      
      yield();
    }
  return encodedString;
}
 
unsigned char h2int(char c) {
    if (c >= '0' amp;amp; c <='9') {
        return((unsigned char)c - '0');
    }
    
    if (c >= 'a' amp;amp; c <='f') {
        return((unsigned char)c - 'a'   10);
    }
    
    if (c >= 'A' amp;amp; c <='F') {
        return((unsigned char)c - 'A'   10);
    }
    return(0);
}