#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);
}