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

개요

DIYables WebApps 라이브러리는 모듈식의 포괄적인 솔루션으로 WebSocket 기반의 웹 애플리케이션을 Arduino Uno R4 WiFiDIYables STEM V4 IoT에서 만들 수 있게 제공합니다. 여러 개의 미리 구축된 웹 애플리케이션과 맞춤형 애플리케이션 생성을 위한 유연한 프레임워크를 포함합니다. DIYables STEM V4 IoT 교육 플랫폼에 특별히 최적화되어 있으며 향상된 IoT 기능과 내장 센서 통합을 제공합니다.

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

특징

  • 모듈식 아키텍처: 메모리 사용 최적화를 위해 필요한 웹 앱만 추가하십시오
  • 메모리 효율성: 각 웹 앱은 독립적으로 활성화/비활성화할 수 있습니다
  • 11개 이상 바로 사용 가능한 웹 애플리케이션: 웹 프로그래밍 지식 없이 Arduino를 완전히 제어할 수 있습니다
  • 맞춤형 웹 앱 프레임워크: 기반 클래스 시스템을 사용하여 직접 애플리케이션을 만들 수 있습니다
  • 실시간 통신: 즉시 업데이트를 위한 웹소켓 기반입니다
  • 반응형 디자인: 데스크톱, 태블릿, 모바일 기기에서 작동합니다
  • 간편한 통합: 간단한 콜백 기반 API
  • 다중 앱 지원: 여러 웹 앱을 동시에 추가할 수 있습니다
  • 플랫폼 확장 가능: 현재 Arduino Uno R4 WiFi에 대해 구현되어 있지만, 다른 하드웨어 플랫폼으로 확장할 수 있습니다. 자세한 내용은 DIYables_WebApps_ESP32 를 참조하십시오

핵심 클래스

DIYables 웹 앱 서버

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

생성자

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

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

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

방법

설정 및 연결
bool begin()

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

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

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

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

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

bool isConnected()

와이파이가 연결되면 참을 반환합니다.

String getIPAddress()

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

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

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

  • : 웹 애플리케이션 인스턴스를 가리키는 포인터
void removeApp(const String& path)

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

  • 경로: 애플리케이션의 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 경로로 기본 페이지 인스턴스를 생성합니다.

  • pagePath: 페이지의 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

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

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

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

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

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

virtual void onWebSocketConnection(IWebSocket& ws)

새로운 WebSocket 연결이 설정될 때 호출됩니다.

  • ws: 새로운 웹소켓 연결
virtual void onWebSocketClose(IWebSocket& ws)

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

  • ws: 닫힌 웹소켓 연결

일반적인 방법

const char* getPagePath() const

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

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

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

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

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

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

유틸리티 메서드

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

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

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

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

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

모든 연결된 WebSocket 클라이언트에 메시지를 브로드캐스트합니다.

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

청크 전송 인코딩을 사용하여 큰 HTML 콘텐츠를 전송합니다.

  • client: 웹 클라이언트 인터페이스
  • 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)

웹 제어를 위한 핀 활성화

  • : 핀 번호 (0-13)
  • 모드: 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)

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

DIYablesWebSliderPage

아날로그 및 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 웹 조이스틱 페이지

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

생성자

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)

이동 감도 설정(백분율)

DIYablesWebPlotterPage

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

생성자

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()

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

DIYables 찾을 수 없는 페이지

더 나은 사용자 경험을 위한 선택적 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://[arduino-ip]/
  • 목적: 중앙 탐색 허브
  • 특징: 활성화된 모든 애플리케이션에 대한 링크, 연결 상태

웹챗 애플리케이션

  • URL: http://[arduino-ip]/webchat
  • Purpose: 양방향 통신 인터페이스
  • Features: 실시간 메시징, 메시지 기록, WebSocket 상태

웹 모니터링

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

웹 디지털 핀 제어

  • URL: http://[arduino-ip]/webdigitalpins
  • 목적: 디지털 핀 0-13 제어
  • 특징: 개별 핀 제어, 일괄 제어, 실시간 상태

웹 슬라이더 컨트롤

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

웹 조이스틱 제어

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

웹 플로터

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

웹소켓 통신

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

  • 웹소켓 URL: ws://[arduino-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 램
  • 웹소켓 버퍼: 연결당 ~1KB 램

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

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

브라우저 간 호환성

지원되는 브라우저:

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

보안 주의사항

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

문제 해결

일반적인 문제

  1. 와이파이에 연결할 수 없습니다
  • SSID와 비밀번호를 확인하세요
  • 네트워크가 2.4GHz인지 확인하세요(5GHz가 아닌지)
  • 신호 강도 확인
  1. WebSocket 연결에 실패합니다
  • IP 주소가 올바른지 확인하십시오
  • 방화벽 설정 확인
  • 다른 브라우저를 사용해 보세요.
  1. 높은 메모리 사용량
  • 사용하지 않는 애플리케이션을 비활성화
  • 동시 연결 제한
  • 메모리 단편화가 발생하면 Arduino를 재시작합니다.
  1. 느린 응답
  • 와이파이 신호 강도 확인
  • WebSocket 메시지 빈도 줄이기
  • 더 짧은 콜백 함수를 사용하세요

예제 프로젝트

예제 응용 프로그램

DIYables WebApps 라이브러리에는 Arduino Uno R4 WiFi 및 DIYables STEM V4 IoT 교육 플랫폼을 위해 설계된 포괄적인 예제들이 포함되어 있습니다:

이용 가능한 예제

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

하드웨어 호환성

  • 권장: DIYables STEM V4 IoT (향상된 기능, 내장 센서)
  • 호환 가능: Arduino Uno R4 WiFi

튜토리얼 자료

전체 단계별 튜토리얼은 아래에서 확인하실 수 있습니다:

  • Newbiely.com/tutorials/arduino/arduino-uno-r4-wifi-web-apps
  • DIYables STEM V4 IoT용 특화 가이드 및 센서 통합 예제

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

플랫폼 추상화 인터페이스

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

IWebSocketServer

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

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

네트워크 제공자

네트워크 연결 관리 인터페이스

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

서버 팩토리 인터페이스

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

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

플랫폼 구현 예시

Arduino Uno R4 WiFi의 인터페이스는 UnoR4WiFi_WebServer 라이브러리를 사용하여 구현됩니다:

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

새 플랫폼 지원 추가

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

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

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

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

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

  • 플랫폼 독립성: 핵심 웹앱 로직은 모든 플랫폼에서 작동합니다
  • 확장성: 새로운 하드웨어 지원을 쉽게 추가할 수 있습니다
  • 유지보수성: 플랫폼별 코드는 분리되어 있습니다
  • 테스트 용이성: 단위 테스트를 위해 인터페이스를 모킹할 수 있습니다
  • 일관성: 모든 지원 플랫폼에서 동일한 API를 사용합니다

현재 플랫폼 지원

  • Arduino Uno R4 WiFi: 완전히 구현되어 테스트되었습니다
  • 🔄 ESP32: 별도의 확장으로 제공됩니다 - DIYables_WebApps_ESP32
  • 🚀 Future Platforms: 동일한 인터페이스 패턴을 사용하여 추가할 수 있습니다