Complete IoT monitoring platform for Acuvim II power meters via ESP32. Firmware (Phases 1-7): - ESP32-WROVER-B (TTGO T-Call v1.4) with RS485 Modbus RTU - WiFi STA+AP concurrent mode with GSM/GPRS failover - Transport abstraction layer with 4 priority modes - MQTT protocol with 20 commands, LWT, QoS, exponential backoff - SD card offline buffering with JSONL rotation and non-blocking drain - OTA firmware updates with dual partition rollback protection - Watchdog timer, crash loop detection, Acuvim health monitoring - Captive portal provisioning with AP mode Console backend (Phase 8): - .NET 10 minimal API with PostgreSQL + EF Core - JWT authentication, SignalR real-time updates - MQTTnet 5.x bridge service with health monitoring - Device, telemetry, firmware, alert, group management - Rate limiting, security headers, Swagger/OpenAPI Frontend (Phase 9): - React 18 + TypeScript + Vite with Ant Design 5 - ECharts telemetry visualization, TanStack Query - SignalR live updates, device management UI - Dashboard, fleet management, firmware deployment Testing & Production (Phase 10): - 28 firmware unit tests (Modbus, JSON, config, version) - 23 xUnit backend tests (device, telemetry, command, alert) - Docker Compose with nginx, TLS MQTT, PostgreSQL - Production deployment, commissioning, and troubleshooting docs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
95 lines
3.4 KiB
C++
95 lines
3.4 KiB
C++
#ifndef WEB_SERVER_H
|
|
#define WEB_SERVER_H
|
|
|
|
#include <Arduino.h>
|
|
#include <ESPAsyncWebServer.h>
|
|
#include <DNSServer.h>
|
|
#include "config_manager.h"
|
|
#include "wifi_manager.h"
|
|
#include "gsm_manager.h"
|
|
#include "transport_manager.h"
|
|
#include "mqtt_client.h"
|
|
#include "acuvim_reader.h"
|
|
#include "sd_manager.h"
|
|
#include "ota_manager.h"
|
|
|
|
class WebPortal {
|
|
public:
|
|
WebPortal();
|
|
void begin(ConfigManager& config, WifiManager& wifi,
|
|
MqttClient& mqtt, AcuvimReader& acuvim,
|
|
GsmManager& gsm, TransportManager& transport,
|
|
SdManager& sd, OtaManager& ota);
|
|
void loop();
|
|
void stop();
|
|
|
|
void setLatestData(const AcuvimData& data) { _lastData = data; }
|
|
|
|
private:
|
|
AsyncWebServer _server;
|
|
DNSServer _dns;
|
|
|
|
ConfigManager* _config;
|
|
WifiManager* _wifi;
|
|
GsmManager* _gsm;
|
|
TransportManager* _transport;
|
|
MqttClient* _mqtt;
|
|
AcuvimReader* _acuvim;
|
|
SdManager* _sd;
|
|
OtaManager* _ota;
|
|
AcuvimData _lastData;
|
|
|
|
void setupRoutes();
|
|
void setupCaptivePortal();
|
|
|
|
void sendJsonResponse(AsyncWebServerRequest* req, int code, const String& json);
|
|
void sendSuccess(AsyncWebServerRequest* req, const char* message);
|
|
void sendError(AsyncWebServerRequest* req, int code, const char* message);
|
|
|
|
void handleStatus(AsyncWebServerRequest* req);
|
|
void handleDeviceInfo(AsyncWebServerRequest* req);
|
|
void handleLatestTelemetry(AsyncWebServerRequest* req);
|
|
|
|
void handleWifiScan(AsyncWebServerRequest* req);
|
|
void handleGetWifiConfig(AsyncWebServerRequest* req);
|
|
void handlePostWifiConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
|
|
void handleWifiDisconnect(AsyncWebServerRequest* req);
|
|
|
|
void handleGetMqttConfig(AsyncWebServerRequest* req);
|
|
void handlePostMqttConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
|
|
|
|
void handleGetSleepConfig(AsyncWebServerRequest* req);
|
|
void handlePostSleepConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
|
|
|
|
void handleGetConsoleConfig(AsyncWebServerRequest* req);
|
|
void handlePostConsoleConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
|
|
|
|
void handleGetModbusConfig(AsyncWebServerRequest* req);
|
|
void handlePostModbusConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
|
|
|
|
void handleGetGsmConfig(AsyncWebServerRequest* req);
|
|
void handlePostGsmConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
|
|
void handleGetGsmStatus(AsyncWebServerRequest* req);
|
|
|
|
void handleGetTransportConfig(AsyncWebServerRequest* req);
|
|
void handlePostTransportConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
|
|
|
|
void handleGetSdStatus(AsyncWebServerRequest* req);
|
|
void handlePostSdDrain(AsyncWebServerRequest* req);
|
|
void handlePostSdCleanup(AsyncWebServerRequest* req);
|
|
|
|
void handleGetOtaStatus(AsyncWebServerRequest* req);
|
|
void handlePostOtaCheck(AsyncWebServerRequest* req);
|
|
void handlePostOtaInstall(AsyncWebServerRequest* req, uint8_t* data, size_t len);
|
|
void handleOtaUpload(AsyncWebServerRequest* req, const String& filename,
|
|
size_t index, uint8_t* data, size_t len, bool final);
|
|
void handlePostOtaRollback(AsyncWebServerRequest* req);
|
|
void handleGetOtaConfig(AsyncWebServerRequest* req);
|
|
void handlePostOtaConfig(AsyncWebServerRequest* req, uint8_t* data, size_t len);
|
|
|
|
void handleRestart(AsyncWebServerRequest* req);
|
|
void handleFactoryReset(AsyncWebServerRequest* req);
|
|
};
|
|
|
|
#endif
|