#pragma once #include "message.h" #include "crypto.h" #include struct ServerConfiguration { /** * @brief The url of the remote server to connect to */ const char* url; /** * @brief The server port */ int port; /** * @brief The path on the server */ const char* path; /** * @brief The authentication key for the server */ const char* key; uint32_t reconnectTime; }; class ServerConnectionCallbacks { public: virtual void sendServerError(MessageResult event) = 0; virtual void handleServerMessage(uint8_t* payload, size_t length) = 0; }; class ServerConnection { public: ServerConnection(); /** * @brief Set the configuration and the callback handler * * @param callback The handler to handle messages and errors */ void configure(ServerConfiguration configuration, ServerConnectionCallbacks* callbacks); void connect(); void disconnect(); void loop(); /** * @brief Send a response message over the socket * * @param buffer The data buffer * @param length The number of bytes to send */ void sendResponse(uint8_t* buffer, uint16_t length); bool isSocketConnected() { return webSocket.isConnected(); } private: ServerConfiguration configuration; ServerConnectionCallbacks* controller = NULL; // WebSocket to connect to the control server WebSocketsClient webSocket; /** * Callback for WebSocket events. * * Updates the connection state and processes received keys. * * @param payload The pointer to received data * @param length The number of bytes received */ void webSocketEventHandler(WStype_t type, uint8_t * payload, size_t length); };