Esp8266 Arduino не может подключиться к Wi-Fi, если информация поступает из файла - PullRequest
0 голосов
/ 04 ноября 2018

Я обнаружил странную проблему с подключением к сетям 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. Я почти уверен, что проблема связана с тем, как я сохраняю и извлекаю данные из файла, я, вероятно, неправильно использую типы данных. Но на данный момент я действительно не могу понять, как заставить это работать.

...