Архитектура экосистемы
Четыре слоя — разработка, сборка, симуляция и приложение — образуют конвейер от исходного кода прошивки до виртуального устройства. Схема отражает реальные связи, обнаруженные в репозиториях.
Слои системы
Слой разработки — Embedded SDK и Device Blink
Device Blink — прикладной проект прошивки. Код не содержит жёсткой привязки к выводам: периферия (LED, UART) задаётся на этапе сборки через compile-time defines, которые берутся из конфигурации платы.
Embedded SDK — общая инфраструктура: CMake-тулчейны, CMSIS-заголовки, startup и linker-скрипты, драйверы STM32 LL, YAML-конфигурации устройств и плат, а также клиент удалённой сборки (submodule build-system).
Проект подключает SDK как git submodule; конфигурации плат из SDK преобразуются CMake-хелпером board_defines.cmake в defines компилятора.
Слой сборки — Embedded Build System
Клиент remote_build.py упаковывает исходники и передаёт параметры сборки на WebSocket-сервер. Сервер проверяет JWT-токен, запускает контейнер embedded-sdk-builder, где выполняется CMake-сборка с выбранным тулчейном.
Результат — два типа артефактов: кросс-сборка (.elf, .bin, .hex для прошивки MCU) и host-сборка (исполняемый файл для запуска прошивки на хост-машине — узла симуляции). К артефактам прилагаются info.txt с контрольными суммами и compile_commands.json.
Слой симуляции — Simulation Coordinator
Координатор запускает host-версии прошивок как процессы-узлы, принимает их регистрацию по TCP :9000 и моделирует среду:
- радиоэфир — битрейт, мощность, чувствительность, RSSI по дистанции, коллизии, radio-профили;
- шины — байтовые пакеты, объединение сигналов и коллизии;
- питание — группы питания, отключение/включение устройств;
- UART — мосты между виртуальными устройствами и внешними TCP-клиентами (:9002).
События (GPIO, логи, радио- и шинный трафик) транслируются подключённым клиентам через WebSocket :9001.
Слой приложения — Simulation Application
Flutter-приложение подключается к координатору по WebSocket, аутентифицируется по OAuth2 через Authentik и предоставляет интерфейс управления: симуляции, узлы, шины, радио-топология, UART-монитор, логи, группы питания, администрирование.
Команды отправляются по тому же каналу, что и события — это обеспечивает синхронизацию состояния в реальном времени.
Внешние сервисы — Authentik
Authentik — внешний сервис аутентификации. Flutter-приложение выполняет вход через OAuth2/OpenID Connect; координатор проверяет JWT-токены локально (HS256, общий секрет), а WebSocket-сервер сборки — через отдельный сервис проверки токенов.
Authentik не входит в состав репозиториев экосистемы и показан на схеме как внешний компонент.
Потоки данных
Поток сборки
Device Blink (исходники + конфигурации плат) → клиент remote_build.py → WebSocket-сервер → Docker-контейнер → артефакты: прошивка MCU (.elf/.bin/.hex) и host-бинарь для симуляции.
Поток симуляции
Host-сборка прошивки предназначена для запуска Coordinator'ом как процесс-узел с параметрами --node-id, --coordinator-host, --coordinator-port; узел регистрируется по TCP :9000, события радиоэфира, шин, GPIO и логи транслируются в UI по WebSocket :9001. Слой mock-HAL для host-сборки формируется в составе SDK.
Поток UART
Внешний TCP-клиент подключается к порту :9002, Coordinator создаёт UART-мост к указанному узлу: байты из TCP передаются в виртуальный UART прошивки и обратно.
Поток аутентификации
Simulation Application выполняет вход через OAuth2 (Authentik) и получает JWT. Coordinator проверяет токен локально (HS256); WebSocket-сервер сборки проверяет токен через сервис авторизации.
Диаграмма отражает связи, зафиксированные в коде и документации репозиториев. Отдельные элементы находятся в стадии разработки: слой mock-HAL для host-сборки и каталоги simulator/, tests/ в проекте Device Blink пока не заполнены.