Arduino ESP8266 WebSocket随机断开连接问题求助
解决NodeMCU WebSocket闲置断开的问题
针对你遇到的WebSocket闲置后随机断开的问题,以下是几个实用的本地解决方案,无需依赖额外WiFi信号优化:
1. 实现WebSocket心跳机制
WebSocket协议本身无内置保活机制,闲置过久会被路由器或服务器主动断开。定时发送心跳包可维持连接:
- NodeMCU端代码:添加定时器,每隔30秒广播心跳标识
#include <WebSocketsServer.h> WebSocketsServer webSocket = WebSocketsServer(81); unsigned long lastHeartbeat = 0; const long heartbeatInterval = 30000; // 30秒间隔 void loop() { webSocket.loop(); unsigned long currentMillis = millis(); if (currentMillis - lastHeartbeat >= heartbeatInterval) { lastHeartbeat = currentMillis; webSocket.broadcastTXT("ping"); } } - 前端代码:监听心跳并回复,同时检测长时间未收到心跳时触发重连
let ws; let lastHeartbeatReceived = Date.now(); const heartbeatCheckInterval = 60000; // 60秒检查一次 function initWebSocket() { ws = new WebSocket('ws://你的NodeMCU_IP地址/ws'); ws.onmessage = (event) => { if (event.data === "ping") { ws.send("pong"); lastHeartbeatReceived = Date.now(); } else { // 处理正常数据更新逻辑 } }; setInterval(() => { if (Date.now() - lastHeartbeatReceived > heartbeatCheckInterval && ws.readyState === WebSocket.OPEN) { ws.close(); } }, heartbeatCheckInterval); }
2. 关闭NodeMCU WiFi睡眠模式
NodeMCU默认的WiFi睡眠模式会导致闲置时连接不稳定,进而断开WebSocket。在WiFi连接成功后添加:
WiFi.setSleepMode(WIFI_NONE_SLEEP); // 关闭WiFi睡眠 WiFi.setAutoReconnect(true); // 开启WiFi自动重连
3. 前端自动重连逻辑
监听WebSocket断开事件,用指数退避策略自动重试连接,避免频繁请求:
let retryDelay = 2000; // 初始重试间隔2秒 const maxRetryDelay = 30000; // 最大重试间隔30秒 function connectWebSocket() { ws = new WebSocket('ws://你的NodeMCU_IP地址/ws'); ws.onopen = () => { console.log('WebSocket连接成功'); retryDelay = 2000; // 连接成功后重置重试间隔 }; ws.onclose = () => { console.log('WebSocket断开,准备重连'); setTimeout(connectWebSocket, Math.min(retryDelay *= 2, maxRetryDelay)); }; // 其他数据处理逻辑 } connectWebSocket();
4. 调整WebSocket库超时设置
若使用WebSocketsServer库,可延长超时时间,避免服务器主动断开闲置连接:
webSocket.setTimeout(60000); // 设置超时为60秒(默认值通常更短)
内容的提问来源于stack exchange,提问作者Oxygenic
相关产品推荐
相关产品推荐

