КОНЦЕПЦИЯ И РАЗРАБОТКАБЕСПИЛОТНЫЙ СПОРТ · #bezpiLOTa · KAIROS DRONE AGENTДокументация
#bezpiLOTa→Drone Agent→API & SDK
KairOS / DRONE AGENT / 03

REST‑контур для интеграции, сырой MAVLink WebSocket для real‑time данных, версионированные MQTT‑топики для удалённого relay и Python SDK для драйверов и расширений. Здесь зафиксированы целевые порты, endpoints, права и примеры собственного интерфейса KairOS.

PLANNED

API и SDK описаны как целевой контракт KairOS; стабильная версия и совместимость ещё не выпущены.

Репозиторий KairOS ↗
08основных REST endpoints
JSONответы REST
WSсырой MAVLink
KEYpermission auth
01
REST API / :8080

Восемь основных endpoints

Control surface слушает порт 8080 и возвращает JSON. Большинство запросов требуют заголовок X-KairOS-Key. Конкретный ключ имеет уровень разрешений, поэтому чтение телеметрии можно отделить от полётных команд, mission upload и административных операций.

МетодEndpointДанные или действие
GET/api/statusHealth, uptime, FC connection, роль, версия агента
GET/api/telemetryAttitude, GPS, battery, RC channels, flight mode
GET/api/paramsКэш параметров FC с фильтром по prefix
POST/api/commandsTakeoff, land, goto, RTL, arm, disarm
GET/api/configТекущая конфигурация агента как JSON
PUT/api/configИзменение ключей и hot reload затронутых сервисов
GET/api/servicesrunning, stopped или failed для управляемых сервисов
GET/api/logsСтруктурированные события с фильтрами service и level
bashТелеметрия через REST
curl -s http://<board-ip>:8080/api/telemetry \
  -H "X-KairOS-Key: <your-key>" | jq
Целевой интерфейс KairOS: команда становится исполнимой только после выпуска соответствующего компонента.
jsonПример JSON response
{
  "armed": true,
  "mode": "GUIDED",
  "battery": { "voltage": 22.4, "pct": 78 },
  "gps": { "fix": 3, "satellites": 14, "alt": 50.2 },
  "attitude": { "roll": 0.02, "pitch": -0.01, "yaw": 182.5 }
}
02
CLIENT EXAMPLE

Чтение телеметрии и отправка команды из Python

pythonЦелевой клиент KairOS — только для симулятора до лётной валидации
import httpx

BASE = "http://<board-ip>:8080"
headers = {"X-KairOS-Key": "<your-key>"}

telem = httpx.get(f"{BASE}/api/telemetry", headers=headers).json()
print(telem["battery"]["pct"], telem["gps"]["satellites"])

httpx.post(
    f"{BASE}/api/commands",
    headers=headers,
    json={"command": "takeoff", "params": {"alt": 10}},
)
Целевой интерфейс KairOS: команда становится исполнимой только после выпуска соответствующего компонента.
03
PORTS & TOPICS

Один MAVLink‑поток, несколько транспортов

ПоверхностьПорт или topicНазначение
REST:8080Статус, телеметрия, config, services, commands
MAVLink WebSocket:8765Binary MAVLink v2 в обе стороны
WebRTC WHEP:8889Локальное видео
Statuskairos/v1/agents/{agent_id}/statusRetained health и доступность агента
Telemetrykairos/v1/agents/{agent_id}/telemetryПоток состояния аппарата
Eventskairos/v1/agents/{agent_id}/eventsНаблюдаемые события и предупреждения
Commandskairos/v1/agents/{agent_id}/commandsКоманды к агенту с QoS 1
ACKkairos/v1/agents/{agent_id}/acks/{command_id}Результат конкретной команды
WebRTC signalingkairos/v1/agents/{agent_id}/video/webrtc/offerSDP offer для P2P video

Router принимает один поток от FC и распределяет его нескольким потребителям одновременно: browser GCS через WebSocket 8765, SITL/инженерный клиент через TCP 5760 и legacy‑инструменты через UDP 14550. В WebSocket нет JSON‑обёртки: передаются wire‑compatible binary MAVLink v2 frames.

javascriptЦелевой Browser WebSocket KairOS
const ws = new WebSocket("ws://<board-ip>:8765");
ws.binaryType = "arraybuffer";

ws.onmessage = (event) => {
  decodeMavlink(new Uint8Array(event.data));
};

ws.send(encodeCommandLong(sysid, compid, cmd, params));
Целевой интерфейс KairOS: команда становится исполнимой только после выпуска соответствующего компонента.
04
PYTHON SDK

Контракты для драйверов и on‑vehicle логики

КлассНазначение
CameraDriverCSI, USB UVC, IP и vendor SDK камеры
GimbalDriverPan, tilt, roll и телеметрия подвеса
LidarDriverLiDAR и rangefinder устройства
GpsDriverGPS/GNSS‑приёмники
EscDriverESC‑драйверы и обратная телеметрия
VisionClientFrames и detections из on‑vehicle vision bus
05
SECURITY

Разрешения API key ограничивают область действия

УровеньЧто разрешено
readTelemetry, status, config, logs, params без изменения состояния
commandFlight commands; включает read
missionUpload и execution mission files; включает command
configИзменение agent и FC configuration; включает read
adminUpdates, service restart, key management и полный доступ

Ключ нужно хранить как секрет и не вставлять в публичные логи, screenshots или клиентский bundle. Для браузерной интеграции рекомендуется короткоживущий scoped credential, а не постоянный admin key.

Интерфейс ИИ-помощника MCP: анализ миссии в диалоге, карта, телеметрия, вызовы инструментов, журнал событий и права доступа.
ИНТЕРФЕЙС / ВИЗУАЛЬНЫЙ ПРИМЕРКонтекст команд, доступа и аудита

Панель прав и журнал вызовов инструментов показаны рядом с миссией. Иллюстрация связывает тему разрешений с операторским контекстом; контракты API KairOS описаны в тексте страницы.

06
MESSAGE INTEGRITY

MAVLink v2 signing без хранения ключа на агенте

Ground station создаёт 32‑byte key и хранит его в браузере как non‑extractable Web Crypto key. Capability endpoint проверяет firmware и наличие signing parameters. После одноразового enrollment полётный контроллер проверяет HMAC‑SHA256 tag каждого outbound frame. Агент остаётся прозрачным pipe и не сохраняет signing key.

httpCapability check
GET /api/mavlink/signing/capability
X-KairOS-Key: <your-key>

{
  "supported": true,
  "reason": "ok",
  "firmware_name": "ArduPilot",
  "firmware_version": "4.5.0",
  "signing_params_present": true
}
Целевой интерфейс KairOS: команда становится исполнимой только после выпуска соответствующего компонента.