ハードウェア
Rustファームウェア搭載のオープンソースESP8266ロボットアーム
オープンソースのファームウェアは5サーボのESP8266アームで動作し、シミュレーターと同じ関節モデルを提供します。シミュレーターは実機とのシリアル、Bluetooth、ネットワーク接続を必要としません。
設計
方針はRust、C++はハードウェアライブラリ
依存関係は一方向です。外部ハードウェア関数を宣言するのは1つの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エントリーを1つだけ公開し、それを setup() calls once.
ワークスペース
クレート構成
- hcr-gateway
- アプリケーション本体。起動方針、ルーティング、およびArduinoが一度だけ呼び出す単一のCエントリーポイントを担当します。
- hcr-http
- no_std環境のHTTP解析と応答、およびHotaruプロトコル。
- hcr-io-esp8266
- プラットフォームのTCP上で動作するHotaruトランスポート。
- hcr-rt-esp8266
- ランタイム、時刻、クリティカルセクション。
- hcr-platform
- ワークスペース全体で共有するプラットフォームtraitと値。
- 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バインディングにはプロパティ自体がないためです。部分的な方式を2つ持つより、どこでも動く1つの方式の方が確実です。
タイムスタンプは順序を決めない
端末時計は信頼できず、ESP8266がNTPへ接続できるのはルーター稼働時だけです。順序は送信側の時計ではなく、トピックごとのFIFOで決まります。
マイナーバージョンは追加のみ
任意フィールド、種類、トピックを追加できます。受信側は未知の内容を記録して破棄し、処理全体を失敗させません。