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

ESP8266与Node.js WebSocket连接间歇性断开问题求助

问题分析与解决方案

错误码er -13的含义

ESP8266上的er -13错误码对应TCP连接被远端重置(ESP_ERR_TCP_CONNECTION_RESET),大概率是以下两种情况:

  • Node.js服务器主动断开了空闲连接
  • 中间网络设备(如路由器)因连接长时间无数据交互,触发超时回收机制

排查与修复步骤

1. 检查服务器端WebSocket超时配置

如果使用的是ws库(Node.js最常用的WebSocket库),默认会对空闲连接设置超时。如果客户端长时间没有发送数据,服务器会主动重置连接。可以修改服务器配置,调整超时参数或优化心跳逻辑:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ 
  port: 8080,
  pingInterval: 30000,  // 每30秒向客户端发送Ping帧
  pingTimeout: 60000    // 60秒未收到Pong则断开连接
});

注意:服务器的pingInterval应小于路由器的TCP空闲超时(多数路由器默认是5分钟),确保连接被持续激活。

2. 客户端添加心跳机制

ESP8266端必须定期发送心跳帧(Ping),避免连接被判定为空闲。修改Arduino代码,添加心跳逻辑:

#include <ArduinoWebsockets.h>
using namespace websockets;

WebsocketsClient client;
unsigned long lastPing = 0;
const unsigned long HEARTBEAT_INTERVAL = 15000; // 每15秒发送一次Ping

void setup() {
  // 原有Wi-Fi连接、WebSocket初始化逻辑
  // ...
}

void loop() {
  client.loop();

  // 心跳处理
  if(millis() - lastPing > HEARTBEAT_INTERVAL) {
    if(client.isConnected()) {
      client.sendPing();
      lastPing = millis();
    }
  }

  // 原有计数器发送逻辑
  static int count = 0;
  if(client.isConnected()) {
    count++;
    client.send(String(count));
    if(count >=10) count =0;
    delay(1000);
  } else {
    // 重连逻辑
    // ...
  }
}

3. 排查库版本兼容性问题

  • 升级ESP8266 Arduino核心库到最新稳定版,避免旧版TCP栈的连接稳定性bug
  • 升级ArduinoWebsockets库到最新版,部分旧版本存在WebSocket帧解析或连接维持的问题

4. 服务器端资源排查

检查Node.js服务器的资源使用情况:

  • 用top或htop查看CPU、内存占用,排除内存泄漏导致的连接异常断开
  • 检查服务器日志,是否有连接数超限、端口耗尽的报错

日志验证

观察PowerShell控制台的计数器中断点:如果断开发生在计数器循环结束后的空闲期,基本可以确认是空闲超时导致的连接重置;如果是在发送数据过程中断开,则需要进一步排查数据帧格式是否合规(比如是否有非法字符、帧长度超限)。

内容的提问来源于stack exchange,提问作者Wenner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:42:41