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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:02:33