DIYables ESP32 WebApps 라이브러리 API 레퍼런스 전체 문서

개요

DIYables ESP32 WebApps 라이브러리는 ESP32에서 WebSocket 기반의 웹 애플리케이션을 개발하기 위한 포괄적이고 모듈식인 솔루션을 제공합니다. 또한 다수의 미리 구성된 웹 애플리케이션과 사용자 정의 애플리케이션을 만들기 위한 유연한 프레임워크를 포함합니다.

라이브러리는 필요한 웹 애플리케이션만 포함하도록 모듈식 아키텍처를 사용하여 메모리를 절약하고 성능을 향상시킵니다.

기능

  • 모듈식 아키텍처: 메모리 사용량을 최적화하기 위해 필요한 웹 앱만 추가
  • 메모리 효율적인: 각 웹 앱은 독립적으로 활성화/비활성화할 수 있습니다
  • 11개 이상 즉시 사용 가능한 웹 애플리케이션: 웹 프로그래밍 지식 없이 ESP32를 완전히 제어
  • 맞춤형 웹 앱 프레임워크: 기본 클래스 시스템을 사용하여 직접 애플리케이션을 만드세요
  • 실시간 통신: 실시간 업데이트를 위한 WebSocket 기반
  • 반응형 디자인: 데스크탑, 태블릿 및 모바일 기기에서 작동합니다
  • 쉬운 통합: 간단한 콜백 기반 API
  • 다중 앱 지원: 여러 웹 앱을 동시에 추가할 수 있습니다

핵심 클래스

DIYables 웹 애플리케이션 서버

웹 애플리케이션, HTTP 요청 및 WebSocket 통신을 관리하는 메인 서버 클래스.

생성자

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

웹 애플리케이션 서버 인스턴스를 생성합니다.

  • httpPort: HTTP 서버 포트 (기본값: 80)
  • websocketPort: 웹소켓 서버 포트 (기본값: 81)

방법

설정 및 연결
bool begin()

네트워크 연결을 초기화하고(이더넷 또는 사전 구성된 연결용) 웹 서버를 시작합니다.

  • 반환값: 성공 시 true, 실패 시 false
  • 사용 사례: 향후 이더넷 지원을 위한 것이거나 WiFi 자격 증명이 미리 구성된 경우
bool begin(const char* ssid, const char* password)

와이파이 연결을 초기화하고 웹 서버를 시작합니다.

  • ssid: WiFi 네트워크 이름
  • password: WiFi 비밀번호
  • Returns: 성공 시 true, 실패 시 false
  • Use case: 자격 증명이 있는 표준 WiFi 연결
void loop()

HTTP 요청 및 WebSocket 통신을 처리합니다. 메인 루프에서 호출되어야 합니다.

bool isConnected()

와이파이가 연결되면 true를 반환합니다.

String getIPAddress()

아두이노의 IP 주소를 문자열로 반환합니다.

애플리케이션 관리
void addApp(DIYablesWebAppPageBase* app)

웹 애플리케이션을 서버에 추가합니다.

  • : 웹 애플리케이션 인스턴스에 대한 포인터
void removeApp(const String& path)

URL 경로로 웹 애플리케이션을 제거합니다.

  • path: 애플리케이션의 URL 경로(예: "/chat")
DIYablesWebAppPageBase* getApp(const String& path)

URL 경로로 웹 애플리케이션을 가져옵니다.

  • 경로: 애플리케이션의 URL 경로
  • 반환값: 애플리케이션에 대한 포인터 또는 찾을 수 없으면 nullptr
void setNotFoundPage(const DIYablesNotFoundPage& page)

404 Not Found 페이지를 설정합니다(선택 사항).

  • 페이지: 404 페이지 인스턴스
특화된 앱 접근
DIYablesWebDigitalPinsPage* getWebDigitalPinsPage()

추가되면 디지털 핀 페이지 인스턴스를 가져옵니다.

  • 반환값: 디지털 핀 페이지에 대한 포인터 또는 nullptr
DIYablesWebSliderPage* getWebSliderPage()

추가되면 슬라이더 페이지 인스턴스를 가져옵니다.

  • 반환값: 슬라이더 페이지에 대한 포인터 또는 nullptr
DIYablesWebJoystickPage* getWebJoystickPage()

추가된 경우 조이스틱 페이지 인스턴스를 가져옵니다.

  • 반환값: 조이스틱 페이지에 대한 포인터 또는 nullptr

기본 클래스들

DIYables 웹앱 페이지 베이스

모든 웹 애플리케이션이 상속받는 추상 기본 클래스이며, HTTP 처리, WebSocket 통신 및 페이지 관리에 대한 공통 기능을 제공합니다.

생성자

DIYablesWebAppPageBase(const String& pagePath)

지정된 URL 경로로 기본 페이지 인스턴스를 생성합니다.

  • 페이지 경로: 페이지의 URL 경로(예: "/web-joystick")

가상 메서드(파생 클래스에서 구현해야 합니다)

virtual void handleHTTPRequest(IWebClient& client) = 0

이 페이지에 대한 HTTP 요청을 처리합니다. 순수 가상 메서드.

  • 클라이언트: 응답 전송용 웹 클라이언트 인터페이스
virtual void handleWebSocketMessage(IWebSocket& ws, const char* message, uint16_t length) = 0

이 페이지의 WebSocket 메시지를 처리합니다. 순수 가상 메서드.

  • ws: WebSocket 연결 인터페이스
  • message: 수신된 메시지 내용
  • length: 메시지 길이
virtual const char* getPageInfo() const = 0

연결 정보 표시에 사용되는 페이지 식별 문자열을 반환합니다. 순수 가상 메서드.

  • 반환값: 페이지 정보 문자열(예: "🕹️ 웹 조이스틱: ")
virtual String getNavigationInfo() const = 0

홈 페이지 네비게이션 버튼의 HTML을 반환합니다. 순수 가상 메서드.

  • 반환값: 네비게이션 카드용 HTML 문자열

가상 메서드 (선택적 재정의)

virtual void onWebSocketConnection(IWebSocket& ws)

새로운 WebSocket 연결이 성립될 때 호출됩니다.

  • ws: 새로운 WebSocket 연결
virtual void onWebSocketClose(IWebSocket& ws)

WebSocket 연결이 닫힐 때 호출됩니다.

  • ws: WebSocket 연결이 닫혔습니다.

일반적인 방법

const char* getPagePath() const

이 페이지의 URL 경로를 가져옵니다.

  • 반환값: 페이지 경로 문자열
bool isEnabled() const

페이지가 현재 활성화되어 있는지 확인합니다.

  • 반환값: 활성화되면 true, 비활성화되면 false
void setEnabled(bool enable)

페이지를 활성화하거나 비활성화합니다.

  • enable: true일 때 활성화, false일 때 비활성화

유틸리티 메서드들

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

클라이언트에 표준 HTTP 헤더를 보낸다.

  • 클라이언트: 웹 클라이언트 인터페이스
  • 콘텐츠 유형: MIME 타입 (기본값: "text/html")
void sendWebSocketMessage(IWebSocket& ws, const char* message)

특정 웹소켓 클라이언트에게 메시지를 보냅니다.

  • ws: 대상 WebSocket 연결
  • message: 보낼 메시지
void broadcastToAllClients(const char* message)

연결된 모든 웹소켓 클라이언트에게 메시지를 방송합니다.

  • 메시지: 방송할 메시지
void sendLargeHTML(IWebClient& client, const char* html)

청크 전송 인코딩을 사용하여 대용량 HTML 콘텐츠를 보냅니다.

  • 클라이언트: 웹 클라이언트 인터페이스
  • HTML: 전송할 HTML 콘텐츠

사용 예시

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>"; } };

웹 애플리케이션 클래스들

DIYables 홈페이지

모든 활성화된 애플리케이션에 대한 링크를 제공하는 중앙 탐색 허브.

생성자

DIYablesHomePage()

URL 경로

  • 경로: / (루트)

DIYables 웹 채팅 페이지

Arduino와의 양방향 통신을 위한 대화형 채팅 인터페이스.

생성자

DIYablesWebChatPage()

URL 경로

  • 경로: /webchat

방법

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

수신되는 채팅 메시지에 대한 콜백을 설정합니다.

void sendToWebChat(const String& message)

웹 채팅 인터페이스에 메시지를 보냅니다.

DIYables 웹 모니터 페이지

실시간 출력 및 명령 입력을 위한 웹 기반 시리얼 모니터.

생성자

DIYablesWebMonitorPage()

URL 경로

  • 경로: /webmonitor

방법

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

수신되는 모니터 메시지에 대한 콜백을 설정합니다.

void sendToWebMonitor(const String& message)

웹 모니터 인터페이스에 메시지를 보낸다.

DIYables 웹 디지털 핀 페이지

웹 인터페이스를 통해 디지털 핀 0-13을 제어하고 모니터링합니다.

생성자

DIYablesWebDigitalPinsPage()

URL 경로

  • 경로: /webdigitalpins

방법

void enablePin(int pin, int mode)

웹 제어용 핀을 활성화합니다.

  • pin: 핀 번호(0-13)
  • mode: WEB_PIN_OUTPUT 또는 WEB_PIN_INPUT
void onPinWrite(std::function<void(int, int)> callback)

출력 핀의 쓰기 작업에 대한 콜백을 설정합니다.

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

핀 읽기 작업에 대한 콜백을 설정합니다(입력 핀).

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

핀 모드 변경에 대한 콜백을 설정합니다.

void updatePinState(int pin, int state)

웹 클라이언트를 위한 핀 상태를 실시간으로 업데이트합니다.

DIYables 웹 슬라이더 페이지

아날로그/PWM 응용 프로그램을 위한 듀얼 슬라이더 컨트롤.

생성자

DIYablesWebSliderPage()

URL 경로

  • 경로: /webslider

방법

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

웹에서 슬라이더 값이 변경될 때의 콜백을 설정합니다.

  • 매개변수: slider1 (0-255), slider2 (0-255)
void onSliderValueToWeb(std::function<void()> callback)

현재 값을 요청하는 웹 클라이언트를 위한 콜백을 설정합니다.

void sendToWebSlider(int slider1, int slider2)

슬라이더 값을 웹 인터페이스로 전송합니다.

DIYables 웹 조이스틱 페이지

로봇 공학 및 위치 제어 응용을 위한 2차원 조이스틱 제어

생성자

DIYablesWebJoystickPage(bool autoReturn = true, float sensitivity = 10.0)
  • autoReturn: 조이스틱이 자동으로 중앙으로 돌아가는지 여부
  • sensitivity: 업데이트를 트리거하기 위한 최소 이동 비율

URL 경로

  • 경로: /webjoystick

방법

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

웹에서 조이스틱 움직임에 대한 콜백을 설정합니다.

  • 매개변수: x (-100에서 100까지), y (-100에서 100까지)
void onJoystickValueToWeb(std::function<void()> callback)

현재 위치를 요청하는 웹 클라이언트를 위한 콜백을 설정합니다.

void sendToWebJoystick(int x, int y)

조이스틱 위치를 웹 인터페이스로 전송합니다.

void setAutoReturn(bool autoReturn)

자동 반환 동작 설정

void setSensitivity(float sensitivity)

이동 민감도 설정(백분율).

DIYables 웹 플로터 페이지

다중 데이터 시리즈를 지원하는 실시간 데이터 시각화.

생성자

DIYablesWebPlotterPage()

URL 경로

경로: /webplotter

방법

void setPlotTitle(const String& title)

그래프 제목을 설정합니다.

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

축 레이블을 설정합니다.

void enableAutoScale(bool enable)

자동 Y축 스케일링을 활성화하거나 비활성화합니다.

void setMaxSamples(int maxSamples)

표시할 데이터 포인트의 최대 개수를 설정합니다.

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

시계열에 데이터 포인트를 추가합니다.

void clearPlot()

그래프의 모든 데이터를 지웁니다.

DIY 가능한 아이템을 찾을 수 없는 페이지

더 나은 사용자 경험을 위한 선택적 404 오류 페이지.

생성자

DIYablesNotFoundPage()

기본 사용 예제

#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); }

웹 애플리케이션 개요

홈 페이지

  • 주소: http://[esp32-ip]/
  • 목적: 중앙 탐색 허브
  • 기능: 활성화된 모든 애플리케이션으로의 링크, 연결 상태

웹 채팅 애플리케이션

  • URL: http://[esp32-ip]/webchat
  • 목적: 양방향 통신 인터페이스
  • 주요 기능: 실시간 메시징, 메시지 기록, WebSocket 상태

웹 모니터

  • URL: http://[esp32-ip]/webmonitor
  • 목적: 시리얼 모니터 대체
  • 주요 기능: 실시간 시리얼 출력, 명령 입력, 다크 테마

웹 디지털 핀 제어

  • URL: http://[esp32-ip]/webdigitalpins
  • 목적: 디지털 핀 0-13 제어
  • 특징: 개별 핀 제어, 대량 작업, 실시간 상태

웹 슬라이더 컨트롤

  • URL: http://[esp32-ip]/webslider
  • 목적: 듀얼 아날로그/PWM 제어
  • 특징: 두 개의 독립적인 슬라이더(0-255), 프리셋 값, 실시간 피드백

웹 조이스틱 제어

  • URL: http://[esp32-ip]/webjoystick
  • 목적: 로봇/차량의 2D 위치 제어
  • 특징: 터치/마우스 제어, 좌표 표시, 감도 조정

웹 플로터

  • URL: http://[esp32-ip]/webplotter
  • Purpose: 실시간 데이터 시각화
  • Features: 다중 데이터 시리즈, 자동 스케일링, 제목 및 축 구성 가능

웹소켓 통신

모든 애플리케이션은 실시간 통신을 위해 포트 81에서 WebSocket을 사용합니다:

  • 웹소켓 URL: ws://[esp32-ip]:81
  • 연결: 연결이 끊어지면 자동 재연결
  • 프로토콜: 텍스트 기반 메시지 형식

메시지 형식

웹 채팅 메시지

  • 웹에서: 직접 텍스트 메시지
  • 웹으로: 직접 텍스트 메시지

웹 모니터링 메시지

  • 웹에서: 직접 문자 메시지
  • 웹으로: 직접 문자 메시지

웹 디지털 핀 메시지

  • 웹에서: JSON 형식: {"pin": 13, "state": 1}
  • 웹으로: JSON 형식: {"pin": 13, "state": 1}

웹 슬라이더 메시지

  • 웹에서: JSON 형식: {"slider1": 128, "slider2": 255}
  • 웹으로: JSON 형식: {"slider1": 128, "slider2": 255}

웹 조이스틱 메시지

  • 웹에서: JSON 형식: {"x": 50, "y": -25}
  • 웹으로: JSON 형식: {"x": 50, "y": -25}

웹 플로터 메시지

  • 웹에서: 해당되지 않음(표시 전용)
  • 웹으로: JSON 형식: {"series": "temp", "x": 10.5, "y": 23.4}

에러 처리

라이브러리는 다음에 대한 자동 오류 처리를 포함합니다:

  • 와이파이 연결 실패
  • WebSocket 연결 끊김
  • 잘못된 메시지 형식
  • 클라이언트 연결 수 제한

메모리 사용량

모듈식 아키텍처의 이점: 필요한 웹 애플리케이션만 포함하여 메모리 사용량을 최적화하세요.

구성요소당 대략적인 메모리 사용량:

  • DIYablesWebAppServer: ~8KB 플래시, ~2KB 램
  • DIYablesHomePage: ~3KB 플래시, ~1KB 램
  • DIYablesWebChatPage: ~6KB 플래시, ~1.5KB 램
  • DIYablesWebMonitorPage: ~5KB 플래시, ~1.5KB 램
  • DIYablesWebDigitalPinsPage: ~8KB 플래시, ~2KB 램
  • DIYablesWebSliderPage: ~6KB 플래시, ~1.5KB 램
  • DIYablesWebJoystickPage: ~7KB 플래시, ~1.5KB 램
  • DIYablesWebPlotterPage: ~10KB 플래시, ~2KB 램
  • WebSocket 버퍼: ~1KB 램(연결당)

모든 앱 활성화 시 총합: ~53KB 플래시, ~12KB 램

최소 설정 (서버 + 홈 + 1개의 앱): ~17KB의 플래시 메모리, ~4.5KB의 램

브라우저 호환성

지원되는 브라우저:

  • 크롬 50 이상
  • 파이어폭스 45 이상
  • 사파리 10 이상
  • 엣지 79 이상
  • 모바일 브라우저(iOS 사파리, 크롬 모바일)

보안 주의사항

  • 인증이 구현되어 있지 않음(로컬 네트워크에만 적합)
  • 신뢰할 수 있는 네트워크에서만 사용
  • 공개 배포에 대한 인증 추가를 고려하십시오

문제 해결

일반적인 문제

  1. 와이파이에 연결할 수 없습니다
  • SSID와 비밀번호 확인
  • 네트워크가 2.4GHz인지 확인합니다(5GHz가 아님)
  • 신호 강도 확인
  1. WebSocket 연결 실패
  • IP 주소가 올바른지 확인

방화벽 설정을 확인하세요

  • 다른 브라우저를 사용해 보세요
  1. 높은 메모리 사용량
  • 사용하지 않는 애플리케이션 비활성화

동시 연결 수 제한

  • 메모리 단편화가 발생하면 ESP32를 재시작합니다
  1. 느린 응답
  • 와이파이 신호 강도 확인
  • WebSocket 메시지 전송 빈도 감소

더 짧은 콜백 함수를 사용하세요.

예시 프로젝트

예시 애플리케이션

DIYables ESP32 WebApps 라이브러리는 ESP32 교육용 플랫폼을 위해 설계된 포괄적인 예제를 포함합니다:

사용 가능한 예제

  • 채팅 예시: 양방향 통신 인터페이스
  • 웹 모니터 예시: 향상된 기능을 갖춘 직렬 모니터 대체
  • 웹 디지털 핀 예시: 시각적 피드백으로 모든 디지털 핀을 제어
  • 웹 슬라이더 예시: 프리셋이 있는 이중 아날로그/PWM 제어
  • 웹 조이스틱 예시: 로봇 프로젝트용 2D 위치 제어
  • 다중 웹 앱 예시: 모든 애플리케이션이 동시에 실행

완전한 프로젝트는 examples/ 폴더를 확인하고, 자세한 설정 지침은 docs/ 폴더를 확인하십시오.

플랫폼 추상화 인터페이스

DIYables ESP32 WebApps 라이브러리는 다수의 하드웨어 플랫폼을 지원할 수 있도록 하는 인터페이스를 갖춘 플랫폼 추상화 계층을 사용합니다. 이 인터페이스들은 핵심 WebApp 기능을 플랫폼별 구현으로부터 분리합니다.

핵심 인터페이스

IWebClient

HTTP 클라이언트 연결을 위한 인터페이스.

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

양방향 통신을 지원하는 웹소켓 연결 인터페이스.

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; };

아이웹서버

HTTP 서버 기능을 위한 인터페이스.

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; };

I웹소켓서버

연결 관리 기능이 있는 웹소켓 서버 인터페이스

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; };

INetworkProvider

네트워크 연결 관리를 위한 인터페이스.

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

플랫폼별 구현체 생성을 위한 팩토리 인터페이스.

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; };

플랫폼 구현 예시

ESP32용 인터페이스는 DIYables_ESP32_WebServer 라이브러리를 사용하여 구현됩니다:

class ESP32ServerFactory : public IServerFactory { public: INetworkProvider* createNetworkProvider() override { return new ESP32NetworkProvider(); } IWebServer* createWebServer(uint16_t port) override { return new ESP32WebServer(port); } IWebSocketServer* createWebSocketServer(uint16_t port) override { return new ESP32WebSocketServer(port); } String getPlatformName() const override { return "ESP32"; } };

새로운 플랫폼 지원 추가

새로운 플랫폼(예: ESP32)에 대한 지원을 추가하려면:

  1. 타깃 플랫폼용 모든 인터페이스를 구현한다
  2. 당신의 구현을 인스턴스화하는 ServerFactory를 생성한다
  3. 플랫폼별 네트워킹 처리 및 WebSocket 프로토콜을 다룬다
  4. 기존 WebApp 클래스와 함께 테스트한다 (변경 필요 없음)

다양한 플랫폼에서의 사용 예시:

ESP32ServerFactory factory; DIYablesWebAppServer server(factory, 80, 81); // ESP32 (hypothetical) ESP32ServerFactory esp32Factory; DIYablesWebAppServer esp32Server(esp32Factory, 80, 81);

인터페이스 기반 설계의 이점

  • 플랫폼 독립성: 코어 WebApp 로직은 어떤 플랫폼에서도 작동합니다
  • 확장성: 새로운 하드웨어 지원을 쉽게 추가할 수 있습니다
  • 유지보수성: 플랫폼별 코드는 격리되어 있습니다
  • 테스트 용이성: 인터페이스를 단위 테스트를 위해 모의(mock) 객체로 대체할 수 있습니다
  • 일관성: 지원되는 모든 플랫폼에서 동일한 API를 제공합니다

현재 플랫폼 지원

  • ESP32: 완전히 구현되었고 테스트되었습니다
  • 🔄 ESP32: 별도의 확장으로 이용 가능 - DIYables_WebApps_ESP32
  • 🚀 향후 플랫폼들: 같은 인터페이스 패턴으로 추가할 수 있습니다