CONCEPT ET DÉVELOPPEMENTSPORT SANS PILOTE · #bezpiLOTa · KAIROS DRONE AGENTDocumentation
#bezpiLOTa→Drone Agent→API et SDK
KairOS / DRONE AGENT / 03

REST pour l’intégration, WebSocket MAVLink brut pour le temps réel, sujets MQTT versionnés pour le relais distant et SDK Python pour pilotes et extensions. Cette section fixe les ports, points d’accès, droits et exemples de l’interface propre à KairOS.

PRÉVU

API et SDK constituent un contrat cible KairOS ; aucune version stable ni garantie de compatibilité n’est encore publiée.

Dépôt KairOS ↗
08points d’accès REST principaux
JSONréponses REST
WSMAVLink brut
KEYauthentification des droits
01
REST API / :8080

Huit points d’accès principaux

La surface de commande écoute sur le port 8080 et renvoie du JSON. La plupart des requêtes exigent l’en-tête X-KairOS-Key. Chaque clé possède un niveau de droits, séparant lecture de télémétrie, commandes de vol, envoi de missions et administration.

MéthodePoint d’accèsDonnée ou action
GET/api/statusSanté, durée de fonctionnement, connexion FC, rôle, version d’agent
GET/api/telemetryAttitude, GPS, batterie, canaux RC, mode de vol
GET/api/paramsCache des paramètres FC avec filtrage par préfixe
POST/api/commandsDécollage, atterrissage, déplacement, RTL, armement, désarmement
GET/api/configConfiguration actuelle de l’agent en JSON
PUT/api/configModifier les clés et recharger à chaud les services concernés
GET/api/servicesrunning, stopped ou failed pour les services gérés
GET/api/logsÉvénements structurés avec filtres service et level
bashTélémétrie via REST
curl -s http://<board-ip>:8080/api/telemetry \
  -H "X-KairOS-Key: <your-key>" | jq
Interface cible KairOS : la commande ne devient exécutable qu’après la publication du composant correspondant.
jsonExemple de réponse JSON
{
  "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
EXEMPLE DE CLIENT

Lire la télémétrie et envoyer une commande en Python

pythonClient cible KairOS — simulateur uniquement avant validation en vol
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}},
)
Interface cible KairOS : la commande ne devient exécutable qu’après la publication du composant correspondant.
03
PORTS ET SUJETS

Un flux MAVLink, plusieurs transports

SurfacePort ou sujetFonction
REST:8080État, télémétrie, configuration, services, commandes
MAVLink WebSocket:8765MAVLink v2 binaire bidirectionnel
WebRTC WHEP:8889Vidéo locale
Étatkairos/v1/agents/{agent_id}/statusSanté conservée et disponibilité de l’agent
Télémétriekairos/v1/agents/{agent_id}/telemetryFlux d’état de l’appareil
Événementskairos/v1/agents/{agent_id}/eventsÉvénements et avertissements observables
Commandeskairos/v1/agents/{agent_id}/commandsCommandes à l’agent avec QoS 1
ACKkairos/v1/agents/{agent_id}/acks/{command_id}Résultat d’une commande donnée
Signalisation WebRTCkairos/v1/agents/{agent_id}/video/webrtc/offerOffre SDP pour vidéo P2P

Le routeur reçoit un flux du FC et le distribue simultanément à plusieurs clients : GCS navigateur par WebSocket 8765, client SITL/ingénierie par TCP 5760 et outils anciens par UDP 14550. WebSocket n’ajoute pas d’enveloppe JSON : il transporte des trames MAVLink v2 binaires compatibles avec le protocole.

javascriptWebSocket navigateur cible 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));
Interface cible KairOS : la commande ne devient exécutable qu’après la publication du composant correspondant.
04
SDK PYTHON

Contrats pour les pilotes et la logique embarquée

ClasseFonction
CameraDriverCaméras CSI, USB UVC, IP et à SDK constructeur
GimbalDriverPanoramique, inclinaison, roulis et télémétrie de nacelle
LidarDriverAppareils LiDAR et télémètres
GpsDriverRécepteurs GPS/GNSS
EscDriverPilotes ESC et télémétrie de retour
VisionClientImages et détections du bus de vision embarqué
05
SÉCURITÉ

Les droits des clés API limitent le périmètre d’action

NiveauOpérations autorisées
readTélémétrie, état, configuration, journaux et paramètres sans modification d’état
commandCommandes de vol ; inclut read
missionEnvoi et exécution de fichiers de mission ; inclut command
configModification de la configuration de l’agent et du FC ; inclut read
adminMises à jour, redémarrage de services, gestion des clés et accès complet

Conservez la clé secrète, hors journaux publics, captures d’écran et paquets clients. Les intégrations navigateur devraient utiliser des identifiants limités et éphémères plutôt que des clés administrateur permanentes.

Assistant IA MCP : analyse de mission en dialogue, carte, télémétrie, appels d’outils, journal et droits d’accès.
INTERFACE / EXEMPLE VISUELContexte de commandes, accès et audit

Droits et journal d’appels d’outils sont montrés près de la mission. L’illustration relie autorisations et contexte opérateur ; les contrats API KairOS sont décrits dans le texte.

06
INTÉGRITÉ DES MESSAGES

Signature MAVLink v2 sans stockage de clé sur l’agent

La station sol crée une clé de 32 octets et la conserve dans le navigateur comme clé Web Crypto non extractible. Le point d’accès des capacités vérifie micrologiciel et paramètres de signature. Après enrôlement unique, le contrôleur vérifie l’étiquette HMAC-SHA256 de chaque trame sortante. L’agent reste un conduit transparent et ne stocke pas la clé.

httpVérification des capacités
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
}
Interface cible KairOS : la commande ne devient exécutable qu’après la publication du composant correspondant.