硬體
採用 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 佇列決定,絕不依賴傳送端時鐘。
次要版本只做增量擴充
協定可以新增選填欄位、訊息類型與主題。接收端遇到無法辨識的內容時,會記錄並捨棄,而不會因此失敗。