You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32 C3 websocket webserver未联网时数据包延迟丢失问题咨询

问题根因

你遇到的离线状态下WebSocket延迟、丢包问题,核心原因是WiFi STA模式未彻底关闭,后台持续扫描重连占用系统资源,其次是服务优先级、多余服务运行带来的额外开销,和WiFi.disconnect()本身无关,不需要额外断开WebServer和外网的关联,只需按以下步骤优化:

优化方案

1. 彻底关闭不需要的STA模式

你的代码初始WiFi模式设为WIFI_AP_STA,就算调用WiFi.disconnect(),STA模式仍处于激活状态,底层会自动持续扫描周边WiFi、尝试重连,占用大量WiFi射频和CPU资源,是离线状态卡顿的核心原因。
在3组WiFi都连接失败的分支里,增加切换仅AP模式的逻辑,同时关闭不需要的外网服务:

else { 
  Serial.println("NO INTERNET"); 
  WiFi.disconnect();
  // 新增:切换到仅AP模式,停止STA的所有后台逻辑
  WiFi.mode(WIFI_AP);
  // 新增:停止仅外网需要的MDNS、NTP服务,避免无效请求重试占用资源
  MDNS.end();
  timeClient.end();
  dnsServer.start(53, "*", WiFi.softAPIP());
}

2. 优化主循环执行逻辑

原循环的服务处理顺序不合理、固定20ms延迟会放大WebSocket处理延迟,调整为优先处理实时性要求高的WebSocket,移除固定延迟:

void loop() {
  // 优先处理WebSocket数据,避免包积压
  webSocket.loop();
  dnsServer.processNextRequest();
  server.handleClient();
  WiFiClient client = server2.available(); 
  // 仅当无任何待处理请求时做短延迟,降低空转功耗同时不影响响应速度
  if(!client && !server.hasClient() && webSocket.connectedClients() == 0) {
    delay(1);
  }
}

3. 调整WebSocket配置参数

优化WebSocket的心跳、缓冲区配置,避免离线状态下连接超时、包截断:
在webSocket.begin()之后新增配置:

// 心跳配置:5秒无活动发送心跳包,3秒无响应判定断开
webSocket.setKeepAlive(5000, 3000);
// 根据你的业务包大小调整缓冲区上限,默认缓冲区过小会导致大包被拆分延迟
webSocket.setMaxBufferSize(1024);

4. 前端连接优化

离线状态下MDNS解析可靠性低,前端WebSocket连接优先直接使用AP的IP地址,避免DNS解析开销:
把前端的WebSocket连接地址从ws://espserver.local:81改为ws://192.168.1.4:81即可。

5. 清理多余服务

如果80端口的server2没有实际业务用途,直接删除相关初始化和循环处理逻辑,减少不必要的端口监听开销。


内容的提问来源于stack exchange,提问作者Aleš Kramžar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:06:05