ESP32 AsyncWebServer с softAP не обслуживает страницы

esp32 web-server spiffs

Я пытаюсь создать AsyncWebServer после включения SoftAP:

#include <Arduino.h>
#include <SPIFFS.h>
#include <WiFi.h>
#include <WiFiAP.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>

WebApp webapp;

void setup() 
{
  Serial.begin(115200);
  SPIFFS.begin();

  File f = SPIFFS.open("/index.html");
  String s = f.readString();
  Serial.println(s);
  f.close();

  WiFi.softAP("ssid", NULL);
  WiFi.softAPsetHostname("ssid");
  Serial.println(WiFi.softAPIP());

  webapp.Begin();
}

void loop()
{
}

class WebApp
{
public:
    WebApp();
    void Begin();

private:
    AsyncWebServer _server;
};

#include "webapp.h"

WebApp::WebApp() : _server(80)
{
}

void WebApp::Begin()
{
  _server.on("/", HTTP_GET, [this](AsyncWebServerRequest *request)
  {
    Serial.println("GET request");
    _server.serveStatic("/", SPIFFS, "/").setDefaultFile("/index.html");
  });

  _server.onNotFound([](AsyncWebServerRequest *request){
    request->send(404);
  });

  _server.begin();
  Serial.println("[WEB] HTTP server started");
}

SoftAP открывает сеть, и я могу подключиться к ней (softAPgetStationNum() сообщает мне, что подключен 1 клиент). На пинги отвечает. index.html сохраняется во флэш-памяти (содержимое распечатывается правильно).

Но когда я пытаюсь открыть корневую страницу (192.168.4.1), она выводит "GET request" но время ожидания запроса браузера истекло, и ничего не получено.

Я что-то упустил в коде?

, 👍0


2 ответа


Лучший ответ:

3

Использование serveStatic() неверно. Он не предназначен для использования внутри обратного вызова. Просто поместите вызов в настройки веб-сервера, т.е.:

void WebApp::Begin()
{
  _server.serveStatic("/", SPIFFS, "/").setDefaultFile("/index.html");

  _server.onNotFound([](AsyncWebServerRequest *request)
  {
    request->send(404);
  });

  _server.begin();
  Serial.println("[WEB] HTTP server started");
}
,

3

У меня недостаточно представителей, чтобы прокомментировать ваше сообщение, но возможно ли, что когда вы указываете параметр для функции setDefaultFile(), косая черта на / index.html приводит к тому, что путь к файлу будет //index.html вместо /index.html.

Потому что serveStatic, вероятно, добавляет имя файла setDefaultFile() в корневой каталог / (третий параметр serveStatic()). , вы, вероятно, получаете лишний символ, который вам не нужен в вашем пути к файлу.

TL;DR вам не нужен / в index.html для setDefaultFile().

См. https://github.com/me-no-dev/ESPAsyncWebServer#. например, файлы-в-каталоге.

,

Я попробую это как можно скорее. Но в таком случае не должны ли просто попасть в 404?, @Mark

Пытался. Это ничего не меняет. Я могу получить доступ к странице, используя полный адрес (например, 192.168.4.1/index.html), но часто срабатывает wdt и перезагружается ESP32. Страницы очень легкие, менее 6 Кбайт, @Mark

Перезагрузка страницы обычно приводит к 404, @Mark

Подтверждаю, проблема осталась., @Mark