diff --git a/include/WebApi.h b/include/WebApi.h new file mode 100644 index 0000000..b7db959 --- /dev/null +++ b/include/WebApi.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +class WebApiClass { +public: + WebApiClass(); + void init(); + +private: + AsyncWebServer _server; + AsyncWebSocket _ws; + AsyncEventSource _events; + + void onWebsocketEvent(AsyncWebSocket* server, AsyncWebSocketClient* client, AwsEventType type, void* arg, uint8_t* data, size_t len); + + void onNotFound(AsyncWebServerRequest* request); +}; + +extern WebApiClass WebApi; \ No newline at end of file diff --git a/include/defaults.h b/include/defaults.h index 8635fa7..9eeddd1 100644 --- a/include/defaults.h +++ b/include/defaults.h @@ -4,6 +4,8 @@ #define APP_HOSTNAME "OpenDTU-%06X" +#define HTTP_PORT 80 + #define ACCESS_POINT_NAME "OpenDTU-" #define ACCESS_POINT_PASSWORD "openDTU" diff --git a/platformio.ini b/platformio.ini index e30e711..ef38781 100644 --- a/platformio.ini +++ b/platformio.ini @@ -21,7 +21,7 @@ build_flags = ${env.build_flags} -D=${PIOENV} -#lib_deps = https://github.com/lorol/LITTLEFS.git +lib_deps = https://github.com/me-no-dev/ESPAsyncWebServer.git board = esp32dev board_build.partitions = partitions_custom.csv diff --git a/src/WebApi.cpp b/src/WebApi.cpp new file mode 100644 index 0000000..e31102e --- /dev/null +++ b/src/WebApi.cpp @@ -0,0 +1,45 @@ +#include "WebApi.h" +#include "defaults.h" +#include + +WebApiClass::WebApiClass() + : _server(HTTP_PORT) + , _ws("/ws") + , _events("/events") +{ +} + +void WebApiClass::init() +{ + using namespace std::placeholders; + + _server.addHandler(&_ws); + _server.addHandler(&_events); + + _ws.onEvent(std::bind(&WebApiClass::onWebsocketEvent, this, _1, _2, _3, _4, _5, _6)); + + _server.serveStatic("/", LITTLEFS, "/", "max-age=86400").setDefaultFile("index.htm"); + _server.onNotFound(std::bind(&WebApiClass::onNotFound, this, _1)); + _server.begin(); +} + +void WebApiClass::onNotFound(AsyncWebServerRequest* request) +{ + // Handle Unknown Request + request->send(404, "text/plain", "404 Not Found"); +} + +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; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 5f4ab90..27eb8b0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,5 @@ #include "Configuration.h" +#include "WebApi.h" #include "WiFiSettings.h" #include "defaults.h" #include @@ -43,6 +44,11 @@ void setup() WiFiSettings.init(); Serial.println(F("done")); WiFiSettings.applyConfig(); + + // Initialize WebApi + Serial.print(F("Initialize WebApi... ")); + WebApi.init(); + Serial.println(F("done")); } void loop()