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