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
相关产品推荐
相关产品推荐

