E2E 테스트 결과 — 하드웨어 검증 세션¶
Xylolabs API — 엔드투엔드 하드웨어 테스트 결과 테스트 일자: 2026-03-27
XAP and XMBP are patent-pending technologies of Xylolabs Inc.
테스트 환경¶
| 항목 | 내용 |
|---|---|
| 호스트 머신 | Mac mini (Apple Silicon), macOS |
| 서버 | xylolabs-server (Rust/axum), release 빌드, 0.0.0.0:3000 |
| 데이터베이스 | PostgreSQL 17 (Docker, tmpfs) |
| 오브젝트 스토리지 | MinIO (Docker, tmpfs) |
| 네트워크 | WiFi Wireless_2.4G (WPA2), 동일 라우터 브리지 |
| 펌웨어 | MicroPython v1.27.0 (전 디바이스 공통) |
테스트 대상 디바이스¶
| # | 디바이스 | MCU | 아키텍처 | 클럭 | RAM | WiFi | MAC |
|---|---|---|---|---|---|---|---|
| 1 | Raspberry Pi Pico 2 W | RP2350 A2 | Cortex-M33 | 150 MHz | 446 KB | CYW43439 | 2c:cf:67:bc:ca:b2 |
| 2 | M5StampS3A | ESP32-S3 v0.2 | Xtensa LX7 | 160 MHz | 222 KB | Native | 30:ed:a0:c9:4b:ec |
| 3 | Seeed XIAO ESP32S3 | ESP32-S3 v0.2 | Xtensa LX7 | 160 MHz | 222 KB | Native | 1c:db:d4:75:92:70 |
WiFi 연결 테스트¶
네트워크 스캔¶
세 디바이스 모두 테스트 시작 시 액티브 스캔을 수행하였으며, 수신 범위 내에서 7~13개의 네트워크가 탐지되었다.
SSID 호환성¶
| SSID | Pico 2 W | M5StampS3A | Seeed XIAO |
|---|---|---|---|
| "Legacy" | BADAUTH (-3) |
Silent fail | Silent fail |
Wireless_2.4G |
연결 성공 | 연결 성공 | 연결 성공 |
"Legacy" SSID는 WPA2/WPA3 전환 모드로 운영되며, CYW43439 드라이버 및 ESP32-S3 MicroPython 네트워크 스택과 호환되지 않는다. 두 경우 모두 에러 또는 묵시적 실패가 발생하였다. 순수 WPA2 방식의 Wireless_2.4G SSID는 세 디바이스 모두에서 연결에 성공하였다.
연결 결과¶
| 디바이스 | 연결 시간 | RSSI | IP 주소 |
|---|---|---|---|
| Pico 2 W | 9 s | -20 dBm | 172.30.86.26 |
| M5StampS3A | 3 s | -34 dBm | 172.30.86.25 |
| Seeed XIAO ESP32S3 | 6 s | -65 dBm | 172.30.86.27 |
WiFi E2E 파이프라인¶
각 디바이스는 다음 순서로 전체 파이프라인을 실행하였다.
- WiFi 연결
GET /api/health→ HTTP 200POST /api/auth/login→ JWT 토큰 발급POST /api/auth/api-keys→ API 키 생성POST /api/sessions→ HTTP 201- XMBP 배치 10회 전송
POST /api/sessions/{id}/close→ HTTP 200
| 디바이스 | 배치 전송 | 세션 종료 |
|---|---|---|
| Pico 2 W | 10/10 OK | 200 OK |
| M5StampS3A | 10/10 OK | ETIMEDOUT (데이터 플러시 정상) |
| Seeed XIAO ESP32S3 | 10/10 OK | 200 OK |
M5StampS3A의 세션 종료 타임아웃은 마지막 요청에서 발생한 클라이언트 측 TCP 타임아웃이다. 서버 측 로그에서 소켓 리셋 이전에 세션이 정상적으로 플러시 및 종료되었음을 확인하였다.
프로파일링 결과¶
메모리¶
| 항목 | Pico 2 W | M5StampS3A | Seeed XIAO ESP32S3 |
|---|---|---|---|
| 전체 RAM | 446 KB | 222 KB | 222 KB |
| 유휴 시 여유 | 431 KB (97%) | 209 KB (94%) | 209 KB (94%) |
| MicroPython 오버헤드 | 15 KB | 13 KB | 13 KB |
| 최대 단일 할당 | 256 KB | 128 KB | 128 KB |
| 테스트 후 여유 | 430 KB | 163 KB | 163 KB |
| 메모리 누수 | 없음 | 없음 | 없음 |
Pico 2 W는 ESP32-S3 디바이스 대비 약 두 배의 가용 힙을 보유한다. ESP32-S3의 테스트 후 여유 메모리(163 KB, 유휴 시 209 KB)는 세션 중 누적된 MicroPython 런타임 상태를 반영하는 것으로 누수가 아니며, 런타임 발자국은 첫 몇 번의 전송 사이클 이후 안정화된다.
CPU 벤치마크 (MicroPython)¶
| 연산 | Pico 2 W | M5StampS3A | Seeed XIAO ESP32S3 |
|---|---|---|---|
| 정수 10K ops (us) | 42,376 | 62,030 | 62,067 |
| 정수 ops/s | 235,983 | 161,212 | 161,116 |
| 부동소수점 10K ops (us) | 125,983 | 140,916 | 140,904 |
| 부동소수점 ops/s | 79,376 | 70,964 | 70,970 |
| Struct pack 1K (us) | 35,010 | 25,548 | 25,553 |
| Struct pack/s | 28,563 | 39,142 | 39,134 |
Pico 2 W (Cortex-M33)는 정수 및 부동소수점 처리량에서 우위를 보인다. ESP32-S3 (Xtensa LX7)는 XMBP 배치 인코딩에 유리한 struct.pack 처리량에서 앞선다.
네트워크 지연시간 (HTTP GET /api/health, 5회 측정)¶
| 항목 | Pico 2 W | M5StampS3A | Seeed XIAO ESP32S3 |
|---|---|---|---|
| 평균 (us) | 15,226 | 38,091 | 51,693 |
| 최소 (us) | 8,903 | 33,383 | 45,153 |
| 최대 (us) | 22,146 | 44,074 | 60,957 |
Pico 2 W는 강한 RSSI(-20 dBm)에 힘입어 가장 낮은 지연시간을 기록하였다. Seeed XIAO의 안테나 배치(-65 dBm)로 인해 M5StampS3A 대비 평균 약 13 ms의 오버헤드가 추가되었다.
XMBP 처리량 (20 배치, 4 스트림 × 10 샘플/배치)¶
| 항목 | Pico 2 W | M5StampS3A | Seeed XIAO ESP32S3 |
|---|---|---|---|
| 인코딩 평균 (us) | 3,315 | 3,160 | 3,242 |
| 인코딩 최대 (us) | 3,410 | 3,498 | 3,396 |
| 전송 평균 (us) | 14,577 | 38,114 | 42,311 |
| 전송 최소 (us) | 8,307 | 30,563 | 32,251 |
| 전송 최대 (us) | 28,560 | 56,503 | 56,873 |
| 총 평균 (us) | 17,893 | 41,275 | 45,554 |
| 배치당 바이트 | 514 | 514 | 514 |
| 배치/s | 55.9 | 24.2 | 22.0 |
| 샘플/s | 2,236 | 969 | 878 |
인코딩 시간은 세 디바이스 모두 유사하다(3.2~3.3 ms). 지배적 비용은 네트워크 전송 시간이며, 이는 RSSI 및 TCP 왕복 지연시간과 직접 상관관계를 보인다.
복원력 테스트¶
9개 테스트 케이스를 3개 디바이스 전체에서 실행하였다.
| TC | 설명 | Pico 2 W | M5StampS3A | Seeed XIAO |
|---|---|---|---|---|
| TC1 | 50 배치 연속 전송 | PASS (42.1/s) | PASS (17.6/s) | PASS (18.9/s) |
| TC2 | 대형 배치 4.8 KB | PASS (245 ms) | PASS (462 ms) | PASS (542 ms) |
| TC3 | 다수 스트림 동시 처리 | PASS | PASS | PASS |
| TC4 | WiFi 연결 끊김/재연결 | PASS (3 s) | PASS (2 s) | PASS (2 s) |
| TC5 | 3개 동시 세션 | PASS (30/30) | PASS (30/30) | PASS (30/30) |
| TC6 | 손상된 XMBP | PASS (400/400/400/200) | PASS | PASS |
| TC7 | 인증 엣지 케이스 | PASS (401/401/201) | PASS | PASS |
| TC8 | 시퀀스 갭 | 6/7 | 6/7 | 6/7 |
| TC9 | 30 s 지속 10 Hz | PASS (300/300) | PASS (300/300) | PASS (300/300) |
| 점수 | 8/9 | 8/9 | 8/9 |
TC8(시퀀스 갭): 하나의 갭 변형이 서버에서 예상대로 처리되지 않았으며, 이는 디바이스 동작과 무관한 서버 측 기지 이슈이다. 세 디바이스 모두 동일한 결과를 보였다.
번인 결과¶
번인 테스트는 호스트 측 SDK 시뮬레이션(Rust)으로 실행하였다. 모든 시나리오에서 실패 배치 및 재연결이 0건으로 완료되었다.
시나리오 요약¶
| 시나리오 | 시간 | 오디오 | 센서 | 디바이스 수 | 오디오 배치 | 메타 배치 | 실패 | 재연결 | 헤드룸 |
|---|---|---|---|---|---|---|---|---|---|
| Standard | 60 s | 4ch @ 16kHz | 4 @ 100 Hz | 1 | 118 | 59 | 0 | 0 | 99.5% |
| Stress | 120 s | 4ch @ 96kHz | 26 @ 100 Hz | 1 | 239 | 119 | 0 | 0 | 99.1% |
| Endurance | 120 s | 2ch @ 16kHz | 4 @ 10 Hz | 1 | 237 | 119 | 0 | 0 | 99.6% |
| Multi-device | 60 s | 4ch @ 16kHz | 4 @ 100 Hz | 10 | 118 each | 59 each | 0 | 0 | 99.6–99.7% |
시나리오별 인코딩 및 틱 성능¶
| 시나리오 | 인코딩 평균 (us) | 틱 평균 (us) | 틱 최대 (us) |
|---|---|---|---|
| Standard | 10 | 41 | 19,845 |
| Stress | 6 | 9 | 213,690 |
| Endurance | 5 | 36 | 15,398 |
| Multi-device | 7–8 (디바이스별) | 22–35 (디바이스별) | — |
Stress 시나리오의 틱 최대값(213,690 us)은 96kHz / 26센서 부하 하에서 발생한 OS 스케줄링 선점 현상을 반영하며, SDK 링 버퍼의 데드라인 미스를 의미하지 않는다.
서버 측 검증¶
테스트 실행 후 서버 로그 및 데이터베이스 상태를 대조하여 모든 세션을 검증하였다.
| 항목 | 결과 |
|---|---|
| 등록된 디바이스 | 전 세션 합산 10개 이상 |
| 메타데이터 스트림 | 13개 이상의 세션에 걸쳐 74개 이상 |
| S3 스토리지 | Zstd 압축 청크 플러시 확인, 청크당 125–752 바이트 |
| 세션 라이프사이클 | create → stream → flush → close 서버 로그 확인 |
| 서버 에러 | 0건 |
RISC-V (Hazard3) 보조 테스트¶
Pico 2 W (RP2350)는 Hazard3 RISC-V 프로세서를 구현한 두 번째 코어를 탑재한다. Pico SDK C 벤치마크를 rp2350-riscv 타겟으로 컴파일하여 picotool로 플래시하였다.
| 항목 | 결과 |
|---|---|
| 타겟 | rp2350-riscv |
| 플래시 방법 | picotool, family rp2350-riscv |
| USB CDC 시리얼 | 수신 불가 |
| 원인 | TinyUSB / Hazard3 초기화 기지 제한 |
| 코어 사양 | RV32IMAC, FPU 없음, 150 MHz |
| 적합 용도 | 센서 전용 워크로드, ADPCM 인코딩 |
USB CDC 출력은 어떤 시도에서도 수신되지 않았다. 이는 Hazard3 코어의 TinyUSB 스택 기지 제한이며, 바이너리 플래시 및 디바이스 열거는 정상적으로 완료되었으나 시리얼 출력이 생성되지 않았다. 이 결과는 Cortex-M33 주 코어 테스트 결과에 영향을 미치지 않는다.
기지 이슈¶
| # | 이슈 | 영향 범위 | 심각도 |
|---|---|---|---|
| 1 | WPA2/WPA3 전환 SSID가 CYW43 및 ESP32 MicroPython과 호환되지 않음 | 전 디바이스 | 중간 — 순수 WPA2 SSID 사용 권장 |
| 2 | Hazard3에서 USB CDC 차단 (TinyUSB 초기화 이슈) | Pico 2 W RISC-V 코어 한정 | 낮음 — 주 코어에 영향 없음 |
| 3 | 안테나 배치에 따른 ESP32-S3 처리량 10–20% 저하 (-34 vs -65 dBm) | Seeed XIAO ESP32S3 | 낮음 — 물리적 배치 의존적 |
| 4 | 임베디드 Rust 펌웨어 예제의 의존성 버전 충돌 (embassy-rp, esp-hal) |
펌웨어 예제 | 낮음 — 개발 편의성에만 영향 |