• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266WebServer иногда не отрабатывает запрос, и выводит что страница не найдена

nikiti_y

New member
Какая-то не понятная ситуация у меня происходит. Есть сервер написанный на ESP8266WebServer, у него есть несколько обработчиков. Иногда при запросе срабатывает исключение и выводит что страница не найдена, что очень странно, тк она есть. Ниже в коде оставил один из методов, который почти всегда такое выводит. Заметил что после каждого успешного запроса, нужно подождать примерно 15 секунд, чтоб следующий тоже был успешный. Предполагаю, что проблема с памятью, но никак не могу понять как это устранить.

Код:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ArduinoJson.h>

typedef struct {
  uint8_t pinNum;
  bool pinVal;
  const char* pinName;
} pinInit_t;

const char* ssid = "log";
const char* password = "pass";

bool SmartFlowers_mode = true;

ESP8266WebServer server(80);

pinInit_t digitPins[]{
  { D7, LOW, "light_0" }
};

void setup() {
  Serial.begin(115200);
  delay(100);
  for (byte i = 0; i < sizeof(digitPins) / sizeof(pinInit_t); ++i) {
    pinMode(digitPins[i].pinNum, OUTPUT);
    digitalWrite(digitPins[i].pinNum, SmartFlowers_mode ? digitPins[i].pinVal : 0);
  }

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");
  Serial.println(WiFi.localIP());

  // Handels
  server.on("/api/v1/get_metrics", get_metrics);
  server.onNotFound(handle_NotFound);
  server.enableCORS(true);

  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

void handle_NotFound() {
  server.send(404, "text/plain", "Not found");
}

void get_metrics() {
  char message[512];
  JsonDocument payload;
  JsonObject devises = payload["devises"].to<JsonObject>();
  JsonArray lights = devises["lights"].to<JsonArray>();
  for (byte i = 0; i < sizeof(digitPins) / sizeof(pinInit_t); ++i) {
    JsonObject light = lights.add<JsonObject>();
    light["name"] = digitPins[i].pinName;
    light["status"] = digitPins[i].pinVal;
  }
  payload["status"] = SmartFlowers_mode;

  serializeJson(payload, message);
  server.send(200, "application/json", message);
}
Подытожу: я делаю запрос по адресу /api/v1/get_metrics -> иногда получаю нормальный ответ, отработанной фун-ии, иногда получаю, что страница не найдена
 

fps

Active member
Я бы для начала попробовал без ArduinoJson.
Сначала прописал бы ответ message фиксированный. Если проблема при этом ушла, то сформировал бы message без использования ArduinoJson.
 

nikiti_y

New member
В общем это какая-то странная фигня. Все запросы тестировал через Postman, и эта проблема часто возникала. Начал писать фронт, запросы через JS отлично отрабатывают, ещё ни разу не смог отловить эту ошибку. Возможно у Postman какие-то заголовки или параметры странные передаются, которые ESP8266WebServer не воспринимает нормально. Надеюсь мой опыт кому нибудь пригодится
 
Сверху Снизу