From 8f5d394f3a8dd6ca772d756dfc309613c297952c Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Mon, 19 Dec 2022 21:03:09 +0100 Subject: [PATCH] Added websocket for debug output --- include/WebApi.h | 2 ++ include/WebApi_ws_console.h | 19 +++++++++++++++++++ src/WebApi.cpp | 2 ++ src/WebApi_ws_console.cpp | 37 +++++++++++++++++++++++++++++++++++++ webapp/vite.config.ts | 5 +++++ 5 files changed, 65 insertions(+) create mode 100644 include/WebApi_ws_console.h create mode 100644 src/WebApi_ws_console.cpp diff --git a/include/WebApi.h b/include/WebApi.h index 1d6c8642..9cef1c2d 100644 --- a/include/WebApi.h +++ b/include/WebApi.h @@ -17,6 +17,7 @@ #include "WebApi_security.h" #include "WebApi_sysstatus.h" #include "WebApi_webapp.h" +#include "WebApi_ws_console.h" #include "WebApi_ws_live.h" #include @@ -49,6 +50,7 @@ private: WebApiSecurityClass _webApiSecurity; WebApiSysstatusClass _webApiSysstatus; WebApiWebappClass _webApiWebapp; + WebApiWsConsoleClass _webApiWsConsole; WebApiWsLiveClass _webApiWsLive; }; diff --git a/include/WebApi_ws_console.h b/include/WebApi_ws_console.h new file mode 100644 index 00000000..81df81e9 --- /dev/null +++ b/include/WebApi_ws_console.h @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include + +class WebApiWsConsoleClass { +public: + WebApiWsConsoleClass(); + void init(AsyncWebServer* server); + void loop(); + +private: + void onWebsocketEvent(AsyncWebSocket* server, AsyncWebSocketClient* client, AwsEventType type, void* arg, uint8_t* data, size_t len); + + AsyncWebServer* _server; + AsyncWebSocket _ws; + + uint32_t _lastWsCleanup = 0; +}; \ No newline at end of file diff --git a/src/WebApi.cpp b/src/WebApi.cpp index 9cd9715d..f7b56832 100644 --- a/src/WebApi.cpp +++ b/src/WebApi.cpp @@ -33,6 +33,7 @@ void WebApiClass::init() _webApiSecurity.init(&_server); _webApiSysstatus.init(&_server); _webApiWebapp.init(&_server); + _webApiWsConsole.init(&_server); _webApiWsLive.init(&_server); _server.begin(); @@ -55,6 +56,7 @@ void WebApiClass::loop() _webApiSecurity.loop(); _webApiSysstatus.loop(); _webApiWebapp.loop(); + _webApiWsConsole.loop(); _webApiWsLive.loop(); } diff --git a/src/WebApi_ws_console.cpp b/src/WebApi_ws_console.cpp new file mode 100644 index 00000000..2837fc39 --- /dev/null +++ b/src/WebApi_ws_console.cpp @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2022 Thomas Basler and others + */ +#include "WebApi_ws_console.h" +#include "Configuration.h" +#include "MessageOutput.h" +#include "WebApi.h" +#include "defaults.h" + +WebApiWsConsoleClass::WebApiWsConsoleClass() + : _ws("/console") +{ +} + +void WebApiWsConsoleClass::init(AsyncWebServer* server) +{ + _server = server; + _server->addHandler(&_ws); + MessageOutput.register_ws_output(&_ws); +} + +void WebApiWsConsoleClass::loop() +{ + // see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients + if (millis() - _lastWsCleanup > 1000) { + _ws.cleanupClients(); + + if (Configuration.get().Security_AllowReadonly) { + _ws.setAuthentication("", ""); + } else { + _ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security_Password); + } + + _lastWsCleanup = millis(); + } +} \ No newline at end of file diff --git a/webapp/vite.config.ts b/webapp/vite.config.ts index ff9097cb..c2d79ca1 100644 --- a/webapp/vite.config.ts +++ b/webapp/vite.config.ts @@ -48,6 +48,11 @@ export default defineConfig({ target: 'ws://192.168.20.110/', ws: true, changeOrigin: true + }, + '^/console': { + target: 'ws://192.168.20.110/', + ws: true, + changeOrigin: true } } }