跳去主要內容

硬件

採用 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–responseJSON
Rust 服務契約hcr.v1 HTTP 綁定JSON 同 CBOR
ESP8266 Rust 閘道(目前)裝置接入點上嘅 HTTPJSON
MQTT 裝置路徑(規劃中)MQTT over TCP/TLSCBOR

喺信封入面關聯訊息

關聯資訊唔會放喺 MQTT 5 屬性。裝置可能協商用 3.1.1,而 HTTP 綁定根本冇呢類屬性。一套周圍都用到嘅機制,比兩套唔完整嘅機制更可靠。

時間戳唔用嚟排序

裝置時鐘並唔可靠;只有路由器在線時,ESP8266 先連到 NTP。訊息次序由每個主題嘅 FIFO 佇列決定,唔會依賴發送端時鐘。

次要版本只會增量擴充

協定可以新增自選欄位、訊息類型同主題。接收端遇到認唔到嘅內容,會記錄再丟棄,唔會因此失敗。