硬件
採用 Rust 韌體嘅開源 ESP8266 機械臂
開源韌體運行喺五伺服馬達 ESP8266 機械臂,並提供模擬器使用嘅關節模型。模擬器唔依賴機械臂嘅串口、藍牙或者網絡,所以學校唔買實體設備都可以教完整課程。
設計
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.
工作區
Crate 架構
- hcr-gateway
- 應用程式主體,負責啟動策略、路由,以及由 Arduino 呼叫一次嘅單一 C 入口。
- hcr-http
- 無標準函式庫嘅 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 佇列決定,唔會依賴發送端時鐘。
次要版本只會增量擴充
協定可以新增自選欄位、訊息類型同主題。接收端遇到認唔到嘅內容,會記錄再丟棄,唔會因此失敗。