Протоколы и потоки данных

На странице описано, по каким протоколам участники обмениваются данными с ХАБом платформы и как движется каждый поток. 
 Сводная таблица каналов связи 
 
 
 
 № 
 Связь 
 Поток 
 Протокол 
 
 
 
 
 1 
 Робот ↔ ХАБ 
 Телеметрия, признаки 
 Socket (в текущей версии SDK — Socket.IO, namespace /robot ) 
 
 
 2 
 Робот ↔ ХАБ 
 Управление 
 Socket (Socket.IO, событие command ) 
 
 
 3 
 Робот → ХАБ 
 Видео 
 RTSP / WebRTC или «кадры» через Socket (в текущей версии — JPEG-кадры через Socket.IO) 
 
 
 4 
 Внутри ХАБа 
 Все потоки 
 Общая память — неблокирующий кэш (словарь) 
 
 
 5 
 ХАБ ↔ оператор 
 Контроль и обучение робота 
 WebSocket (данные и команды), WebRTC (видео) 
 
 
 6 
 ХАБ ↔ модели ИИ (вычислительная среда) 
 Телеметрия, управление, видео 
 Socket (телеметрия и управление), WebRTC / Socket (видео) 
 
 
 7 
 Модули сервера между собой 
 Служебные вызовы 
 REST API + gRPC 
 
 
 8 
 IoT-датчики → ХАБ 
 Показания датчиков 
 MQTT (publish/subscribe, QoS 1) — планируется 
 
 
 9 
 Администратор → сервер 
 Обслуживание 
 SSH 
 
 
 
 Протокол робота подробно описан в книге «ПО для робота» на странице Протокол обмена с сервером . 
 Поток 1. Видео 
 Камера устройства ──▶ RTSP-поток / JPEG-кадры ──▶ ARTEX HUB (транскодер) ──▶ WebRTC SFU ──▶ Браузер оператора
 │ └──▶ Модели ИИ
 └──▶ Запись в S3
 
 
 Робот передаёт видео либо потоком RTSP, либо отдельными кадрами (JPEG, качество 80) через Socket. 
 ХАБ хранит в кэше актуальный кадр (или набор из X последних кадров) и направляет его в вычислительную среду и оператору. 
 Для браузера видео преобразуется в WebRTC; SFU ретранслирует поток нескольким получателям без повторного кодирования. 
 Параллельно видео записывается в объектное хранилище S3. 
 
 Поток 2. Телеметрия 
 Датчики (GPS, IMU, V) ──▶ Socket, JSON ──▶ ARTEX HUB (парсинг + кэш) ──▶ WebSocket, JSON-поток ──▶ Web UI (дашборд)
 │ └──▶ Модели ИИ
 └──▶ Запись в Time Series DB
 
 
 Телеметрия передаётся в формате JSON, например: {"speed": 1.2, "gps": [55.65, 37.66], "battery": 11.8, "imu": {...}, "timestamp": 1790155251.12} . 
 Состав полей не фиксирован: робот может добавить новый датчик без изменения сервера и интерфейса. 
 ХАБ хранит актуальный вектор телеметрии с учётом времени создания и раздаёт его потребителям. 
 
 Поток 3. Команды 
 Web UI (джойстик, кнопки) ──┐
 ├──▶ WebSocket ──▶ ARTEX HUB (валидация, приоритет) ──▶ Socket ──▶ Привод устройства
Модель ИИ (автопилот) ──────┘
 
 
 Команда содержит автора ( author ) и полезную нагрузку вида {тип_команды: команда} . 
 ХАБ проверяет права автора на робота и применяет правило приоритета: команда оператора имеет приоритет над командой модели (режим «подстраховки»). 
 Команды Стоп и DISARM обрабатываются вне очереди. 
 
 Целевые показатели задержки 
 
 
 
 Параметр 
 Целевое значение 
 
 
 
 
 Камера → оператор 
 < 200 мс 
 
 
 Команда → привод 
 < 50 мс 
 
 
 Частота телеметрии 
 до 30 сообщений/с (JSON) 
 
 
 Частота отправки данных SDK по умолчанию 
 20 сообщений/с ( max_send_freq = 0.05 с) 
 
 
 
 Жизненный цикл подключения робота 
 
 Робот открывает соединение с сервером и передаёт паспорт устройства ( name , type , telem_can , video_can ). 
 Сервер присваивает подключению идентификатор (SID) и регистрирует робота в реестре устройств. 
 Сервер периодически отправляет heartbeat : запрашивает динамическое состояние ( d_meta ) и сигнал готовности ( Ready ). 
 Получив Ready , робот запускает циклы отправки телеметрии и видео. 
 Сервер пересылает роботу команды от операторов и моделей. 
 При обрыве связи SDK автоматически переподключается (до 5 попыток с задержкой 1–5 с); сервер помечает робота как отключённого и уведомляет интерфейс (порт robot.disconnected ). 
 
 Формат данных внутри ХАБа 
 ХАБ предоставляет операторам и моделям два базовых метода работы с общей памятью: 
 
 
 
 Метод 
 Назначение 
 
 
 
 
 push(key, value) 
 Записать новое значение (кадр, вектор телеметрии, команду) с отметкой времени. Не блокирует читателей. 
 
 
 get(key) 
 Получить последнее актуальное значение. Не ждёт появления нового значения. 
 
 
 
 Рекомендуемая схема именования ключей — <робот>.<поток>[.<канал>] , например robot_1.video.rgb , robot_1.telemetry , robot_1.command .