replace sync sockets

This commit is contained in:
cjkas 2026-03-23 14:49:17 +01:00
parent 5f41b05357
commit 0f66bb833e
8 changed files with 154 additions and 142 deletions

View file

@ -1,7 +1,8 @@
{ {
"permissions": { "permissions": {
"allow": [ "allow": [
"Bash(~/.platformio/penv/Scripts/platformio.exe run:*)" "Bash(~/.platformio/penv/Scripts/platformio.exe run:*)",
"Bash(grep -n \"emitSockets\" \"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/src\"/*.cpp)"
] ]
} }
} }

1
.gitignore vendored
View file

@ -13,3 +13,4 @@ data/
build/ build/
coredump_report.txt coredump_report.txt
coredump.bin coredump.bin
logs/

View file

@ -12,21 +12,20 @@
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/src", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Update/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Update/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/ESPAsyncWebServer/src", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/ESPAsyncWebServer/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/FS/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/FS/src",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/AsyncTCP/src", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/AsyncTCP/src",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/PubSubClient/src", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/PubSubClient/src",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/SmartRC-CC1101-Driver-Lib", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/SmartRC-CC1101-Driver-Lib",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/WebSockets/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/ArduinoJson/src", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/ArduinoJson/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/newlib/platform_include", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/newlib/platform_include",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include",
@ -254,21 +253,20 @@
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/src", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Update/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Update/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/ESPAsyncWebServer/src", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/ESPAsyncWebServer/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/FS/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/FS/src",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/AsyncTCP/src", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/AsyncTCP/src",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/PubSubClient/src", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/PubSubClient/src",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/SmartRC-CC1101-Driver-Lib", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/SmartRC-CC1101-Driver-Lib",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/WebSockets/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src",
"c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/ArduinoJson/src", "c:/Users/oem/Documents/PlatformIO/Projects/ESPSomfy-RTS/.pio/libdeps/esp32dev/ArduinoJson/src",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/newlib/platform_include", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/newlib/platform_include",
"C:/Users/oem/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include", "C:/Users/oem/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include",

View file

@ -17,7 +17,6 @@ board = esp32dev
framework = arduino framework = arduino
lib_deps = lib_deps =
bblanchon/ArduinoJson@^7.2.2 bblanchon/ArduinoJson@^7.2.2
links2004/WebSockets@^2.7.3
lsatan/SmartRC-CC1101-Driver-Lib@^2.5.7 lsatan/SmartRC-CC1101-Driver-Lib@^2.5.7
knolleary/PubSubClient@^2.8 knolleary/PubSubClient@^2.8
esp32async/ESPAsyncWebServer @ ^3.10.3 esp32async/ESPAsyncWebServer @ ^3.10.3

View file

@ -1,6 +1,5 @@
#include <Arduino.h> #include <Arduino.h>
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <WebSocketsServer.h>
#include <esp_task_wdt.h> #include <esp_task_wdt.h>
#include "Sockets.h" #include "Sockets.h"
#include "ConfigSettings.h" #include "ConfigSettings.h"
@ -14,33 +13,56 @@ extern SomfyShadeController somfy;
extern SocketEmitter sockEmit; extern SocketEmitter sockEmit;
extern GitUpdater git; extern GitUpdater git;
AsyncWebServer wsServer(8080);
AsyncWebSocket ws("/");
WebSocketsServer sockServer = WebSocketsServer(8080); #define MAX_WS_CLIENTS 5
static uint32_t clientMap[MAX_WS_CLIENTS] = {0,0,0,0,0};
static uint8_t mapClientId(uint32_t asyncId) {
for(uint8_t i = 0; i < MAX_WS_CLIENTS; i++)
if(clientMap[i] == asyncId) return i;
return 255;
}
static uint32_t getAsyncId(uint8_t slot) {
if(slot < MAX_WS_CLIENTS) return clientMap[slot];
return 0;
}
static uint8_t addClient(uint32_t asyncId) {
for(uint8_t i = 0; i < MAX_WS_CLIENTS; i++) {
if(clientMap[i] == 0) { clientMap[i] = asyncId; return i; }
}
return 255;
}
static void removeClient(uint32_t asyncId) {
for(uint8_t i = 0; i < MAX_WS_CLIENTS; i++)
if(clientMap[i] == asyncId) clientMap[i] = 0;
}
#define MAX_SOCK_RESPONSE 2048 #define MAX_SOCK_RESPONSE 2048
static char g_response[MAX_SOCK_RESPONSE]; static char g_response[MAX_SOCK_RESPONSE];
bool room_t::isJoined(uint8_t num) { bool room_t::isJoined(uint8_t num) {
for(uint8_t i = 0; i < sizeof(this->clients); i++) { for(uint8_t i = 0; i < sizeof(this->clients); i++) {
if(this->clients[i] == num) return true; if(this->clients[i] == num) return true;
} }
return false; return false;
} }
bool room_t::join(uint8_t num) { bool room_t::join(uint8_t num) {
if(this->isJoined(num)) return true; if(this->isJoined(num)) return true;
for(uint8_t i = 0; i < sizeof(this->clients); i++) { for(uint8_t i = 0; i < sizeof(this->clients); i++) {
if(this->clients[i] == 255) { if(this->clients[i] == 255) {
this->clients[i] = num; this->clients[i] = num;
return true; return true;
} }
} }
return false; return false;
} }
bool room_t::leave(uint8_t num) { bool room_t::leave(uint8_t num) {
if(!this->isJoined(num)) return false; if(!this->isJoined(num)) return false;
for(uint8_t i = 0; i < sizeof(this->clients); i++) { for(uint8_t i = 0; i < sizeof(this->clients); i++) {
if(this->clients[i] == num) this->clients[i] = 255; if(this->clients[i] == num) this->clients[i] = 255;
} }
return true; return true;
} }
void room_t::clear() { void room_t::clear() {
@ -53,49 +75,44 @@ uint8_t room_t::activeClients() {
} }
return n; return n;
} }
/*********************************************************************
* ClientSocketEvent class members
********************************************************************/
/*
void ClientSocketEvent::prepareMessage(const char *evt, const char *payload) {
if(strlen(payload) + 5 >= sizeof(this->msg)) Serial.printf("Socket buffer overflow %d > 2048\n", strlen(payload) + 5 + strlen(evt));
snprintf(this->msg, sizeof(this->msg), "42[%s,%s]", evt, payload);
}
void ClientSocketEvent::prepareMessage(const char *evt, JsonDocument &doc) {
memset(this->msg, 0x00, sizeof(this->msg));
snprintf(this->msg, sizeof(this->msg), "42[%s,", evt);
serializeJson(doc, &this->msg[strlen(this->msg)], sizeof(this->msg) - strlen(this->msg) - 2);
strcat(this->msg, "]");
}
*/
/********************************************************************* /*********************************************************************
* SocketEmitter class members * SocketEmitter class members
********************************************************************/ ********************************************************************/
void SocketEmitter::startup() { void SocketEmitter::startup() {
} }
void SocketEmitter::begin() { void SocketEmitter::begin() {
sockServer.begin(); ws.onEvent(SocketEmitter::wsEvent);
sockServer.enableHeartbeat(3000, 2000, 2); wsServer.addHandler(&ws);
sockServer.onEvent(this->wsEvent); wsServer.begin();
Serial.println("Socket Server Started..."); Serial.println("Socket Server Started...");
//settings.printAvailHeap();
} }
void SocketEmitter::loop() { void SocketEmitter::loop() {
ws.cleanupClients();
this->initClients(); this->initClients();
sockServer.loop();
} }
JsonSockEvent *SocketEmitter::beginEmit(const char *evt) { JsonSockEvent *SocketEmitter::beginEmit(const char *evt) {
this->json.beginEvent(&sockServer, evt, g_response, sizeof(g_response)); this->json.beginEvent(&ws, evt, g_response, sizeof(g_response));
return &this->json; return &this->json;
} }
void SocketEmitter::endEmit(uint8_t num) { this->json.endEvent(num); esp_task_wdt_reset(); sockServer.loop(); } void SocketEmitter::endEmit(uint8_t num) {
if(num == 255) {
this->json.endEvent(0);
} else {
uint32_t asyncId = getAsyncId(num);
this->json.endEvent(asyncId);
}
esp_task_wdt_reset();
}
void SocketEmitter::endEmitRoom(uint8_t room) { void SocketEmitter::endEmitRoom(uint8_t room) {
if(room < SOCK_MAX_ROOMS) { if(room < SOCK_MAX_ROOMS) {
room_t *r = &this->rooms[room]; room_t *r = &this->rooms[room];
for(uint8_t i = 0; i < sizeof(r->clients); i++) { for(uint8_t i = 0; i < sizeof(r->clients); i++) {
if(r->clients[i] != 255) this->json.endEvent(r->clients[i]); if(r->clients[i] != 255) {
uint32_t asyncId = getAsyncId(r->clients[i]);
if(asyncId != 0) this->json.endEvent(asyncId);
}
} }
} }
} }
@ -105,18 +122,19 @@ uint8_t SocketEmitter::activeClients(uint8_t room) {
} }
void SocketEmitter::initClients() { void SocketEmitter::initClients() {
for(uint8_t i = 0; i < sizeof(this->newClients); i++) { for(uint8_t i = 0; i < sizeof(this->newClients); i++) {
uint8_t num = this->newClients[i]; uint8_t slot = this->newClients[i];
if(num != 255) { if(slot != 255) {
if(sockServer.clientIsConnected(num)) { uint32_t asyncId = getAsyncId(slot);
Serial.printf("Initializing Socket Client %u\n", num); if(asyncId != 0 && ws.hasClient(asyncId)) {
Serial.printf("Initializing Socket Client %u (asyncId=%lu)\n", slot, asyncId);
esp_task_wdt_reset(); esp_task_wdt_reset();
settings.emitSockets(num); settings.emitSockets(slot);
if(!sockServer.clientIsConnected(num)) { this->newClients[i] = 255; continue; } if(!ws.hasClient(asyncId)) { this->newClients[i] = 255; continue; }
somfy.emitState(num); somfy.emitState(slot);
if(!sockServer.clientIsConnected(num)) { this->newClients[i] = 255; continue; } if(!ws.hasClient(asyncId)) { this->newClients[i] = 255; continue; }
git.emitUpdateCheck(num); git.emitUpdateCheck(slot);
if(!sockServer.clientIsConnected(num)) { this->newClients[i] = 255; continue; } if(!ws.hasClient(asyncId)) { this->newClients[i] = 255; continue; }
net.emitSockets(num); net.emitSockets(slot);
esp_task_wdt_reset(); esp_task_wdt_reset();
} }
this->newClients[i] = 255; this->newClients[i] = 255;
@ -132,75 +150,72 @@ void SocketEmitter::delayInit(uint8_t num) {
} }
} }
} }
void SocketEmitter::end() { void SocketEmitter::end() {
sockServer.close(); ws.closeAll();
wsServer.end();
for(uint8_t i = 0; i < SOCK_MAX_ROOMS; i++) for(uint8_t i = 0; i < SOCK_MAX_ROOMS; i++)
this->rooms[i].clear(); this->rooms[i].clear();
memset(clientMap, 0, sizeof(clientMap));
} }
void SocketEmitter::disconnect() { sockServer.disconnect(); } void SocketEmitter::disconnect() {
void SocketEmitter::wsEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) { ws.closeAll();
switch(type) { memset(clientMap, 0, sizeof(clientMap));
case WStype_ERROR: }
if(length > 0) void SocketEmitter::wsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
Serial.printf("Socket Error: %s\n", payload); uint32_t asyncId = client->id();
else switch(type) {
Serial.println("Socket Error: \n"); case WS_EVT_CONNECT:
break; {
case WStype_DISCONNECTED: uint8_t slot = addClient(asyncId);
if(length > 0) if(slot == 255) {
Serial.printf("Socket [%u] Disconnected!\n [%s]", num, payload); Serial.printf("Socket: No free client slots, closing %lu\n", asyncId);
else client->close();
Serial.printf("Socket [%u] Disconnected!\n", num); return;
for(uint8_t i = 0; i < SOCK_MAX_ROOMS; i++) { }
sockEmit.rooms[i].leave(num); IPAddress ip = client->remoteIP();
} Serial.printf("Socket [%lu] Connected from %d.%d.%d.%d (slot %u)\n", asyncId, ip[0], ip[1], ip[2], ip[3], slot);
break; client->text("Connected");
case WStype_CONNECTED: client->setCloseClientOnQueueFull(false);
{ sockEmit.delayInit(slot);
IPAddress ip = sockServer.remoteIP(num); }
Serial.printf("Socket [%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload); break;
// Send all the current shade settings to the client. case WS_EVT_DISCONNECT:
sockServer.sendTXT(num, "Connected"); {
//sockServer.loop(); uint8_t slot = mapClientId(asyncId);
sockEmit.delayInit(num); Serial.printf("Socket [%lu] Disconnected (slot %u)\n", asyncId, slot);
} if(slot != 255) {
break; for(uint8_t i = 0; i < SOCK_MAX_ROOMS; i++)
case WStype_TEXT: sockEmit.rooms[i].leave(slot);
if(strncmp((char *)payload, "join:", 5) == 0) { }
// In this instance the client wants to join a room. Let's do some removeClient(asyncId);
// work to get the ordinal of the room that the client wants to join. }
uint8_t roomNum = atoi((char *)&payload[5]); break;
Serial.printf("Client %u joining room %u\n", num, roomNum); case WS_EVT_DATA:
if(roomNum < SOCK_MAX_ROOMS) sockEmit.rooms[roomNum].join(num); {
} AwsFrameInfo *info = (AwsFrameInfo*)arg;
else if(strncmp((char *)payload, "leave:", 6) == 0) { if(info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) {
uint8_t roomNum = atoi((char *)&payload[6]); uint8_t slot = mapClientId(asyncId);
Serial.printf("Client %u leaving room %u\n", num, roomNum); data[len] = 0;
if(roomNum < SOCK_MAX_ROOMS) sockEmit.rooms[roomNum].leave(num); if(strncmp((char*)data, "join:", 5) == 0) {
} uint8_t roomNum = atoi((char*)&data[5]);
else { Serial.printf("Client %u joining room %u\n", slot, roomNum);
Serial.printf("Socket [%u] text: %s\n", num, payload); if(roomNum < SOCK_MAX_ROOMS && slot != 255) sockEmit.rooms[roomNum].join(slot);
} }
// send message to client else if(strncmp((char*)data, "leave:", 6) == 0) {
// webSocket.sendTXT(num, "message here"); uint8_t roomNum = atoi((char*)&data[6]);
Serial.printf("Client %u leaving room %u\n", slot, roomNum);
// send data to all connected clients if(roomNum < SOCK_MAX_ROOMS && slot != 255) sockEmit.rooms[roomNum].leave(slot);
// sockServer.broadcastTXT("message here"); }
break; else {
case WStype_BIN: Serial.printf("Socket [%lu] text: %s\n", asyncId, data);
Serial.printf("[%u] get binary length: %u\n", num, length); }
//hexdump(payload, length); }
}
// send message to client break;
// sockServer.sendBIN(num, payload, length); case WS_EVT_ERROR:
break; Serial.printf("Socket [%lu] Error\n", asyncId);
case WStype_PONG: break;
//Serial.printf("Pong from %u\n", num); case WS_EVT_PONG:
break; break;
case WStype_PING: }
//Serial.printf("Ping from %u\n", num);
break;
default:
break;
}
} }

View file

@ -1,4 +1,4 @@
#include <WebSocketsServer.h> #include <ESPAsyncWebServer.h>
#include "WResp.h" #include "WResp.h"
#ifndef sockets_h #ifndef sockets_h
#define sockets_h #define sockets_h
@ -21,7 +21,6 @@ class SocketEmitter {
void delayInit(uint8_t num); void delayInit(uint8_t num);
public: public:
JsonSockEvent json; JsonSockEvent json;
//ClientSocketEvent evt;
room_t rooms[SOCK_MAX_ROOMS]; room_t rooms[SOCK_MAX_ROOMS];
uint8_t activeClients(uint8_t room); uint8_t activeClients(uint8_t room);
void initClients(); void initClients();
@ -33,6 +32,6 @@ class SocketEmitter {
JsonSockEvent * beginEmit(const char *evt); JsonSockEvent * beginEmit(const char *evt);
void endEmit(uint8_t num = 255); void endEmit(uint8_t num = 255);
void endEmitRoom(uint8_t num); void endEmitRoom(uint8_t num);
static void wsEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length); static void wsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len);
}; };
#endif #endif

View file

@ -1,5 +1,5 @@
#include "WResp.h" #include "WResp.h"
void JsonSockEvent::beginEvent(WebSocketsServer *server, const char *evt, char *buff, size_t buffSize) { void JsonSockEvent::beginEvent(AsyncWebSocket *server, const char *evt, char *buff, size_t buffSize) {
this->server = server; this->server = server;
this->buff = buff; this->buff = buff;
this->buffSize = buffSize; this->buffSize = buffSize;
@ -15,10 +15,10 @@ void JsonSockEvent::closeEvent() {
this->_nocomma = true; this->_nocomma = true;
this->_closed = true; this->_closed = true;
} }
void JsonSockEvent::endEvent(uint8_t num) { void JsonSockEvent::endEvent(uint32_t clientId) {
this->closeEvent(); this->closeEvent();
if(num == 255) this->server->broadcastTXT(this->buff); if(clientId == 0) this->server->textAll(this->buff);
else this->server->sendTXT(num, this->buff); else this->server->text(clientId, this->buff);
} }
void JsonSockEvent::_safecat(const char *val, bool escape) { void JsonSockEvent::_safecat(const char *val, bool escape) {
size_t len = (escape ? this->calcEscapedLength(val) : strlen(val)) + strlen(this->buff); size_t len = (escape ? this->calcEscapedLength(val) : strlen(val)) + strlen(this->buff);

View file

@ -1,5 +1,4 @@
#include <WebServer.h> #include <WebServer.h>
#include <WebSocketsServer.h>
#include <esp_task_wdt.h> #include <esp_task_wdt.h>
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include "Somfy.h" #include "Somfy.h"
@ -78,9 +77,9 @@ class JsonSockEvent : public JsonFormatter {
bool _closed = false; bool _closed = false;
void _safecat(const char *val, bool escape = false) override; void _safecat(const char *val, bool escape = false) override;
public: public:
WebSocketsServer *server = nullptr; AsyncWebSocket *server = nullptr;
void beginEvent(WebSocketsServer *server, const char *evt, char *buff, size_t buffSize); void beginEvent(AsyncWebSocket *server, const char *evt, char *buff, size_t buffSize);
void endEvent(uint8_t clientNum = 255); void endEvent(uint32_t clientId = 0);
void closeEvent(); void closeEvent();
}; };
#endif #endif