Оборудование
Манипулятор ESP8266 с открытым исходным кодом и прошивкой Rust
Открытая прошивка работает на манипуляторе ESP8266 с пятью сервоприводами и задаёт модель суставов симулятора. Сам симулятор не зависит от последовательного порта, Bluetooth или сети физического робота.
Архитектура
Политика принадлежит Rust; C++ служит аппаратной библиотекой
Зависимость направлена только в одну сторону. Импортированные аппаратные функции объявляет один crate, а через границу передаются байты, но не строки Arduino, объекты C++, маршруты, JSON или состояние приложения.
За что отвечает Rust
- Политика запуска и кооперативный исполнитель
- Маршрутизация и протокол Hotaru
- Разбор HTTP и ответы
- Проверка и состояние сервоприводов
C++ отвечает за
Только операции, которым нужны символы Arduino или ESP8266:
- Тактовые часы, маскирование прерываний, сторожевой таймер, перезапуск, куча, случайные числа, последовательный порт
- Режимы точки доступа и станции Wi-Fi, низкоуровневые дескрипторы TCP и UDP
- Дескрипторы captive DNS и SPIFFS
- GPIO, PWM, запись импульсов сервопривода, низкоуровневая запись OTA
Native WiFiClient, File, and Servo Объекты остаются за целочисленными дескрипторами на стороне C++. Во встроенной прошивке Arduino нет обычной функции Rust fn main(), , поэтому шлюз экспортирует единственную невозвращающую точку входа C, которую setup() calls once.
Рабочая область
Крейты
- hcr-gateway
- Приложение: политика запуска, маршрутизация и единственная точка входа C, которую Arduino вызывает один раз.
- hcr-http
- Разбор HTTP и ответы в no_std, а также протокол Hotaru.
- hcr-io-esp8266
- Передача Hotaru поверх TCP платформы.
- hcr-rt-esp8266
- Среда выполнения, время и критические секции.
- hcr-platform
- Платформенные трейты и значения, общие для всей рабочей области.
- ffi/hcr-ffi
- Единственный crate, объявляющий импортированные аппаратные функции и предоставляющий безопасные адаптеры над ними.
Протокол
Текущий API устройства и контракт сервиса hcr.v1
Сервис Rust использует расширяемый конверт hcr.v1 с JSON и CBOR. Текущий шлюз ESP8266 предоставляет ограниченный HTTP/JSON API сервоприводов; MQTT пока не реализован.
| Клиент | Транспорт | Кодирование |
|---|---|---|
| Браузерное приложение (сейчас) | HTTPS request–response | JSON |
| Контракт сервиса Rust | HTTP-привязка hcr.v1 | JSON и CBOR |
| Шлюз ESP8266 на Rust (сейчас) | HTTP в точке доступа устройства | JSON |
| MQTT-путь устройства (планируется) | MQTT over TCP/TLS | CBOR |
Корреляция внутри конверта
Связь сообщений не хранится в свойствах MQTT 5. Устройства могут согласовать версию 3.1.1, а в HTTP-привязке свойств нет. Один универсальный механизм надёжнее двух частичных.
Метки времени не задают порядок
Часы устройств ненадёжны; ESP8266 получает доступ к NTP только при работающем маршрутизаторе. Порядок задаётся FIFO каждого топика, а не часами отправителя.
Минорные версии только расширяют протокол
Можно добавлять необязательные поля, виды сообщений и топики. Получатель записывает и отбрасывает незнакомое содержимое, а не завершает работу с ошибкой.