Move websocket stuff to liveview class

This commit is contained in:
Thomas Basler 2022-07-20 19:36:07 +02:00
parent 608912e9f3
commit 184183e979
4 changed files with 42 additions and 37 deletions

View File

@ -21,7 +21,6 @@ public:
private: private:
AsyncWebServer _server; AsyncWebServer _server;
AsyncWebSocket _ws;
AsyncEventSource _events; AsyncEventSource _events;
WebApiDtuClass _webApiDtu; WebApiDtuClass _webApiDtu;
@ -34,9 +33,6 @@ private:
WebApiSysstatusClass _webApiSysstatus; WebApiSysstatusClass _webApiSysstatus;
WebApiWebappClass _webApiWebapp; WebApiWebappClass _webApiWebapp;
WebApiWsLiveClass _webApiWsLive; WebApiWsLiveClass _webApiWsLive;
unsigned long _lastWsCleanup = 0;
void onWebsocketEvent(AsyncWebSocket* server, AsyncWebSocketClient* client, AwsEventType type, void* arg, uint8_t* data, size_t len);
}; };
extern WebApiClass WebApi; extern WebApiClass WebApi;

View File

@ -7,14 +7,19 @@
class WebApiWsLiveClass { class WebApiWsLiveClass {
public: public:
void init(AsyncWebSocket* ws); WebApiWsLiveClass();
void init(AsyncWebServer* server);
void loop(); void loop();
private: private:
AsyncWebSocket* _ws;
void addField(JsonDocument& root, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId, String topic = ""); void addField(JsonDocument& root, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId, String topic = "");
void onWebsocketEvent(AsyncWebSocket* server, AsyncWebSocketClient* client, AwsEventType type, void* arg, uint8_t* data, size_t len);
AsyncWebServer* _server;
AsyncWebSocket _ws;
uint32_t _lastWsPublish = 0; uint32_t _lastWsPublish = 0;
uint32_t _lastInvUpdateCheck = 0; uint32_t _lastInvUpdateCheck = 0;
unsigned long _lastWsCleanup = 0;
uint32_t _newestInverterTimestamp = 0; uint32_t _newestInverterTimestamp = 0;
}; };

View File

@ -9,7 +9,6 @@
WebApiClass::WebApiClass() WebApiClass::WebApiClass()
: _server(HTTP_PORT) : _server(HTTP_PORT)
, _ws("/livedata")
, _events("/events") , _events("/events")
{ {
} }
@ -18,11 +17,8 @@ void WebApiClass::init()
{ {
using namespace std::placeholders; using namespace std::placeholders;
_server.addHandler(&_ws);
_server.addHandler(&_events); _server.addHandler(&_events);
_ws.onEvent(std::bind(&WebApiClass::onWebsocketEvent, this, _1, _2, _3, _4, _5, _6));
_webApiDtu.init(&_server); _webApiDtu.init(&_server);
_webApiEventlog.init(&_server); _webApiEventlog.init(&_server);
_webApiFirmware.init(&_server); _webApiFirmware.init(&_server);
@ -32,8 +28,7 @@ void WebApiClass::init()
_webApiNtp.init(&_server); _webApiNtp.init(&_server);
_webApiSysstatus.init(&_server); _webApiSysstatus.init(&_server);
_webApiWebapp.init(&_server); _webApiWebapp.init(&_server);
_webApiWsLive.init(&_server);
_webApiWsLive.init(&_ws);
_server.begin(); _server.begin();
} }
@ -49,27 +44,7 @@ void WebApiClass::loop()
_webApiNtp.loop(); _webApiNtp.loop();
_webApiSysstatus.loop(); _webApiSysstatus.loop();
_webApiWebapp.loop(); _webApiWebapp.loop();
_webApiWsLive.loop(); _webApiWsLive.loop();
// see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients
if (millis() - _lastWsCleanup > 1000) {
_ws.cleanupClients();
_lastWsCleanup = millis();
}
}
void WebApiClass::onWebsocketEvent(AsyncWebSocket* server, AsyncWebSocketClient* client, AwsEventType type, void* arg, uint8_t* data, size_t len)
{
if (type == WS_EVT_CONNECT) {
char str[64];
sprintf(str, "Websocket: [%s][%u] connect", server->url(), client->id());
Serial.println(str);
} else if (type == WS_EVT_DISCONNECT) {
char str[64];
sprintf(str, "Websocket: [%s][%u] disconnect", server->url(), client->id());
Serial.println(str);
}
} }
WebApiClass WebApi; WebApiClass WebApi;

View File

@ -6,15 +6,31 @@
#include "AsyncJson.h" #include "AsyncJson.h"
#include "Configuration.h" #include "Configuration.h"
void WebApiWsLiveClass::init(AsyncWebSocket* ws) WebApiWsLiveClass::WebApiWsLiveClass()
: _ws("/livedata")
{ {
_ws = ws; }
void WebApiWsLiveClass::init(AsyncWebServer* server)
{
using namespace std::placeholders;
_server = server;
_server->addHandler(&_ws);
_ws.onEvent(std::bind(&WebApiWsLiveClass::onWebsocketEvent, this, _1, _2, _3, _4, _5, _6));
} }
void WebApiWsLiveClass::loop() void WebApiWsLiveClass::loop()
{ {
// see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients
if (millis() - _lastWsCleanup > 1000) {
_ws.cleanupClients();
_lastWsCleanup = millis();
}
// do nothing if no WS client is connected // do nothing if no WS client is connected
if (_ws->count() == 0) { if (_ws.count() == 0) {
return; return;
} }
@ -83,10 +99,10 @@ void WebApiWsLiveClass::loop()
} }
size_t len = measureJson(root); size_t len = measureJson(root);
AsyncWebSocketMessageBuffer* buffer = _ws->makeBuffer(len); // creates a buffer (len + 1) for you. AsyncWebSocketMessageBuffer* buffer = _ws.makeBuffer(len); // creates a buffer (len + 1) for you.
if (buffer) { if (buffer) {
serializeJson(root, (char*)buffer->get(), len + 1); serializeJson(root, (char*)buffer->get(), len + 1);
_ws->textAll(buffer); _ws.textAll(buffer);
} }
_lastWsPublish = millis(); _lastWsPublish = millis();
@ -106,3 +122,16 @@ void WebApiWsLiveClass::addField(JsonDocument& root, uint8_t idx, std::shared_pt
root[idx][String(channel)][chanName]["u"] = inv->Statistics()->getChannelFieldUnit(channel, fieldId); root[idx][String(channel)][chanName]["u"] = inv->Statistics()->getChannelFieldUnit(channel, fieldId);
} }
} }
void WebApiWsLiveClass::onWebsocketEvent(AsyncWebSocket* server, AsyncWebSocketClient* client, AwsEventType type, void* arg, uint8_t* data, size_t len)
{
if (type == WS_EVT_CONNECT) {
char str[64];
sprintf(str, "Websocket: [%s][%u] connect", server->url(), client->id());
Serial.println(str);
} else if (type == WS_EVT_DISCONNECT) {
char str[64];
sprintf(str, "Websocket: [%s][%u] disconnect", server->url(), client->id());
Serial.println(str);
}
}