Luftraummanagement

2026-09-20

Funktionsbeschreibung

Nachdem du die Echtzeit-Meldung von Luftraumdaten aktiviert hast, kannst du eine Webhook-URL und ein Verschlüsselungstoken von deinem Dienstanbieter erhalten. Nachdem du sie eingegeben und gespeichert hast, kann die FlightHub API Echtzeit-Fluggerätedaten an Dritte übermitteln. Im Folgenden findest du die Integrationsanleitung für Drittanbieter-Dienstleister.

Integrationsleitfaden

Datenübertragungsprotokoll

1. Anfrage-Header

FeldnameFeldcodeDatentypBeschreibungErforderlich
DatenquellesourceGanzzahl1: Direkt vom Fluggerät gemeldet
2: Vom Herstellersystem gemeldet
3: Vom Zusatzmodul gemeldet
4: Gemeldet durch Erfassungsgerät
Ja
MeldeplattformplatformStringPlattformname (z.B. DJI Fly)Ja
ProgrammversionprogramVersionStringVersionsnummer (z.B. version 1.0)Ja
SignatursignatureStringDie generierte AnforderungssignaturJa
Anfrage-ZeitstempeltimestampStringUnix-Zeitstempel der Anfrage (in Sekunden)Ja
NoncenonceStringEine zufällig generierte ZeichenfolgeJa
Signaturerstellungsprozess

Eingabeparameter

  • token: Anwendungsschlüssel (vom integrierten Dienstanbieter bereitgestellt und vom Nutzer in FlightHub 2 konfiguriert). Muss 32–64 Zeichen lang sein und aus einer Kombination von mindestens drei der folgenden Typen bestehen: Buchstaben, Zahlen und Sonderzeichen.
  • timestamp: Anforderungszeitpunkt (aus dem timestamp des Anfrage-Headers)
  • nonce: Zufälliger String (aus dem nonce-Anfrage-Header)
  • body: Roh-Bytedaten des Anfragetextes (z. B. der JSON-serialisierte RequestBody)

Signaturregeln

  1. Füge timestamp, nonce und body in dieser Reihenfolge (ohne Trennzeichen) zu einem einzigen String zusammen.
  2. Verwende den HMAC-SHA256-Algorithmus mit dem token als Schlüssel, um die zusammengefügte Zeichenkette zu verschlüsseln.
  3. Wandle das verschlüsselte Ergebnis in eine hexadezimale Zeichenkette in Kleinbuchstaben um.

Go-Code-Implementierung

import (
    "crypto/hmac"
    "crypto/sha256"
    "crypto/subtle"
    "encoding/hex"
)

func GenerateHMACSignature(appKey, timestamp, nonce string, body []byte) string {
    mac := hmac.New(sha256.New, []byte(appKey))
    mac.Write([]byte(timestamp))
    mac.Write([]byte(nonce))
    mac.Write(body)
    return hex.EncodeToString(mac.Sum(nil))
}
Signaturprüfverfahren

Verifizierungslogik

  1. Der Server liest Folgendes aus dem Anfrage-Header aus:
    • signature: Die vom Client generierte Signatur
    • timestamp: Der Anforderungszeitstempel
    • nonce: Der zufällige String
  2. Der Server generiert mit denselben Parametern und dem geheimen Schlüssel appKey erneut eine Signatur.
  3. Verwende einen Vergleich mit konstanter Ausführungszeit, um zu überprüfen, ob die vom Client erzeugte Signatur mit der vom Server generierten übereinstimmt.

Go-Code-Implementierung

func VerifyHMACSignature(appKey, timestamp, nonce string, body []byte, signature string) bool {
    expected := GenerateHMACSignature(appKey, timestamp, nonce, body)
    return subtle.ConstantTimeCompare([]byte(expected), []byte(signature)) == 1
}

2. Anfragetext

JSON-Format

{
  "app_id":"default",
  "flight_hub_organization_id":"xxxx",
  "paths": [
    { /* FlightPath object */ },
    { /* FlightPath object */ }
  ]
}

Feldbeschreibungen

FeldTypErforderlichBeschreibung
app_idstringJaEindeutige Anwendungskennung. Derzeit auf „Standard“ eingestellt.
flight_hub_organisation_idstringJaBenutzer-ID der FlightHub-Organisation
pathsFlightPath[]JaVerzeichnis der Flugpfaddaten (siehe Objektstruktur unten)
Beschreibung der FlightPathRecord-Struktur

Diese Struktur wird verwendet, um die Daten von Flugpfadpunkten zu beschreiben. Im Folgenden findest du ausführliche Feldbeschreibungen:

Nr.FeldnameFeldcodeDatentypBeschreibungErforderlich
1Flugaufzeichnungs-IDorder_idStringFormati: Seriennummer (SN) des Herstellers – 8-stelliges Startdatum (JJJJMMTT) – 8-stelliger Zufallscode.
Beispiel: 1581F5FHD25G100C1SDN-20240320-owvGyLqe.
Die gleiche ID wird während des gesamten Flugs verwendet.
Ja
2Seriennummer des FluggerätssnStringFluggerät-Produktionsseriennummer des HerstellersJa
3Flugstatusflight_statusStringTakeOff: Startpunkt, Inflight: Im Flug, Land: LandepunktJa
4USCC (Unified Social Credit Code)manufacturer_idStringDer einheitliche Sozialkreditcode des Herstellers.Ja
5CAAC-Registrierungsnummer mit Echtnamenuas_idStringWenn keine Registrierungsnummer vorhanden ist, verwende den Standardwert UAS-DEFAULT.Ja
6Aktueller Zeitstempeltime_stampStringUTC+8-Zeit, Format: yyyyMMddHHmmss. Beispiel: 20240124095001Ja
7Produktmodelluas_modelStringEine Kombination aus Buchstaben, Zahlen und/oder Symbolen.Ja
8KoordinatensystemtypcoordinateGanzzahl1: WGS-84
2: CGCS2000
3: GLONASS-PZ90
Ja
9LängengradlongitudeLangEinheit: Grad (°). Tatsächlicher Wert = Feldwert / 10⁷.Ja
10BreitengradlatitudeLangEinheit: Grad (°). Tatsächlicher Wert = Feldwert / 10⁷.Ja
11Echter Höhen­typheight_typeGanzzahl1: Höhe relativ zum Startpunkt (ALT)
2: Höhe relativ zur aktuellen Position (AGL)
Ja
12Echte HöheheightGanzzahlEinheit: Meter (m). Tatsächlicher Wert = Feldwert / 10.Ja
13HöhealtitudeGanzzahlEinheit: Meter (m). Tatsächlicher Wert = Feldwert / 10.Ja
14Vertikale GeschwindigkeitvsGanzzahlEinheit: m/s. Tatsächlicher Wert = Feldwert / 10.Ja
15Horizontale FluggeschwindigkeitgsGanzzahlEinheit: m/s. Tatsächlicher Wert = Feldwert / 10.Ja
16KurscourseGanzzahlWinkel im Uhrzeigersinn von geografisch Nord (0°–360°). Tatsächlicher Wert = Feldwert / 10. -999 eintragen, wenn keine Daten verfügbar sind.Ja
17RID Übertragungsstatusremote_id_statusGanzzahl0: Deaktiviert 
1: Aktiviert
Ja

Beispiel für den Text:

{
	"app_id": "default",
	"flight_hub_organization_id": "105ddf05-54ce-4626-a872-cb32b8c98864",
	"paths": [{
		"order_id": "1529F6QAD23CB00A42DP-20251028-89W2aK2W",
		"sn": "1529F6QAD23CB00A42DP",
		"flight_status": "Land",
		"manufacturer_id": "925413007954257495",
		"uas_id": "UAS-DEFAULT",
		"time_stamp": "20251028115000",
		"uas_model": "M3D",
		"coordinate": 1,
		"longitude": 1243579943,
		"latitude": 217931488,
		"height_type": 1,
		"height": 0,
		"altitude": 187,
		"vs": 0,
		"gs": 0,
		"course": 1229,
		"remote_id_status": 1
	}]
}

3. Antworttext

FeldnameFeldcodeDatentypBeschreibung
Status-CodecodeString0 = Erfolg, 400 = Fehler
ErgebnisbeschreibungresultStringDetaillierte Beschreibung (z. B. success)

Beispiel für eine Antwort:

{
  "code": "0",
  "result": "success"
}
Last Updated: