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

ESP8266断电时Workerman WebSocket服务器未触发onClose的问题求助

问题:ESP8266断电时Workerman WebSocket服务器无法触发onClose事件

我基于ESP8266制作了一台设备,通过WebSocketsClient.h库连接PHP Workerman WebSocket服务器,连接可正常建立。但关闭设备电源时,服务器无法收到onClose信号,而我需要持续监控设备的连接状态。使用浏览器通过WebSocket连接并关闭标签页时,服务器能正常收到关闭信号。我已尝试开启webSocket.enableHeartbeat(10000, 5000, 2),但无效果,请问如何让服务器识别ESP8266的断开?

WebSocket服务器代码(server.php)

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\Lib\Timer;

$context = array(
  'ssl' => array(
    'local_cert'  => '/etc/letsencrypt/live/***.com/fullchain.pem',
    'local_pk'    => '/etc/letsencrypt/live/***.com/privkey.pem',
    'verify_peer' => false,
    'allow_self_signed' => true,
    'verify_peer_name' => false,
  )
);

$ws_worker = new Worker("websocket://***.com:8888", $context);
$ws_worker->transport = 'ssl';

$ws_worker->onConnect = function($connection) use (&$devices)
{
    echo "Connection id: ".$connection->id.PHP_EOL;
};

$ws_worker->onClose = function($connection)  use (&$user_connections)
{
    echo '---> DISCONNECT';
};

Worker::runAll();

ESP8266代码

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <WebSocketsClient.h>

const char* ssid = "ESP32";  
const char* pwd = "01234567";  

WebSocketsClient webSocket;

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, pwd);
    while(WiFi.status() != WL_CONNECTED){
            Serial.print(".");
            delay(100);
    }

    webSocket.beginSSL("***.com", 8888, url.c_str());
    webSocket.onEvent(webSocketEvent);
    webSocket.setReconnectInterval(5000);
}

void loop() {
  webSocket.loop();
}

void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {
   switch(type) {
        case WStype_DISCONNECTED:
            Serial.printf("Disconnected!\n");
            break;
        case WStype_CONNECTED: 
            Serial.println("SENT: Connected");
            break;
        case WStype_TEXT:
            Serial.printf("RESPONSE: %s\n", payload);
            json_error = deserializeJson(doc, payload);
            break;
        case WStype_BIN:
            Serial.printf("[WSc] get binary length: %u\n", length);
            hexdump(payload, length);
            break;
        case WStype_PING:
              Serial.printf("[WSc] get ping\n");
              break;
        case WStype_PONG:
              Serial.printf("[WSc] get pong\n");
              break;
    }
}

已尝试的方法

我尝试在ESP8266中开启:

webSocket.enableHeartbeat(10000, 5000, 2)

但这没有效果,关闭ESP8266设备时,服务器仍无法识别其断开。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:43:14