Skip to content

RPi Pico 2 예제 코드

참고: 이 문서는 레거시 C 참조 예제이다. 신규 개발에는 Rust SDK 예제Rust SDK를 사용한다.

RPi Pico 2(RP2350)에서 Xylolabs API를 사용하기 위한 C 예제 코드이다.

파일 구조

File Description
xmbp.h XMBP 프로토콜 인코딩 헤더 (재사용 가능)
continuous_stream.c 연속 센서 스트리밍 예제
periodic_sampling.c 주기적 샘플링 예제 (5분마다 10초)
audio_upload.c 오디오 스트리밍 업로드 예제 (I2S + chunked HTTP)

설계 원칙

Zero-Copy

모든 예제는 정적 버퍼에 직접 XMBP 패킷을 구성한다. 중간 버퍼 복사가 없다.

Sensor -> Static buffer (XMBP encoding) -> HTTP/WebSocket transmission
             ^ No intermediate copies

정적 메모리

malloc/free를 사용하지 않는다. 모든 버퍼 크기는 컴파일 시점에 결정된다. RPi Pico 2는 약 520KB의 SRAM을 가지고 있으며, 예제 코드는 16~50KB의 메모리를 사용한다.

LTE-M1 최적화

  • LTE-M1 대역폭(~47KB/s)에 맞춘 배치 크기
  • 지수 백오프 재전송
  • PSM (Power Save Mode) 활용
  • 연결 실패 시 로컬 저장소 폴백

레거시 C 빌드

이 예제들은 Pico SDK를 사용한다. LTE-M1 모뎀 제어 코드는 사용하는 모뎀 모듈에 맞춰 구현해야 한다.

# Add to CMakeLists.txt
add_executable(continuous_stream continuous_stream.c)
target_link_libraries(continuous_stream pico_stdlib hardware_adc)

add_executable(periodic_sampling periodic_sampling.c)
target_link_libraries(periodic_sampling pico_stdlib hardware_adc)

add_executable(audio_upload audio_upload.c)
target_link_libraries(audio_upload pico_stdlib hardware_i2s hardware_dma)

LTE-M1 모뎀 레퍼런스

http_post_binary()ws_send() 같은 네트워크 함수는 예제에서 스텁으로 제공된다. 실제 구현은 사용하는 LTE-M1 모뎀에 따라 달라집니다.

주요 LTE-M1 모뎀

Modem Interface AT Command Set
Quectel BG770A/BG95 UART AT 3GPP + Quectel extensions
u-blox SARA-R4/R5 UART AT 3GPP + u-blox extensions
Nordic nRF9160 SPI/UART AT or native SDK
Sierra Wireless HL7812 UART AT 3GPP + Sierra extensions

API 키 검증 (Ping)

세션을 시작하기 전에 /api/v1/ping으로 GET 요청을 보내 API 키가 유효한지 확인한다:

// API 키 검증 -- 성공 시 {"pong":true,...}, 실패 시 401 반환
at_send("AT+QHTTPCFG=\"contextid\",1");
at_send("AT+QHTTPCFG=\"custom_header\",\"X-Api-Key: xk_a1b2...\"");
at_send("AT+QHTTPURL=46,80");
at_send_raw("https://api.xylolabs.com/api/v1/ping", 46);
at_send("AT+QHTTPGET=60");  // 60초 타임아웃
// 응답 확인: 200 = 키 유효, 401 = 키 무효

AT 명령 기반 HTTP POST 예제 (Quectel BG770A)

// 1. HTTP configuration
at_send("AT+QHTTPCFG=\"contextid\",1");
at_send("AT+QHTTPCFG=\"custom_header\",\"X-Api-Key: xk_a1b2...\"");
at_send("AT+QHTTPCFG=\"custom_header\",\"Content-Type: application/octet-stream\"");

// 2. Set URL
char cmd[256];
snprintf(cmd, sizeof(cmd), "AT+QHTTPURL=%d,80", strlen(url));
at_send(cmd);
at_send_raw(url, strlen(url));

// 3. POST transmission (send xmbp_buf directly -- zero-copy)
snprintf(cmd, sizeof(cmd), "AT+QHTTPPOST=%d,80,80", packet_len);
at_send(cmd);
at_send_raw(xmbp_buf, packet_len);  // Direct transmission without buffer copy

API 문서 참고

  • API Reference -- XMBP 프로토콜, 수집 세션, 오디오 업로드, API 키 관리, 장치 관리