mirror of
https://github.com/rstrouse/ESPSomfy-RTS.git
synced 2026-03-30 17:02:12 +02:00
replace sync sockets
This commit is contained in:
parent
5f41b05357
commit
0f66bb833e
8 changed files with 154 additions and 142 deletions
|
|
@ -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
1
.gitignore
vendored
|
|
@ -13,3 +13,4 @@ data/
|
||||||
build/
|
build/
|
||||||
coredump_report.txt
|
coredump_report.txt
|
||||||
coredump.bin
|
coredump.bin
|
||||||
|
logs/
|
||||||
14
.vscode/c_cpp_properties.json
vendored
14
.vscode/c_cpp_properties.json
vendored
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
197
src/Sockets.cpp
197
src/Sockets.cpp
|
|
@ -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,8 +13,31 @@ 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];
|
||||||
|
|
@ -53,21 +75,6 @@ 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
|
||||||
|
|
@ -76,26 +83,36 @@ 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;
|
||||||
|
|
@ -133,74 +151,71 @@ 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();
|
||||||
|
memset(clientMap, 0, sizeof(clientMap));
|
||||||
|
}
|
||||||
|
void SocketEmitter::wsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
|
||||||
|
uint32_t asyncId = client->id();
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case WStype_ERROR:
|
case WS_EVT_CONNECT:
|
||||||
if(length > 0)
|
|
||||||
Serial.printf("Socket Error: %s\n", payload);
|
|
||||||
else
|
|
||||||
Serial.println("Socket Error: \n");
|
|
||||||
break;
|
|
||||||
case WStype_DISCONNECTED:
|
|
||||||
if(length > 0)
|
|
||||||
Serial.printf("Socket [%u] Disconnected!\n [%s]", num, payload);
|
|
||||||
else
|
|
||||||
Serial.printf("Socket [%u] Disconnected!\n", num);
|
|
||||||
for(uint8_t i = 0; i < SOCK_MAX_ROOMS; i++) {
|
|
||||||
sockEmit.rooms[i].leave(num);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case WStype_CONNECTED:
|
|
||||||
{
|
{
|
||||||
IPAddress ip = sockServer.remoteIP(num);
|
uint8_t slot = addClient(asyncId);
|
||||||
Serial.printf("Socket [%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);
|
if(slot == 255) {
|
||||||
// Send all the current shade settings to the client.
|
Serial.printf("Socket: No free client slots, closing %lu\n", asyncId);
|
||||||
sockServer.sendTXT(num, "Connected");
|
client->close();
|
||||||
//sockServer.loop();
|
return;
|
||||||
sockEmit.delayInit(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);
|
||||||
|
client->text("Connected");
|
||||||
|
client->setCloseClientOnQueueFull(false);
|
||||||
|
sockEmit.delayInit(slot);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case WStype_TEXT:
|
case WS_EVT_DISCONNECT:
|
||||||
if(strncmp((char *)payload, "join:", 5) == 0) {
|
{
|
||||||
// In this instance the client wants to join a room. Let's do some
|
uint8_t slot = mapClientId(asyncId);
|
||||||
// work to get the ordinal of the room that the client wants to join.
|
Serial.printf("Socket [%lu] Disconnected (slot %u)\n", asyncId, slot);
|
||||||
uint8_t roomNum = atoi((char *)&payload[5]);
|
if(slot != 255) {
|
||||||
Serial.printf("Client %u joining room %u\n", num, roomNum);
|
for(uint8_t i = 0; i < SOCK_MAX_ROOMS; i++)
|
||||||
if(roomNum < SOCK_MAX_ROOMS) sockEmit.rooms[roomNum].join(num);
|
sockEmit.rooms[i].leave(slot);
|
||||||
}
|
}
|
||||||
else if(strncmp((char *)payload, "leave:", 6) == 0) {
|
removeClient(asyncId);
|
||||||
uint8_t roomNum = atoi((char *)&payload[6]);
|
}
|
||||||
Serial.printf("Client %u leaving room %u\n", num, roomNum);
|
break;
|
||||||
if(roomNum < SOCK_MAX_ROOMS) sockEmit.rooms[roomNum].leave(num);
|
case WS_EVT_DATA:
|
||||||
|
{
|
||||||
|
AwsFrameInfo *info = (AwsFrameInfo*)arg;
|
||||||
|
if(info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) {
|
||||||
|
uint8_t slot = mapClientId(asyncId);
|
||||||
|
data[len] = 0;
|
||||||
|
if(strncmp((char*)data, "join:", 5) == 0) {
|
||||||
|
uint8_t roomNum = atoi((char*)&data[5]);
|
||||||
|
Serial.printf("Client %u joining room %u\n", slot, roomNum);
|
||||||
|
if(roomNum < SOCK_MAX_ROOMS && slot != 255) sockEmit.rooms[roomNum].join(slot);
|
||||||
|
}
|
||||||
|
else if(strncmp((char*)data, "leave:", 6) == 0) {
|
||||||
|
uint8_t roomNum = atoi((char*)&data[6]);
|
||||||
|
Serial.printf("Client %u leaving room %u\n", slot, roomNum);
|
||||||
|
if(roomNum < SOCK_MAX_ROOMS && slot != 255) sockEmit.rooms[roomNum].leave(slot);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Serial.printf("Socket [%u] text: %s\n", num, payload);
|
Serial.printf("Socket [%lu] text: %s\n", asyncId, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// send message to client
|
|
||||||
// webSocket.sendTXT(num, "message here");
|
|
||||||
|
|
||||||
// send data to all connected clients
|
|
||||||
// sockServer.broadcastTXT("message here");
|
|
||||||
break;
|
break;
|
||||||
case WStype_BIN:
|
case WS_EVT_ERROR:
|
||||||
Serial.printf("[%u] get binary length: %u\n", num, length);
|
Serial.printf("Socket [%lu] Error\n", asyncId);
|
||||||
//hexdump(payload, length);
|
|
||||||
|
|
||||||
// send message to client
|
|
||||||
// sockServer.sendBIN(num, payload, length);
|
|
||||||
break;
|
break;
|
||||||
case WStype_PONG:
|
case WS_EVT_PONG:
|
||||||
//Serial.printf("Pong from %u\n", num);
|
|
||||||
break;
|
|
||||||
case WStype_PING:
|
|
||||||
//Serial.printf("Ping from %u\n", num);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue