硬件
采用 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 队列确定,绝不依赖发送方时钟。
次要版本只做增量扩展
协议可以新增可选字段、消息类型和主题。接收方遇到无法识别的内容时,会记录并丢弃,而不会因此失败。