일회용 전자담배를 재활용해 웹 서버를 구축
기가 맥히네요. 😵💫🤣
한 개발자가 일회용 전자담배(disposable vape) 내부의 마이크로컨트롤러를 활용해 웹사이트를 호스팅하는 실험 진행.
제한된 리소스(플래시 24 KiB, RAM 3 KiB)를 극복하며 동작 가능한 HTTP 서버 구현 및 실제 페이지 로딩과 ping 응답 최적화 성공.

주요 내용 정리
배경 및 동기
버려진 일회용 전자담배를 해체하다 ARM Cortex-M0+ 기반 PUYA / PY32 칩 발견

단순히 배터리 회수에 그치지 않고 칩의 잠재 활용 가능성 탐색
하드웨어 사양
클럭 속도: 24 MHz
플래시: 24 KiB
SRAM: 3 KiB
주변 장치 거의 없음
통신 방식 – SLIP over Semihosting
USB-시리얼 장치를 모뎀처럼 활용해 SLIP(Serial Line IP) 통신 구성
Semihosting을 이용해 디버거/호스트 간 데이터 송수신 구현
네트워크 스택 & 웹 서버 구성
초소형 TCP/IP 스택 uIP 포팅
정적 파일 제공 및 요청 핸들링 최적화
정렬 문제 수정 및 버퍼 구조 개선
성능 개선 과정
초기: ping 응답 약 1.5초, 패킷 손실 다수, 페이지 로딩 20초 이상
개선: 링 버퍼 및 배치 쓰기 적용 → ping 응답 약 20ms, 페이지 로딩 약 160ms
메모리 사용 현황
플래시 사용량: 약 5 kB (전체의 20%)
RAM 사용량: 약 1.38 kB (전체의 44.9%)
기능 확장
요청 수 카운팅 API, 고유 ID 노출 API 등 간단한 동적 기능 추가
오픈소스 코드 공개
전체 소스코드 GitHub에 공개
한줄평
리소스가 극히 제한된 환경에서 “웹 서버가 동작할까?”라는 순수한 호기심으로 출발한 흥미로운 실험
Semihosting, SLIP, uIP 등 시스템 수준 기술을 엮어 최소 사양 MCU에서 네트워킹 구현 성공
상업적 활용은 어렵지만, 극한 환경에서의 임베디드 웹 서비스 가능성을 제시
메모리와 속도 제약이 뚜렷하지만 학습 및 취미 프로젝트로 가치 충분
MCU (Microcontroller Unit)
임베디드 시스템의 핵심 제어 칩.
CPU, 메모리, 입출력 장치를 하나의 칩에 통합한 형태로, 전자담배 내부 제어용으로 사용됨.
ARM Cortex-M0+
ARM사의 초저전력 32비트 마이크로컨트롤러 코어.
단순 제어용 MCU에 주로 쓰이며, 이번 프로젝트의 기반 아키텍처.
PUYA / PY32
중국 PUYA Semiconductor의 저가형 Cortex-M0+ MCU 시리즈.
플래시 용량 24 KiB, RAM 3 KiB 등 극도로 제한된 리소스 환경을 가진 칩.
플래시 메모리 (Flash Memory)
프로그램 코드나 정적 데이터 저장용 비휘발성 메모리.
이 프로젝트에서는 HTML 등 정적 웹 리소스 저장에 사용됨.
SRAM (Static RAM)
실행 중 변수와 버퍼 데이터를 저장하는 휘발성 메모리.
3 KiB밖에 없어 TCP/IP 스택 운영과 버퍼링이 매우 제한적.
uIP (micro IP stack)
소형 임베디드 시스템용 초경량 TCP/IP 네트워크 스택.
HTTP 서버, TCP 연결 관리 등을 수행하며, 전체 크기가 수 KiB 수준.
HTTP (HyperText Transfer Protocol)
웹 클라이언트와 서버 간 데이터 교환 표준 프로토콜.
MCU가 간단한 정적 페이지를 클라이언트(브라우저)에 제공하기 위해 사용.
SLIP (Serial Line Internet Protocol)
직렬 포트를 통해 IP 패킷을 전송하기 위한 프로토콜.
본 프로젝트에서는 USB-시리얼 경로를 통해 네트워크 패킷을 전달하는 데 사용됨.
Semihosting
MCU와 호스트(PC) 간에 표준 입출력 기능을 공유하는 디버깅 메커니즘.
MCU가 직접 네트워크 하드웨어를 갖고 있지 않으므로, 호스트의 자원을 간접적으로 이용.
GDB (GNU Debugger)
MCU 개발 시 코드 디버깅과 semihosting 통신 중계에 사용되는 툴.
MCU의 I/O 호출을 받아 PC 쪽 SLIP 가상 인터페이스로 전달하는 역할.
링 버퍼 (Ring Buffer / Circular Buffer)
일정 크기의 버퍼를 순환적으로 사용하는 자료구조.
송수신 데이터의 메모리 복사를 최소화하고 처리 속도를 높이는 데 사용됨.
배치 쓰기 (Batch Write)
데이터를 한 번에 여러 개 묶어 전송하거나 기록하는 방식.
시스템 호출 횟수를 줄이고 성능을 향상시키기 위한 최적화 기법.
정렬 문제 (Alignment)
메모리 주소가 CPU가 요구하는 단위 경계에 맞지 않을 때 발생하는 문제.
MCU 환경에서는 잘못된 정렬 시 속도 저하나 오류 발생 가능성이 있어 주의 필요.
Wear Leveling
플래시 메모리의 수명을 늘리기 위해 쓰기 횟수를 균등하게 분산하는 기술.
본 프로젝트에서는 아직 적용되지 않았지만, 장시간 사용 시 고려해야 할 요소.
Ping (ICMP Echo Request/Reply)
네트워크 연결 상태 및 응답 지연시간을 측정하는 기본 유틸리티.
MCU의 네트워크 스택 성능을 검증하는 테스트 도구로 활용됨.
API (Application Programming Interface)
시스템 기능을 외부에서 접근할 수 있도록 공개한 인터페이스.
프로젝트에서는 요청 수 카운팅과 MCU ID 확인 API를 간단히 구현.
REST (Representational State Transfer)
HTTP 기반의 경량 통신 아키텍처 스타일.
MCU에서 구현한 간단한 API들이 REST 원칙에 가깝게 설계됨.
