跳到主要内容

硬件

采用 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 队列确定,绝不依赖发送方时钟。

次要版本只做增量扩展

协议可以新增可选字段、消息类型和主题。接收方遇到无法识别的内容时,会记录并丢弃,而不会因此失败。