WebSocketAppBase

network
network/WebSocketAppBase.h
network

Tool: WebSocketAppBase Socle commun à tout périphérique CREPP qui expose une page web servie en HTTP et mise à jour en temps réel via WebSocket. Regroupe UNIQUEMENT la mécanique de transport, strictement identique entre PicoWebTerminal et WebControlPanel avant ce refactor :

Méthodes publiques

Méthode Description Paramètres Retour
WebSocketAppBase()
WebSocketAppBase(uint16_t httpPort, uint16_t wsPort);
Construit les serveurs HTTP/WebSocket (ne démarre rien tant que beginServers() n'est pas appelé par la classe fille). / httpPort: Port du serveur HTTP.
wsPort: Port du serveur WebSocket. /
getConnectedClients()
getConnectedClients();
Nombre de navigateurs actuellement connectés au WebSocket. /
getServerIP()
getServerIP() const;
Adresse IP courante (point d'accès ou réseau existant, selon le mode WiFi actif au moment de l'appel). /
beginMDNS()
beginMDNS(const String& hostname);
Démarre un nom mDNS (ex: "robot-crepp.local") pour accéder à l'interface sans connaître l'adresse IP. A appeler après avoir connecté le WiFi (connectToWiFi()/startAP()), avant ou après begin()/beginServers(). aucune bibliothèque mDNS compatible n'est disponible pour le hostname: Nom sans le suffixe ".local" (ex: "robot-crepp"). true
true si le service mDNS a démarré. Renvoie toujours false si aucune bibliothèque mDNS compatible n'est disponible pour le coeur Arduino utilisé (voir le commentaire en tête de fichier) — dans ce cas, utilisez l'adresse IP donnée par getServerIP(). /

Méthodes privées


            handleHttpClient(WiFiClient& client);;

                    

Variables membres


            WiFiServer _httpServer;
WebSocketsServer _wsServer;
uint16_t _httpPort;
uint16_t _wsPort;

                    

Code source


        // WebSocketAppBase.h
#pragma once

#include <Arduino.h>
#include <WiFi.h>
#include <WebSocketsServer.h>

// Support mDNS optionnel : selon le coeur Arduino utilisé (arduino-pico,
// ESP32, ESP8266...), la bibliothèque mDNS n'a pas le même nom d'en-tête.
// Si aucune des deux n'est disponible, beginMDNS() compile quand même mais
// ne fait rien et renvoie false (pas d'erreur de compilation bloquante).
#if __has_include(<LEAmDNS.h>)
    #include <LEAmDNS.h>
    #define CREPP_HAS_MDNS 1
#elif __has_include(<ESPmDNS.h>)
    #include <ESPmDNS.h>
    #define CREPP_HAS_MDNS 1
#else
    #define CREPP_HAS_MDNS 0
#endif

namespace crepp::network {

/*
 * =========================
 * Tool: WebSocketAppBase
 * -------------------------
 * Socle commun à tout périphérique CREPP qui expose une page web servie en
 * HTTP et mise à jour en temps réel via WebSocket. Regroupe UNIQUEMENT la
 * mécanique de transport, strictement identique entre PicoWebTerminal et
 * WebControlPanel avant ce refactor :
 * - le serveur HTTP (une seule page HTML, régénérée à chaque requête)
 * - la boucle et le comptage de clients du serveur WebSocket
 *
 * @badge network
 *
 * @note Classe de base interne : elle n'est pas destinée à être instanciée
 *       directement dans un sketch. Utilisez PicoWebTerminal ou
 *       WebControlPanel, qui en héritent.
 *
 * @note Chaque classe fille garde entièrement son propre protocole de
 *       messages (elle appelle _wsServer.onEvent(...) elle-même dans son
 *       begin()) et tout son contenu "métier" (widgets, thème, commandes
 *       pour PicoWebTerminal ; boutons/sliders/etc pour WebControlPanel).
 *       Cette base ne connaît rien du contenu de la page ni du protocole
 *       applicatif : seulement comment servir la page et faire tourner le
 *       WebSocket.
 * =========================
 */
class WebSocketAppBase {
public:
    /**
     * @brief Construit les serveurs HTTP/WebSocket (ne démarre rien tant
     *        que beginServers() n'est pas appelé par la classe fille).
     * @param httpPort Port du serveur HTTP.
     * @param wsPort   Port du serveur WebSocket.
     */
    WebSocketAppBase(uint16_t httpPort, uint16_t wsPort);
    virtual ~WebSocketAppBase() = default;

    /**
     * @brief Nombre de navigateurs actuellement connectés au WebSocket.
     */
    int getConnectedClients();

    /**
     * @brief Adresse IP courante (point d'accès ou réseau existant, selon
     *        le mode WiFi actif au moment de l'appel).
     */
    String getServerIP() const;

    /**
     * @brief Démarre un nom mDNS (ex: "robot-crepp.local") pour accéder à
     *        l'interface sans connaître l'adresse IP. A appeler après avoir
     *        connecté le WiFi (connectToWiFi()/startAP()), avant ou après
     *        begin()/beginServers().
     * @param hostname Nom sans le suffixe ".local" (ex: "robot-crepp").
     * @return true si le service mDNS a démarré. Renvoie toujours false si
     *         aucune bibliothèque mDNS compatible n'est disponible pour le
     *         coeur Arduino utilisé (voir le commentaire en tête de fichier)
     *         — dans ce cas, utilisez l'adresse IP donnée par getServerIP().
     */
    bool beginMDNS(const String& hostname);

protected:
    WiFiServer _httpServer;
    WebSocketsServer _wsServer;
    uint16_t _httpPort;
    uint16_t _wsPort;

    /**
     * @brief Démarre les deux serveurs (_httpServer.begin() +
     *        _wsServer.begin()). A appeler dans le begin() de la classe
     *        fille, qui doit ensuite enregistrer son propre
     *        _wsServer.onEvent(...) pour son protocole applicatif.
     */
    void beginServers();

    /**
     * @brief A appeler dans le loop() de la classe fille : accepte les
     *        nouvelles connexions HTTP (sert generateHtmlPage()) et fait
     *        avancer le WebSocket. Ne gère pas la logique métier propre à
     *        la classe fille (ex: animation de clignotement), qui reste à
     *        sa charge après cet appel.
     */
    void loopServers();

    /**
     * @brief Génère la page HTML unique servie à chaque requête HTTP.
     *        Chaque classe fille fournit son propre contenu.
     */
    virtual String generateHtmlPage() = 0;

private:
    void handleHttpClient(WiFiClient& client);
};

} // namespace crepp::network