Esp32 AsynWebserver Websocket崩溃

Esp32 AsynWebserver Websocket崩溃,websocket,webserver,esp32,arduino-esp32,Websocket,Webserver,Esp32,Arduino Esp32,我正在尝试使用ESPAsycnWebserver库使用websocket构建异步webserver。一切正常,但有一个时刻:当我刷新多次:13或29次时,它会崩溃并重新启动。我认为有记忆问题,但不知道如何解决。以下是控制台输出和工作代码: Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled. Core 1 register dump: PC : 0x401705a7 PS

我正在尝试使用ESPAsycnWebserver库使用websocket构建异步webserver。一切正常,但有一个时刻:当我刷新多次:13或29次时,它会崩溃并重新启动。我认为有记忆问题,但不知道如何解决。以下是控制台输出和工作代码:

 Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x401705a7  PS      : 0x00060c30  A0      : 0x800d30de  A1      : 0x3ffb1ef0  
A2      : 0x3ffb1f3c  A3      : 0x00000001  A4      : 0x80089a44  A5      : 0x3ffd0ec0
A6      : 0x00000000  A7      : 0x3ffb0060  A8      : 0x3ffc6e17  A9      : 0x00000001  
A10     : 0x00000003  A11     : 0x00060a23  A12     : 0x00000005  A13     : 0x00000020
A14     : 0x00000020  A15     : 0x3ffd1391  SAR     : 0x00000018  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000001  LBEG    : 0x4000c2e0  LEND    : 0x4000c2f6  LCOUNT  : 0xffffffff

ELF file SHA256: 0000000000000000

Backtrace: 0x401705a7:0x3ffb1ef0 0x400d30db:0x3ffb1f10 0x400d31e9:0x3ffb1f30 0x400d3231:0x3ffb1f70 0x400d0ed4:0x3ffb1f90 0x400dffdd:0x3ffb1fb0 0x40089832:0x3ffb1fd0
  #0  0x401705a7:0x3ffb1ef0 in std::_Function_handler<bool (AsyncWebSocketClient* const&), AsyncWebSocket::count() const::{lambda(AsyncWebSocketClient*)#1}>::_M_invoke(std::_Any_data const&, AsyncWebSocketClient* const&) at .pio\libdeps\esp32doit-devkit-v1\ESP Async WebServer\src/AsyncWebSocket.cpp:850
  #1  0x400d30db:0x3ffb1f10 in std::function<bool (AsyncWebSocketClient* const&)>::operator()(AsyncWebSocketClient* const&) const at .pio\libdeps\esp32doit-devkit-v1\ESP Async WebServer\src/AsyncWebSocket.cpp:850
  #2  0x400d31e9:0x3ffb1f30 in LinkedList<AsyncWebSocketClient*, LinkedListNode>::count_if(std::function<bool (AsyncWebSocketClient* const&)>) const at .pio\libdeps\esp32doit-devkit-v1\ESP Async WebServer\src/AsyncWebSocket.cpp:850
      (inlined by) AsyncWebSocket::count() const at .pio\libdeps\esp32doit-devkit-v1\ESP Async WebServer\src/AsyncWebSocket.cpp:904
  #3  0x400d3231:0x3ffb1f70 in AsyncWebSocket::cleanupClients(unsigned short) at .pio\libdeps\esp32doit-devkit-v1\ESP Async WebServer\src/AsyncWebSocket.cpp:850
  #4  0x400d0ed4:0x3ffb1f90 in loop() at src/main.cpp:82
  #5  0x400dffdd:0x3ffb1fb0 in loopTask(void*) at C:\Users\_Terminal\.platformio\packages\framework-arduinoespressif32\cores\esp32/main.cpp:23    
  #6  0x40089832:0x3ffb1fd0 in vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c:355 (discriminator 1)

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:10124
load:0x40080400,len:5828
entry 0x400806a8
Guru冥想错误:核心1恐慌(禁止加载)。异常未处理。
核心1寄存器转储:
PC:0x401705a7 PS:0x00060c30 A0:0x800d30de A1:0x3ffb1ef0
A2:0x3ffb1f3c A3:0x00000001 A4:0x80089a44 A5:0x3ffd0ec0
A6:0x00000000 A7:0x3ffb0060 A8:0x3ffc6e17 A9:0x00000001
A10:0x00000003 A11:0x00060a23 A12:0x00000005 A13:0x00000020
A14:0x00000020 A15:0x3ffd1391 SAR:0x00000018原因:0x0000001c
EXCVADR:0x00000001 LBEG:0x4000c2e0借出:0x4000c2f6 LCOUNT:0xFFFFFF
ELF文件SHA256:0000000000000000
回溯:0x401705a7:0x3ffb1ef0 0x400d30db:0x3ffb1f10 0x400d31e9:0x3ffb1f30 0x400d3231:0x3ffb1f70 0x400d0ed4:0x3ffb1f90 0x400dffdd:0x3ffb1fb0 0x40089832:0x3ffb1fd0
#0 0x401705a7:0x3ffb1ef0在std::_Function_handler::_M_invoke(std:_Any_data const&,AsyncWebSocketClient*const&)中位于.pio\libdeps\esp32doit-devkit-v1\ESP Async WebServer\src/AsyncWebSocket.cpp:850
#std::function::operator()(AsyncWebSocketClient*const&)const at.pio\libdeps\esp32doit-devkit-v1\ESP Async WebServer\src/AsyncWebSocket.cpp:850中的1 0x400d30db:0x3ffb1f10
#LinkedList中的2 0x400d31e9:0x3ffb1f30::count_if(std::function)const at.pio\libdeps\esp32doit-devkit-v1\ESP Async WebServer\src/AsyncWebSocket.cpp:850
(内联)AsyncWebSocket::count()常量位于.pio\libdeps\esp32doit-devkit-v1\ESP Async WebServer\src/AsyncWebSocket.cpp:904
#3 0x400d3231:0x3ffb1f70位于.pio\libdeps\esp32doit-devkit-v1\ESP Async WebServer\src/AsyncWebSocket.cpp处的AsyncWebSocket::CleanupClient(无符号短)中
#src/main.cpp:82处的4 0x400d0ed4:0x3ffb1f90 in循环()
#5 0x400dffdd:0x3ffb1fb0位于C:\Users\\ U Terminal\.platformio\packages\framework-ArduinoEspressF32\cores\esp32/main.cpp:23的loopTask(void*)中
#6 0x40089832:0x3ffb1fd0位于/home/runner/work/esp32 arduino lib builder/esp32 arduino lib builder/esp idf/components/freertos/port.c:355(鉴别器1)
重新启动。。。
ets 2016年6月8日00:22:57
rst:0xc(软件CPU重置),引导:0x13(SPI快速闪存引导)
配置SIP:0,SPIWP:0xee
clk_drv:0x00、q_drv:0x00、d_drv:0x00、cs0_drv:0x00、hd_drv:0x00、wp_drv:0x00
模式:DIO,时钟分区:2
加载:0x3fff0018,长度:4
负载:0x3fff001c,透镜:1044
负载:0x40078000,透镜:10124
负载:0x40080400,透镜:5828
条目0x400806a8
代码:前面

<script>
  var gateway = `ws://192.168.0.105/ws`;
  var websocket;
  window.addEventListener('load', onLoad);
  function initWebSocket() {
    console.log('Trying to open a WebSocket connection...');
    websocket = new WebSocket(gateway);
    websocket.onopen    = onOpen;
    websocket.onclose   = onClose;
    websocket.onmessage = onMessage; // <-- add this line
  }
  function onOpen(event) {
    console.log('Connection opened');
  }
  function onClose(event) {
    console.log('Connection closed');
    setTimeout(initWebSocket, 2000);
  }
  function onMessage(event) {
    var state;
    if (event.data == "1"){
      state = "ON";
    }
    else{
      state = "OFF";
    }
    document.getElementById('state').innerHTML = state;
  }
  function onLoad(event) {
    initWebSocket();
    initButton();
  }
  function initButton() {
    document.getElementById('button').addEventListener('click', toggle);
  }
  function toggle(){
    websocket.send('toggle');
  }
</script>

var gateway=`ws://192.168.0.105/ws`;
var-websocket;
window.addEventListener('load',onLoad);
函数initWebSocket(){
log('试图打开WebSocket连接…');
websocket=新的websocket(网关);
websocket.onopen=onopen;
websocket.onclose=onclose;
websocket.onmessage=onmessage;//id(),client->remoteIP().toString().c_str());
客户端->ping();
}
else if(类型==WS_EVT_断开){
Serial.printf(“ws[%s][%u]断开连接:%u\n”,服务器->url(),客户端->id(),客户端->id());
}
else if(type==WS\u EVT\u ERROR){
Serial.printf(“ws[%s][%u]错误(%u):%s\n”、服务器->url()、客户端->id()、*((uint16_t*)参数、(字符*)数据);
}
else if(type==WS\u EVT\u PONG){
Serial.printf(“ws[%s][%u]pong[%u]:%s\n”,服务器->url(),客户端->id(),len,(len)?(char*)数据:“”);
}
else if(类型==WS_EVT_数据){
AwsFrameInfo*info=(AwsFrameInfo*)参数;
如果(信息->最终和信息->索引==0和信息->len==len){
Serial.printf(“ws[%s][%u]%s-message[%llu]:”,服务器->url(),客户端->id(),(信息->操作码==ws\u文本)?“文本”:“二进制”,信息->len);
如果(信息->操作码==WS\u文本){
数据[len]=0;
Serial.printf(“%s\n”,(char*)数据);
if(strcmp((char*)数据,“切换”)==0){
ledState=!ledState;
数字写入(ledPin、ledState);
}
} 
}
}
}
无效设置(){
//用于调试的串行端口
序列号开始(115200);
引脚模式(LED引脚,输出);
//连接到Wi-Fi
WiFi.begin(ssid,密码);
while(WiFi.status()!=WL_已连接){
延迟(1000);
Serial.println(“连接到WiFi…”);
}
//打印ESP本地IP地址
Serial.println(WiFi.localIP());
ws.onEvent(onEvent);
addHandler(&ws);
//启动服务器
server.begin();
}
void循环(){
ws.cleanupClients();
}
// Import required libraries
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>

// Replace with your network credentials
const char* ssid = "home";
const char* password = "qwertyui";

bool ledState = 0;
const int ledPin = 26; 

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
AsyncWebSocket ws("/ws");



void onEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len) {
  if(type == WS_EVT_CONNECT){
    Serial.printf("New Client #%u from %s\n",client->id(),client->remoteIP().toString().c_str());
    client->ping();
  }
  else if(type == WS_EVT_DISCONNECT){
    Serial.printf("ws[%s][%u] disconnect: %u\n", server->url(), client->id(), client->id());
  }
  else if(type == WS_EVT_ERROR){
    Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data);
  }
  else if(type == WS_EVT_PONG){
    Serial.printf("ws[%s][%u] pong[%u]: %s\n", server->url(), client->id(), len, (len)?(char*)data:"");
  }
  else if(type == WS_EVT_DATA){
    AwsFrameInfo* info = (AwsFrameInfo*)arg;

    if(info->final && info->index==0 && info->len == len){
      Serial.printf("ws[%s][%u] %s-message[%llu]: ", server->url(), client->id(), (info->opcode == WS_TEXT)?"text":"binary", info->len);

      if(info->opcode == WS_TEXT){
        data[len] = 0;
        Serial.printf("%s\n", (char*)data);
        if(strcmp((char*)data,"toggle")==0){
          ledState = !ledState;
          digitalWrite(ledPin,ledState);
        }
      } 
    }
  }
}


void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);

  pinMode(ledPin, OUTPUT);
  
  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Print ESP Local IP Address
  Serial.println(WiFi.localIP());

  ws.onEvent(onEvent);
  server.addHandler(&ws);

  // Start server
  server.begin();
}

void loop() {
  ws.cleanupClients();
}