ESP32 WebServer hört nach einer Zeit einfach auf zu antworten

Hallo Leude,
ich habe das Problem, dass mein ESP32 (NodeMCU ESP32 - Joy-IT) WebServer nach einer Zeit (immer Unterschiedlich von paar Minuten bis paar Stunden) nicht mehr antwortet. Dazu gehört zum einen das neu Anfragen der HTML-Seite (also einfach neuladen) und dass die WebSocket-Verbindung unterbrochen ist bzw. sich nicht wieder aufbauen kann, weswegen ich davon aus gehe, dass das Board generell nicht mehr ansprechbar ist. Es funktioniert erst wieder, wenn ich den ESP32 am EN reboote. Es gibt sonst keine Makel: Der Server läuft genau wie er soll und das ohne Verzögerungen (zum mindest jetzt… vorher hatte ich auch das Problem, dass beim Ein- und Ausschalten einer LED es Verzögerungen gab, was ich mit folgendem Code vor dem WiFI.begin() aus der Welt geschaffen habe:

WiFi.mode (WIFI_STA);

esp_wifi_set_ps(WIFI_PS_NONE);

).

Die Verbindung scheint dann einfach so nach einer Zeit einfach abzubrechen, wobei das eigentlich nur der Fall zu sein scheint, wenn keine Aktivität besteht (also weder neue http-Anfragen vom Client oder Interaktion am WebSocket) ich könnte aber auch falsch liegen, da ich nie so lange Aktiv am Client saß bis der eventuell mal die Verbindung abbrechen könnte. Ich schätze mal man kann den WebSocket bei der Problemlösung wegdenken, da ich das gleiche Problem schon ohne WebSocket hatte.

Arduino Code:

#include <WiFi.h>
#include <SPIFFS.h>
#include <ESPAsyncWebServer.h>
#include <WebSocketsServer.h>
#include <esp_pm.h>
#include <esp_wifi.h>
#include <esp_wifi_types.h>
 
// Constants
const char *ssid = "o2-WLAN81";
const char *password =  "W93F3LF86976BK99";
const char *msg_toggle_led = "toggleLED";
const char *msg_get_led = "getLEDState";
const int dns_port = 53;
const int http_port = 80;
const int ws_port = 1337;
const int led_pin = 5;

int brightness = 255;

const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;


 
// Globals
AsyncWebServer server(80);
WebSocketsServer webSocket = WebSocketsServer(1337);
char msg_buf[10];
int led_state = 0;
 
/***********************************************************
 * Functions
 */
 
// Callback: receiving any WebSocket message
void onWebSocketEvent(uint8_t client_num,
                      WStype_t type,
                      uint8_t * payload,
                      size_t length) {
 
  // Figure out the type of WebSocket event
  switch(type) {
 
    // Client has disconnected
    case WStype_DISCONNECTED:
      Serial.printf("[%u] Disconnected!\n", client_num);
      break;
 
    // New client has connected
    case WStype_CONNECTED:
      {
        IPAddress ip = webSocket.remoteIP(client_num);
        Serial.printf("[%u] Connection from ", client_num);
        Serial.println(ip.toString());
      }
      break;
 
    // Handle text messages from client
    case WStype_TEXT:
 
      // Toggle LED
      if ( strcmp((char *)payload, "toggleLED") == 0 ) {
        led_state = led_state ? 0 : 1;
        //Serial.printf("Toggling LED to %u\n", led_state);
        if (led_state == 0) {
          ledcWrite(ledChannel, 0);
        }
        else if (led_state == 1) {
          ledcWrite(ledChannel, brightness);
        }
 
      // Report the state of the LED
      } 
      
      else if ( strcmp((char *)payload, "getLEDState") == 0 ) {
        if (led_state == 0) {
          webSocket.sendTXT(client_num, "OFF");
        }
        else if (led_state == 1) {
          webSocket.sendTXT(client_num, "ON");
        }
        //Serial.printf("Sending to [%u]: %s\n", client_num, msg_buf);
      } 

      else if ( strcmp((char *)payload, "getBrightnessState") == 0 ) {
        sprintf(msg_buf, "%d", brightness);
        webSocket.sendTXT(client_num, msg_buf);
        
        //Serial.printf("Sending to [%u]: %s\n", client_num, msg_buf);
      } 
      
      else {
        brightness = atoi((const char*)&payload[0]);
        if (led_state == 1){
          ledcWrite(ledChannel, brightness);
        }
        
      }
      break;
 
    // For everything else: do nothing
    case WStype_BIN:
    case WStype_ERROR:
    case WStype_FRAGMENT_TEXT_START:
    case WStype_FRAGMENT_BIN_START:
    case WStype_FRAGMENT:
    case WStype_FRAGMENT_FIN:
    default:
      break;
  }
}
 
// Callback: send homepage
void onIndexRequest(AsyncWebServerRequest *request) {
  IPAddress remote_ip = request->client()->remoteIP();
  Serial.println("[" + remote_ip.toString() +
                  "] HTTP GET request of " + request->url());
  request->send(SPIFFS, "/index.html", "text/html");
}
 
// Callback: send style sheet
void onCSSRequest(AsyncWebServerRequest *request) {
  IPAddress remote_ip = request->client()->remoteIP();
  Serial.println("[" + remote_ip.toString() +
                  "] HTTP GET request of " + request->url());
  request->send(SPIFFS, "/style.css", "text/css");
}
 
// Callback: send 404 if requested file does not exist
void onPageNotFound(AsyncWebServerRequest *request) {
  IPAddress remote_ip = request->client()->remoteIP();
  Serial.println("[" + remote_ip.toString() +
                  "] HTTP GET request of " + request->url());
  request->send(404, "text/plain", "Not found");
}
 
/***********************************************************
 * Main
 */
 
void setup() {
  ledcSetup(ledChannel, freq, resolution);
  ledcAttachPin(led_pin, ledChannel);
 
  // Start Serial port
  Serial.begin(115200);
 
  // Make sure we can read the file system
  if( !SPIFFS.begin()){
    Serial.println("Error mounting SPIFFS");
    while(1);
  }
 
  // Connect to WiFi
  WiFi.mode (WIFI_STA);

  esp_wifi_set_ps(WIFI_PS_NONE);

  WiFi.begin(ssid, password);

  while ( WiFi.status() != WL_CONNECTED ) {
    delay(500);
    Serial.print(".");
  }
 
  // Print our IP address
  Serial.println();
  Serial.print("My IP address: ");
  Serial.println(WiFi.localIP());
 
  // On HTTP request for root, provide index.html file
  server.on("/", HTTP_GET, onIndexRequest);
 
  // On HTTP request for style sheet, provide style.css
  server.on("/style.css", HTTP_GET, onCSSRequest);
 
  // Handle requests for pages that do not exist
  server.onNotFound(onPageNotFound);
 
  // Start web server
  server.begin();
 
  // Start WebSocket server and assign callback
  webSocket.begin();
  webSocket.onEvent(onWebSocketEvent);
  
}



void loop() {

  webSocket.loop();
  
}

Ich bin echt dankbar für jegliche Hilfe! :slight_smile:

EDIT: Es scheint so dass es immer so ist… egal welchen Sketch ich benutze. Habe auch schon die Beispiel Sketches der Arduino IDE ohne Veränderung ausprobiert, wobei das gleich bei rauskam.