跳至主要內容

硬體

採用 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 佇列決定,絕不依賴傳送端時鐘。

次要版本只做增量擴充

協定可以新增選填欄位、訊息類型與主題。接收端遇到無法辨識的內容時,會記錄並捨棄,而不會因此失敗。