如果信息来自文件,则Esp8266 Arduino无法连接到wifi

时间:2018-11-04 17:57:32

标签: c++ esp8266 arduino-esp8266

我遇到了使用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代码时遇到了一些麻烦。我很确定问题出在我如何从文件中存储和检索数据有关,我可能以错误的方式使用了数据类型。但是到目前为止,我真的不知道该如何做。

0 个答案:

没有答案