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

