하드웨어
Rust 펌웨어를 사용하는 오픈 소스 ESP8266 로봇 팔
오픈 소스 펌웨어는 서보 모터 다섯 개를 갖춘 ESP8266 로봇 팔에서 동작하며 시뮬레이터의 관절 모형을 제공합니다. 시뮬레이터는 실물 장비와의 직렬, Bluetooth, 네트워크 연결이 필요 없습니다.
설계
정책은 Rust가, 하드웨어 기능은 C++가 담당
의존성은 한 방향으로만 흐릅니다. 외부 하드웨어 함수를 선언하는 crate는 하나뿐이며 경계에서는 Arduino 문자열, C++ 객체, 라우트, JSON, 애플리케이션 상태가 아닌 바이트만 전달합니다.
Rust 담당
- 시작 정책 및 협력형 실행기
- Hotaru 라우팅 및 프로토콜
- HTTP 파싱 및 응답
- 서보 검증 및 상태
C++ 담당
Arduino 또는 ESP8266 심벌이 필요한 작업만:
- 클록, 인터럽트 마스킹, 워치독, 재시작, 힙, 난수, 직렬 통신
- Wi-Fi 액세스 포인트 및 스테이션 모드, 저수준 TCP·UDP 핸들
- 캡티브 DNS 및 SPIFFS 핸들
- GPIO, PWM, 서보 펄스 쓰기, 저수준 OTA 쓰기
Native WiFiClient, File, and Servo 객체는 C++ 쪽에서 정수 핸들 뒤에 유지됩니다. 임베디드 Arduino 펌웨어에는 일반적인 Rust fn main(), 가 없으므로 게이트웨이는 반환하지 않는 C 진입점 하나만 내보내며 이를 setup() calls once.
작업 공간
크레이트 구성
- hcr-gateway
- 애플리케이션 본체입니다. 시작 정책, 라우팅, Arduino가 한 번 호출하는 단일 C 진입점을 담당합니다.
- hcr-http
- no_std 환경의 HTTP 파싱 및 응답과 Hotaru 프로토콜.
- hcr-io-esp8266
- 플랫폼 TCP를 통한 Hotaru 전송.
- hcr-rt-esp8266
- 런타임, 시간 및 임계 구역.
- hcr-platform
- 워크스페이스 전체에서 공유하는 플랫폼 트레이트와 값.
- ffi/hcr-ffi
- 외부 하드웨어 함수를 선언하는 유일한 crate이며 그 위에 안전한 어댑터를 제공합니다.
프로토콜
현재 기기 API와 hcr.v1 서비스 계약
Rust 서비스는 추가 확장형 hcr.v1 봉투와 JSON·CBOR 바인딩을 사용합니다. 현재 ESP8266 Rust 게이트웨이는 제한된 HTTP/JSON 서보 API를 제공하며 MQTT는 아직 구현되지 않았습니다.
| 클라이언트 | 전송 방식 | 인코딩 |
|---|---|---|
| 브라우저 앱(현재) | HTTPS request–response | JSON |
| Rust 서비스 계약 | hcr.v1 HTTP 바인딩 | JSON 및 CBOR |
| ESP8266 Rust 게이트웨이(현재) | 기기 액세스 포인트의 HTTP | JSON |
| MQTT 기기 경로(계획) | MQTT over TCP/TLS | CBOR |
봉투 내부의 상관관계
연결 정보는 MQTT 5 속성에 넣지 않습니다. 기기가 3.1.1을 협상할 수 있고 HTTP 바인딩에는 이런 속성이 없기 때문입니다. 일부에서만 작동하는 두 방식보다 어디서나 작동하는 한 방식이 더 안정적입니다.
타임스탬프는 순서를 정하지 않습니다
기기 시계는 신뢰할 수 없고 ESP8266은 라우터가 켜져 있을 때만 NTP에 연결됩니다. 순서는 송신 측 시계가 아닌 토픽별 FIFO로 정합니다.
마이너 버전은 기능 추가만 허용
선택 필드, 종류, 토픽을 새로 추가할 수 있습니다. 수신 측은 모르는 내용을 만나면 기록하고 버리며 전체 처리를 실패시키지 않습니다.