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 패킷을 구성한다. 중간 버퍼 복사가 없다.
정적 메모리¶
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 키 관리, 장치 관리