我遇到了使用arduino库从esp8266连接到wifi网络的奇怪问题。
基本上,如果我对wifi信息进行硬编码并将它们传递给连接到wifi的功能,则一切都很好。但是,如果我将这些信息存储在文件中(使用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 AP列表的方式,我试图以多种方式实现字符串拆分,但没有一个给出不同的结果。
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连接到智能手机热点,并实时检查所连接的设备,我可以看到wifi防护罩的MAC地址每3/4秒增加大约1秒,然后消失。
我花了很多时间在此上,但是由于我主要是Java和Web开发人员,所以我在使用C代码时遇到了一些麻烦。我很确定问题出在我如何从文件中存储和检索数据有关,我可能以错误的方式使用了数据类型。但是到目前为止,我真的不知道该如何做。