• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 не воспринимает нормально. Надеюсь мой опыт кому нибудь пригодится
 
Сверху Снизу