DIYables WebApps-Bibliotheks-API-Referenz – Vollständige Dokumentation

Überblick

Die DIYables WebApps-Bibliothek bietet eine umfassende modulare Lösung für die Erstellung von WebSocket-basierten Webanwendungen auf dem Arduino Uno R4 WiFi und dem DIYables STEM V4 IoT. Sie umfasst mehrere vorgefertigte Webanwendungen und ein flexibles Framework zur Erstellung benutzerdefinierter Anwendungen. Speziell optimiert für die DIYables STEM V4 IoT-Bildungsplattform mit erweiterten IoT-Fähigkeiten und integrierter Sensorintegration.

Die Bibliothek verwendet eine modulare Architektur, bei der Sie nur die Webanwendungen einbinden, die Sie benötigen, was Speicher spart und die Leistung verbessert.

Funktionen

  • Modulare Architektur: Fügen Sie nur die Web-Apps hinzu, die Sie benötigen, um die Speichernutzung zu optimieren
  • Speichereffizient: Jede Webanwendung kann unabhängig voneinander aktiviert/deaktiviert werden
  • 11+ einsatzbereite Webanwendungen: Komplette Arduino-Steuerung ohne Kenntnisse in der Webprogrammierung
  • Eigenes Web-App-Framework: Erstellen Sie Ihre eigenen Anwendungen mithilfe des Basisklassen-Systems
  • Echtzeit-Kommunikation: WebSocket-basiert für sofortige Aktualisierungen
  • Responsives Design: Funktioniert auf Desktop-, Tablet- und Mobilgeräten
  • Einfache Integration: Einfache Callback-basierte API
  • Unterstützung mehrerer Web-Apps: Gleichzeitiges Hinzufügen mehrerer Web-Apps möglich
  • Plattform erweiterbar: Derzeit für Arduino Uno R4 WiFi implementiert, kann aber auf andere Hardware-Plattformen erweitert werden. Siehe DIYables_WebApps_ESP32

Kernklassen

DIYablesWebAppServer

Die Hauptserverklasse, die Webanwendungen, HTTP-Anfragen und WebSocket-Kommunikation verwaltet.

Konstruktor

DIYablesWebAppServer(int httpPort = 80, int websocketPort = 81)

Erstellt eine Instanz eines Webanwendungsservers.

  • httpPort: HTTP-Server-Port (Standardwert: 80)
  • websocketPort: WebSocket-Server-Port (Standardwert: 81)

Methoden

Einrichtung und Verbindung

bool begin()

Initialisiert die Netzwerkverbindung (für Ethernet oder vorkonfigurierte Verbindungen) und startet den Webserver.

  • Rückgabewert: true, wenn erfolgreich, false, falls fehlgeschlagen
  • Anwendungsfall: Für zukünftige Ethernet-Unterstützung oder wenn WiFi-Zugangsdaten vorkonfiguriert sind
bool begin(const char* ssid, const char* password)

Initialisiert die WLAN-Verbindung und startet den Webserver.

  • ssid: WLAN-Name
  • password: WLAN-Passwort
  • Rückgabewert: wahr, wenn erfolgreich, falsch, falls fehlgeschlagen
  • Anwendungsfall: Standard-WLAN-Verbindung mit Zugangsdaten
void loop()

Verarbeitet HTTP-Anfragen und WebSocket-Kommunikation. Muss in der Hauptschleife aufgerufen werden.

bool isConnected()

Gibt true zurück, wenn WLAN verbunden ist.

String getIPAddress()

Gibt die IP-Adresse des Arduino als String zurück.

Anwendungsmanagement

void addApp(DIYablesWebAppPageBase* app)

Fügt dem Server eine Webanwendung hinzu.

  • app: Zeiger auf eine Webanwendungsinstanz
void removeApp(const String& path)

Entfernt eine Webanwendung anhand des URL-Pfads.

  • Pfad: URL-Pfad der Anwendung (z. B. "/chat")
DIYablesWebAppPageBase* getApp(const String& path)

Ruft eine Webanwendung anhand ihres URL-Pfads ab.

  • Pfad: URL-Pfad der Anwendung
  • Rückgabewert: Zeiger auf die Anwendung oder nullptr, falls nicht gefunden
void setNotFoundPage(const DIYablesNotFoundPage& page)

Legt die 404-Fehlerseite fest (optional).

  • Seite: 404-Seiteninstanz

Spezialisierter App-Zugang

DIYablesWebDigitalPinsPage* getWebDigitalPinsPage()

Ruft die Instanz der Digital-Pins-Seite ab, sofern sie hinzugefügt wurde.

  • Rückgabewert: Zeiger auf die Seite der digitalen Pins oder nullptr
DIYablesWebSliderPage* getWebSliderPage()

Erhält die Instanz der Slider-Seite, falls sie hinzugefügt wurde.

  • Rückgabewert: Zeiger auf die Slider-Seite oder nullptr
DIYablesWebJoystickPage* getWebJoystickPage()

Gibt die Joystick-Seiteninstanz zurück, falls sie hinzugefügt wurde.

  • Rückgabe: Zeiger auf die Joystick-Seite oder nullptr

Basisklassen

DIYablesWebAppSeitenBasis

Abstrakte Basisklasse, von der alle Webanwendungen erben. Sie bietet gemeinsame Funktionalität für die HTTP-Verarbeitung, die WebSocket-Kommunikation und die Seitenverwaltung.

Konstruktor

DIYablesWebAppPageBase(const String& pagePath)

Erstellt eine Instanz der Basisseite mit dem angegebenen URL-Pfad.

  • Seitenpfad: URL-Pfad der Seite (z. B., "/web-joystick")

Virtuelle Methoden (Muss von abgeleiteten Klassen implementiert werden)

virtual void handleHTTPRequest(IWebClient& client) = 0

Verarbeitet HTTP-Anfragen für diese Seite. Reine virtuelle Methode.

  • Client: Web-Client-Schnittstelle zum Senden einer Antwort
virtual void handleWebSocketMessage(IWebSocket& ws, const char* message, uint16_t length) = 0

Verarbeitet WebSocket-Nachrichten für diese Seite. Reine virtuelle Methode.

  • ws: WebSocket-Verbindungsschnittstelle
  • message: Inhalt der empfangenen Nachricht
  • length: Nachrichtenlänge
virtual const char* getPageInfo() const = 0

Gibt den Seitenidentifikations-String zurück, der in der Anzeige der Verbindungsinformationen verwendet wird. Reine virtuelle Methode.

  • Rückgabewert: Seiten-Info-String (z. B. "🕹️ Web Joystick: ")
virtual String getNavigationInfo() const = 0

Gibt HTML für den Navigationsbutton der Startseite zurück. Reine virtuelle Methode.

  • Rückgabewert: HTML-String für Navigationskarte

Virtuelle Methoden (Optionale Überschreibungen)

virtual void onWebSocketConnection(IWebSocket& ws)

Aufgerufen, wenn eine neue WebSocket-Verbindung hergestellt wird.

  • ws: Neue WebSocket-Verbindung
virtual void onWebSocketClose(IWebSocket& ws)

Wird aufgerufen, wenn eine WebSocket-Verbindung geschlossen wird.

  • ws: WebSocket-Verbindung geschlossen

Gängige Methoden

const char* getPagePath() const

Gibt den URL-Pfad dieser Seite zurück.

  • Rückgabewert: Seitenpfad-Zeichenkette
bool isEnabled() const

Überprüft, ob die Seite derzeit aktiviert ist.

  • Rückgabewert: true, wenn aktiviert, false, wenn deaktiviert
void setEnabled(bool enable)

Aktiviert oder deaktiviert die Seite.

  • enable: wahr zum Aktivieren, falsch zum Deaktivieren

Hilfsfunktionen

void sendHTTPHeader(IWebClient& client, const char* contentType = "text/html")

Sendet Standard-HTTP-Header an den Client.

  • client: Web-Client-Schnittstelle
  • contentType: MIME-Typ (Standardwert: "text/html")
void sendWebSocketMessage(IWebSocket& ws, const char* message)

Sendet eine Nachricht an einen bestimmten WebSocket-Client.

  • ws: Ziel-WebSocket-Verbindung
  • message: Nachricht zum Senden
void broadcastToAllClients(const char* message)

Sendet eine Nachricht an alle verbundenen WebSocket-Clients.

  • Nachricht: Nachricht zur Übertragung
void sendLargeHTML(IWebClient& client, const char* html)

Sendet großen HTML-Inhalt mittels Chunked-Transfer-Encoding.

  • client: Web-Client-Schnittstelle
  • html: HTML-Inhalt zum Senden

Verwendungsbeispiel

class CustomPage : public DIYablesWebAppPageBase { public: CustomPage() : DIYablesWebAppPageBase("/custom") {} void handleHTTPRequest(IWebClient& client) override { sendHTTPHeader(client); client.println("<html><body>Custom Page</body></html>"); } void handleWebSocketMessage(IWebSocket& ws, const char* message, uint16_t length) override { // Handle WebSocket messages sendWebSocketMessage(ws, "Response: " + String(message)); } const char* getPageInfo() const override { return " 🔧 Custom Page: "; } String getNavigationInfo() const override { return "<a href=\"/custom\" class=\"app-card custom\">" "<h3>🔧 Custom</h3><p>Custom functionality</p></a>"; } };

Webanwendungsklassen

DIYables Startseite

Zentrales Navigationszentrum, das Links zu allen aktivierten Anwendungen bereitstellt.

Konstruktor

DIYablesHomePage()

URL-Pfad

  • Pfad: / (Wurzelverzeichnis)

DIYablesWebChatSeite

Interaktive Chat-Schnittstelle für die zweiseitige Kommunikation mit Arduino.

Konstruktor

DIYablesWebChatPage()

URL-Pfad

  • Pfad: /webchat

Methoden

void onWebChatMessage(std::function<void(const String&)> callback)

Legt eine Callback-Funktion für eingehende Chatnachrichten fest.

void sendToWebChat(const String& message)

Sendet eine Nachricht an die Web-Chat-Schnittstelle.

DIYablesWebMonitorSeite

Webbasierter serieller Monitor für Echtzeitausgabe und Befehlseingabe.

Konstruktor

DIYablesWebMonitorPage()

URL-Pfad

  • Pfad: /webmonitor

Methoden

void onWebMonitorMessage(std::function<void(const String&)> callback)

Legt einen Callback für eingehende Monitor-Nachrichten fest.

void sendToWebMonitor(const String& message)

Sendet eine Nachricht an die Webmonitor-Schnittstelle.

DIYablesWebDigitalPinsPage

Steuern und überwachen Sie digitale Pins 0–13 über die Weboberfläche.

Konstruktor

DIYablesWebDigitalPinsPage()

URL-Pfad

  • Pfad: /webdigitalpins

Methoden

void enablePin(int pin, int mode)

Ermöglicht eine PIN für die Websteuerung.

  • Pin: Pin-Nummer (0-13)
  • Modus: WEB_PIN_OUTPUT oder WEB_PIN_INPUT
void onPinWrite(std::function<void(int, int)> callback)

Legt einen Callback für Schreibvorgänge an Pins (Ausgangspins) fest.

void onPinRead(std::function<int(int)> callback)

Legt die Callback-Funktion für Pin-Lesevorgänge fest (Eingangs-Pins).

void onPinModeChange(std::function<void(int, int)> callback)

Setzt einen Callback für Pin-Modusänderungen.

void updatePinState(int pin, int state)

Aktualisiert den PIN-Status in Echtzeit für Web-Clients.

DIYablesWebSliderPage

Doppelschieberegler-Steuerung für analoge/PWM-Anwendungen.

Konstruktor

DIYablesWebSliderPage()

URL-Pfad

  • Pfad: /webslider

Methoden

void onSliderValueFromWeb(std::function<void(int, int)> callback)

Legt eine Callback-Funktion für Änderungen des Sliderwerts aus dem Web fest.

  • Parameter: slider1 (0-255), slider2 (0-255)
void onSliderValueToWeb(std::function<void()> callback)

Legt einen Callback für den Web-Client fest, der aktuelle Werte anfordert.

void sendToWebSlider(int slider1, int slider2)

Schiebereglerwerte an die Weboberfläche senden.

DIYablesWebJoystickSeite

2D-Joystick-Steuerung für Robotik- und Positionierungsanwendungen.

Konstruktor

DIYablesWebJoystickPage(bool autoReturn = true, float sensitivity = 10.0)
  • autoReturn: Ob der Joystick automatisch zur Mitte zurückkehrt
  • sensitivity: Mindestbewegung in Prozent, um Aktualisierungen auszulösen

URL-Pfad

  • Pfad: /webjoystick

Methoden

void onJoystickValueFromWeb(std::function<void(int, int)> callback)

Legt einen Callback für Joystick-Bewegung aus dem Web fest.

  • Parameter: x (-100 bis 100), y (-100 bis 100)
void onJoystickValueToWeb(std::function<void()> callback)

Legt einen Callback für den Web-Client fest, der die aktuelle Position anfordert.

void sendToWebJoystick(int x, int y)

Sendet die Joystick-Position an die Weboberfläche.

void setAutoReturn(bool autoReturn)

Legt das Verhalten der automatischen Rückkehr fest.

void setSensitivity(float sensitivity)

Stellt die Bewegungsempfindlichkeit ein (Prozentsatz).

DIYablesWebPlotterSeite

Echtzeit-Datenvisualisierung mit Unterstützung mehrerer Datenreihen.

Konstruktor

DIYablesWebPlotterPage()

URL-Pfad

  • Pfad: /webplotter

Methoden

void setPlotTitle(const String& title)

Stellt den Diagrammtitel ein.

void setAxisLabels(const String& xLabel, const String& yLabel)

Achsenbeschriftungen festlegen.

void enableAutoScale(bool enable)

Aktiviert bzw. deaktiviert die automatische Skalierung der Y-Achse.

void setMaxSamples(int maxSamples)

Legt die maximale Anzahl der anzuzeigenden Datenpunkte fest.

void addDataPoint(const String& seriesName, float x, float y)

Fügt einen Datenpunkt zu einer Datenreihe hinzu.

void clearPlot()

Alle Daten aus dem Diagramm löschen.

DIYables-Seite nicht gefunden

Optionale 404-Fehlerseite für eine bessere Benutzererfahrung.

Konstruktor

DIYablesNotFoundPage()

Grundlegendes Nutzungsbeispiel

#include <DIYablesWebApps.h> // WiFi credentials const char* ssid = "YOUR_WIFI_SSID"; const char* password = "YOUR_WIFI_PASSWORD"; // Create server and web applications DIYablesWebAppServer webAppsServer(80, 81); DIYablesHomePage homePage; DIYablesWebChatPage chatPage; DIYablesWebMonitorPage monitorPage; void setup() { Serial.begin(9600); // Add only the applications you need webAppsServer.addApp(&homePage); webAppsServer.addApp(&chatPage); webAppsServer.addApp(&monitorPage); // Optional: Add 404 page webAppsServer.setNotFoundPage(DIYablesNotFoundPage()); // Start server if (webAppsServer.begin(ssid, password)) { Serial.println("Server started successfully"); Serial.print("IP: "); Serial.println(webAppsServer.getIPAddress()); } // Setup callbacks chatPage.onWebChatMessage([](const String& message) { Serial.println("Chat: " + message); chatPage.sendToWebChat("Arduino received: " + message); }); } void loop() { webAppsServer.loop(); delay(10); }

Überblick über Webanwendungen

Startseite

  • URL: http://[arduino-ip]/
  • Zweck: Zentrale Navigationsplattform
  • Funktionen: Verknüpfungen zu allen aktivierten Anwendungen, Verbindungsstatus

WebChat-Anwendung

  • URL: http://[arduino-ip]/webchat
  • Zweck: Zwei-Wege-Kommunikationsschnittstelle
  • Funktionen: Echtzeit-Nachrichtenübermittlung, Nachrichtenverlauf, WebSocket-Status

Web-Überwachung

  • URL: http://[arduino-ip]/webmonitor
  • Zweck: Ersatz für den seriellen Monitor
  • Funktionen: Serielle Ausgabe in Echtzeit, Befehlseingabe, dunkles Design

Webbasierte Steuerung digitaler Pins

  • URL: http://[arduino-ip]/webdigitalpins
  • Zweck: Digitale Pins 0-13 steuern
  • Funktionen: Individuelle Pin-Steuerung, Massenoperationen, Status in Echtzeit

Web-Schieberegler-Steuerung

  • URL: http://[arduino-ip]/webslider
  • Zweck: Duale Analog-/PWM-Steuerung
  • Eigenschaften: Zwei unabhängige Schieberegler (0-255), voreingestellte Werte, Feedback in Echtzeit

Web-Joystick-Steuerung

  • URL: http://[arduino-ip]/webjoystick
  • Zweck: 2D-Positionssteuerung für Roboter und Fahrzeuge
  • Funktionen: Touch-/Maussteuerung, Koordinatenanzeige, Empfindlichkeitseinstellung

Webplotter

  • URL: http://[arduino-ip]/webplotter
  • Zweck: Echtzeit-Datenvisualisierung
  • Funktionen: Mehrere Datenreihen, automatische Skalierung, konfigurierbare Titel und Achsen

WebSocket-Kommunikation

Alle Anwendungen verwenden WebSocket auf Port 81 für die Echtzeitkommunikation:

  • WebSocket-URL: ws://[arduino-ip]:81
  • Verbindung: Automatische Wiederverbindung bei Verbindungsabbruch
  • Protokoll: Textbasiertes Nachrichtenformat

Nachrichtenformate

WebChat-Nachrichten

  • Vom Web: Direkte Textnachricht
  • Zum Web: Direkte Textnachricht

Webmonitor-Nachrichten

  • Vom Web: Direkte Textnachricht
  • Zum Web: Direkte Textnachricht

Web Digitale PIN-Nachrichten

  • Vom Web: JSON-Format: {"pin": 13, "state": 1}
  • Zum Web: JSON-Format: {"pin": 13, "state": 1}

Web-Slider-Nachrichten

  • Aus dem Web: JSON-Format: {"slider1": 128, "slider2": 255}
  • Zum Web: JSON-Format: {"slider1": 128, "slider2": 255}

Web-Joystick-Nachrichten

  • Aus dem Web: JSON-Format: {"x": 50, "y": -25}
  • Zum Web: JSON-Format: {"x": 50, "y": -25}

Web-Plotter-Nachrichten

  • Aus dem Web: Nicht anwendbar (nur zur Anzeige)
  • Zum Web: JSON-Format: {"series": "temp", "x": 10.5, "y": 23.4}

Fehlerbehandlung

Die Bibliothek enthält automatische Fehlerbehandlung für:

  • WLAN-Verbindungsfehler
  • WebSocket-Verbindungsabbrüche
  • Ungültige Nachrichtenformate
  • Client-Verbindungsgrenzen

Speicherverbrauch

Vorteile einer modularen Architektur: Schließen Sie nur die Webanwendungen ein, die Sie benötigen, um den Speicherverbrauch zu optimieren.

Geschätzter Speicherverbrauch pro Komponente:

  • DIYablesWebAppServer: ca. 8 KB Flash-Speicher, ca. 2 KB Arbeitsspeicher
  • DIYablesHomePage: ca. 3 KB Flash-Speicher, ca. 1 KB Arbeitsspeicher
  • DIYablesWebChatPage: ca. 6 KB Flash-Speicher, ca. 1,5 KB Arbeitsspeicher
  • DIYablesWebMonitorPage: ca. 5 KB Flash-Speicher, ca. 1,5 KB Arbeitsspeicher
  • DIYablesWebDigitalPinsPage: ca. 8 KB Flash-Speicher, ca. 2 KB Arbeitsspeicher
  • DIYablesWebSliderPage: ca. 6 KB Flash-Speicher, ca. 1,5 KB Arbeitsspeicher
  • DIYablesWebJoystickPage: ca. 7 KB Flash-Speicher, ca. 1,5 KB Arbeitsspeicher
  • DIYablesWebPlotterPage: ca. 10 KB Flash-Speicher, ca. 2 KB Arbeitsspeicher
  • WebSocket-Puffer: ca. 1 KB Arbeitsspeicher je Verbindung

Gesamt, wenn alle Apps aktiviert sind: ~53 KB Flash-Speicher, ~12 KB RAM

Minimale Einrichtung (Server + Home + 1 App): ~17 kB Flash-Speicher, ~4,5 kB RAM

Browser-Kompatibilität

Unterstützte Browser:

  • Chrome 50+
  • Firefox 45+
  • Safari 10+
  • Edge 79+
  • Mobile-Browser (iOS Safari, Chrome Mobile)

Sicherheitshinweise

  • Keine Authentifizierung implementiert (nur geeignet für lokale Netzwerke)
  • Nur in vertrauenswürdigen Netzwerken verwenden
  • Erwägen Sie, Authentifizierung für öffentliche Bereitstellungen hinzuzufügen

Fehlerbehebung

Häufige Probleme

  1. Kann keine Verbindung zum WLAN herstellen
  • SSID und Passwort überprüfen
  • Überprüfen Sie, ob das Netzwerk 2,4-GHz verwendet (nicht 5-GHz)
  • Signalstärke prüfen

i. Die WebSocket-Verbindung schlägt fehl

  • Überprüfen Sie, ob die IP-Adresse korrekt ist.
  • Firewall-Einstellungen überprüfen
  • Versuchen Sie einen anderen Browser
  1. Hoher Speicherverbrauch
  • Nicht verwendete Anwendungen deaktivieren
  • Gleichzeitige Verbindungen begrenzen
  • Starte Arduino neu, falls Speicherfragmentierung auftritt.
  1. Langsame Antwort
  • WLAN-Signalstärke überprüfen
  • Reduziere die Frequenz der WebSocket-Nachrichten
  • Verwenden Sie kürzere Callback-Funktionen.

Beispielprojekte

Beispielanwendungen

Die DIYables WebApps-Bibliothek enthält umfassende Beispiele, die speziell für die Arduino Uno R4 WiFi- und DIYables STEM V4 IoT-Bildungsplattform entwickelt wurden:

Verfügbare Beispiele

  • Chat-Beispiel: Bidirektionale Kommunikationsschnittstelle
  • WebMonitor-Beispiel: Ersatz für den seriellen Monitor mit erweiterten Funktionen
  • WebDigitalPins-Beispiel: Steuere alle digitalen Pins mit visuellem Feedback
  • WebSlider-Beispiel: Duale Analog- und PWM-Steuerung mit Voreinstellungen
  • WebJoystick-Beispiel: 2D-Positionssteuerung für Robotikprojekte
  • MultipleWebApps-Beispiel: Alle Anwendungen laufen gleichzeitig

Hardware-Kompatibilität

  • Empfohlen: DIYables STEM V4 IoT (erweiterte Funktionen, integrierte Sensoren)
  • Kompatibel: Arduino Uno R4 WiFi

Tutorial-Ressourcen

Vollständige Schritt-für-Schritt-Anleitungen verfügbar unter:

  • Newbiely.com/tutorials/arduino/arduino-uno-r4-wifi-web-apps
  • DIYables STEM V4 IoT-spezifische Anleitungen und Beispiele zur Sensorintegration

Siehe den Ordner examples/ für vollständige Projekte und den Ordner docs/ für detaillierte Installationsanweisungen.

Plattformabstraktionsschnittstellen

Die DIYables WebApps-Bibliothek verwendet eine Plattformabstraktionsschicht mit Schnittstellen, die die Unterstützung mehrerer Hardwareplattformen ermöglichen. Diese Schnittstellen trennen die Kernfunktionalität der WebApp von plattformabhängigen Implementierungen.

Kern-Schnittstellen

IWebClient

Schnittstelle für HTTP-Client-Verbindungen.

class IWebClient { public: virtual ~IWebClient() = default; // Stream interface methods virtual int available() = 0; virtual int read() = 0; virtual int peek() = 0; virtual size_t write(uint8_t data) = 0; virtual size_t write(const uint8_t* buffer, size_t size) = 0; virtual void flush() = 0; // Connection management virtual bool connected() = 0; virtual void stop() = 0; // Convenience methods virtual void print(const String& str) = 0; virtual void println(const String& str) = 0; };

IWebSocket

Schnittstelle für WebSocket-Verbindungen mit bidirektionaler Kommunikation.

class IWebSocket { public: enum DataType { TEXT = 1, BINARY = 2 }; enum CloseCode { NORMAL_CLOSURE = 1000, GOING_AWAY = 1001, PROTOCOL_ERROR = 1002, UNSUPPORTED_DATA = 1003, POLICY_VIOLATION = 1008, MESSAGE_TOO_BIG = 1009, INTERNAL_ERROR = 1011 }; virtual ~IWebSocket() = default; // Message handling virtual void sendText(const char* message) = 0; virtual void sendBinary(const uint8_t* data, size_t length) = 0; virtual bool isConnected() const = 0; virtual void close(CloseCode code = NORMAL_CLOSURE, const char* reason = nullptr) = 0; // Event callbacks virtual void onMessage(std::function<void(IWebSocket*, DataType, const char*, uint16_t)> callback) = 0; virtual void onClose(std::function<void(IWebSocket*, CloseCode, const char*, uint16_t)> callback) = 0; };

IWebServer

Schnittstelle für die HTTP-Server-Funktionalität.

class IWebServer { public: virtual ~IWebServer() = default; // Server lifecycle virtual bool begin() = 0; virtual void stop() = 0; virtual IWebClient* available() = 0; // Configuration virtual void setPort(uint16_t port) = 0; virtual uint16_t getPort() const = 0; };

IWebSocketServer

Schnittstelle für WebSocket-Server mit Verbindungsverwaltung.

class IWebSocketServer { public: using ConnectionCallback = std::function<void(IWebSocket*)>; using MessageCallback = std::function<void(IWebSocket*, IWebSocket::DataType, const char*, uint16_t)>; virtual ~IWebSocketServer() = default; // Server lifecycle virtual bool begin() = 0; virtual void stop() = 0; virtual void listen() = 0; // Event handling virtual void onConnection(ConnectionCallback callback) = 0; virtual void onMessage(MessageCallback callback) = 0; // Broadcasting virtual void broadcastText(const char* message) = 0; virtual void broadcastBinary(const uint8_t* data, size_t length) = 0; // Configuration virtual void setPort(uint16_t port) = 0; virtual uint16_t getPort() const = 0; };

INetzwerkAnbieter

Schnittstelle zur Verwaltung der Netzwerkverbindungen.

class INetworkProvider { public: virtual ~INetworkProvider() = default; // Network lifecycle virtual bool begin(const char* ssid, const char* password) = 0; virtual void end() = 0; virtual bool isConnected() = 0; // Network information virtual String getLocalIP() = 0; virtual String getSSID() = 0; virtual int32_t getRSSI() = 0; };

IServerFactory

Fabrik-Schnittstelle zur Erstellung plattformabhängiger Implementierungen.

class IServerFactory { public: virtual ~IServerFactory() = default; // Factory methods virtual INetworkProvider* createNetworkProvider() = 0; virtual IWebServer* createWebServer(uint16_t port) = 0; virtual IWebSocketServer* createWebSocketServer(uint16_t port) = 0; // Platform information virtual String getPlatformName() const = 0; };

Beispiel zur Plattformimplementierung

Für Arduino Uno R4 WiFi werden die Schnittstellen mit der UnoR4WiFi_WebServer-Bibliothek implementiert:

class UnoR4ServerFactory : public IServerFactory { public: INetworkProvider* createNetworkProvider() override { return new UnoR4NetworkProvider(); } IWebServer* createWebServer(uint16_t port) override { return new UnoR4WebServer(port); } IWebSocketServer* createWebSocketServer(uint16_t port) override { return new UnoR4WebSocketServer(port); } String getPlatformName() const override { return "Arduino Uno R4 WiFi"; } };

Unterstützung für neue Plattformen hinzufügen

Um die Unterstützung für eine neue Plattform hinzuzufügen (z. B. ESP32):

  1. Alle Schnittstellen für die Zielplattform implementieren
  2. Erstelle eine ServerFactory, die deine Implementierungen instanziiert
  3. Behandle plattformabhängige Netzwerkkommunikation und WebSocket-Protokolle
  4. Teste mit bestehenden WebApp-Klassen (keine Änderungen erforderlich)

Beispielanwendung auf verschiedenen Plattformen:

// Arduino Uno R4 WiFi UnoR4ServerFactory factory; DIYablesWebAppServer server(factory, 80, 81); // ESP32 (hypothetical) ESP32ServerFactory esp32Factory; DIYablesWebAppServer esp32Server(esp32Factory, 80, 81);

Vorteile des schnittstellenbasierten Designs

  • Plattformunabhängigkeit: Die Kern-WebApp-Logik funktioniert auf jeder Plattform
  • Erweiterbarkeit: Es ist einfach, neue Hardware-Unterstützung hinzuzufügen
  • Wartbarkeit: Plattformspezifischer Code ist isoliert
  • Testbarkeit: Schnittstellen können für Unit-Tests gemockt werden
  • Konsistenz: Die gleiche API über alle unterstützten Plattformen hinweg

Aktuelle Plattformunterstützung

  • Arduino Uno R4 WiFi: Vollständig implementiert und getestet
  • 🔄 ESP32: Verfügbar als separate Erweiterung - DIYables_WebApps_ESP32
  • 🚀 Zukünftige Plattformen: Können mit demselben Schnittstellenmuster hinzugefügt werden

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!