Я обнаружил странную проблему с подключением к сетям Wi-Fi из esp8266 с использованием библиотеки arduino.
В основном, если я жестко закодирую информацию Wi-Fi и передаю их функции, которая подключается к Wi-Fi, все работает отлично. Но если я сохраню эту информацию в файле (используя SPIFFS), а затем попытаюсь прочитать их и использовать их, esp не сможет подключиться к этой сети, он даже не выдаст никаких исключений или ошибок. Он просто действует так, будто сети там нет.
Это код, который я запускаю, конечно, только заинтересованные части:
Это мой импорт:
#include <Arduino.h>
#include <ArduinoJson.h>
#include "FS.h"
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WebServer.h>
#include <SocketIoClient.h>
ESP8266WiFiMulti wifiMulti;
ESP8266WebServer http_rest_server(80);
SocketIoClient webSocket;
Вот как я получаю информацию от пользователя и записываю ее в файл:
boolean addWifiNetwork(String ssid, String password)
{
File f = SPIFFS.open("/wifi.txt", "a");
if (!f)
{
Serial.println("file open failed");
return false;
}
Serial.println("====== Writing to SPIFFS wifi file =======");
f.println(ssid + "|" + password);
f.flush();
f.close();
return true;
}
void handleRestConfig()
{
StaticJsonBuffer<500> jsonBuffer;
String post_body = http_rest_server.arg("plain");
JsonObject &jsonBody = jsonBuffer.parseObject(http_rest_server.arg("plain"));
if (!jsonBody.success())
{
Serial.println("error in parsin json body");
http_rest_server.send(400);
}
else
{
addWifiNetwork(jsonBody["ssid"], jsonBody["password"]);
set_cors_headers();
http_rest_server.send(200);
}
}
void config_rest_server_routing()
{
http_rest_server.on("/", HTTP_OPTIONS, send_cors_headers);
http_rest_server.on("/", HTTP_GET, []() {
http_rest_server.send(200, "text/html", "Welcome to the ESP8266 REST Web Server");
});
http_rest_server.on("/addConfig", HTTP_OPTIONS, send_cors_headers);
http_rest_server.on("/addConfig", HTTP_POST, handleRestConfig);
}
Так я извлекаю данные из файла и добавляю их в список точек доступа wifiMulti. Я пытался реализовать разбивку строк многими способами, но ни один из них не дал другого результата.
boolean checkWifiConfig()
{
File f = SPIFFS.open("/wifi.txt", "r");
if (!f)
{
Serial.println("file open failed");
return false;
}
Serial.println("====== Reading from SPIFFS wifi file =======");
while (f.available())
{
String s = f.readStringUntil('\n');
char *line = new char[100];
s.toCharArray(line, 100);
const char *str = strtok(line, "|");
const char *s1 = str;
str = strtok(NULL, "|");
const char *s2 = str;
Serial.println(WiFi.macAddress());
if (wifiMulti.addAP(s1, s2))
{
Serial.println("AP added to multi");
}
else
{
Serial.println("Failed to add ap to multi");
}
Serial.println(s1);
Serial.println(s2);
Serial.println(s);
}
f.close();
return true;
}
Это функция настройки:
void setup()
{
Serial.begin(9600);
prepareSPIFFS();
if (checkConfigFile() && checkWifiConfig())
{
issetup = true;
while (wifiMulti.run() != WL_CONNECTED)
{
delay(500);
Serial.print('.');
}
// socketIOSetup();
}
else
{
issetup = false;
setupAP();
config_rest_server_routing();
setupRESTServer();
}
}
И вот что этот код печатает на последовательном мониторе:
Preparing SPIFSS
SPIFSS is ready
====== Reading from SPIFFS wifi file =======
38:2B:78:03:80:99
AP added to multi
Telefono Mi
Hello.txt
Telefono Mi|Hello.txt
...........................................
Странная вещь в том, что при попытке подключить esp к точке доступа смартфона и в режиме реального времени проверять подключенные устройства, я вижу, как MAC-адрес экрана Wi-Fi появляется примерно 1 секунду каждые 3/4 секунды, а затем исчезает.
Я потратил довольно много времени на это, но так как я в основном Java и веб-разработчик, у меня есть некоторые проблемы с кодом C. Я почти уверен, что проблема связана с тем, как я сохраняю и извлекаю данные из файла, я, вероятно, неправильно использую типы данных. Но на данный момент я действительно не могу понять, как заставить это работать.