Luftraummanagement
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
| Feldname | Feldcode | Datentyp | Beschreibung | Erforderlich |
|---|---|---|---|---|
| Datenquelle | source | Ganzzahl | 1: Direkt vom Fluggerät gemeldet2: Vom Herstellersystem gemeldet3: Vom Zusatzmodul gemeldet4: Gemeldet durch Erfassungsgerät | Ja |
| Meldeplattform | platform | String | Plattformname (z.B. DJI Fly) | Ja |
| Programmversion | programVersion | String | Versionsnummer (z.B. version 1.0) | Ja |
| Signatur | signature | String | Die generierte Anforderungssignatur | Ja |
| Anfrage-Zeitstempel | timestamp | String | Unix-Zeitstempel der Anfrage (in Sekunden) | Ja |
| Nonce | nonce | String | Eine zufällig generierte Zeichenfolge | Ja |
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 demtimestampdes Anfrage-Headers)nonce: Zufälliger String (aus demnonce-Anfrage-Header)body: Roh-Bytedaten des Anfragetextes (z. B. der JSON-serialisierteRequestBody)
Signaturregeln
- Füge
timestamp,nonceundbodyin dieser Reihenfolge (ohne Trennzeichen) zu einem einzigen String zusammen. - Verwende den HMAC-SHA256-Algorithmus mit dem
tokenals Schlüssel, um die zusammengefügte Zeichenkette zu verschlüsseln. - 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
- Der Server liest Folgendes aus dem Anfrage-Header aus:
signature: Die vom Client generierte Signaturtimestamp: Der Anforderungszeitstempelnonce: Der zufällige String
- Der Server generiert mit denselben Parametern und dem geheimen Schlüssel
appKeyerneut eine Signatur. - 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
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
app_id | string | Ja | Eindeutige Anwendungskennung. Derzeit auf „Standard“ eingestellt. |
flight_hub_organisation_id | string | Ja | Benutzer-ID der FlightHub-Organisation |
paths | FlightPath[] | Ja | Verzeichnis 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. | Feldname | Feldcode | Datentyp | Beschreibung | Erforderlich |
|---|---|---|---|---|---|
| 1 | Flugaufzeichnungs-ID | order_id | String | Formati: 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 |
| 2 | Seriennummer des Fluggeräts | sn | String | Fluggerät-Produktionsseriennummer des Herstellers | Ja |
| 3 | Flugstatus | flight_status | String | TakeOff: Startpunkt, Inflight: Im Flug, Land: Landepunkt | Ja |
| 4 | USCC (Unified Social Credit Code) | manufacturer_id | String | Der einheitliche Sozialkreditcode des Herstellers. | Ja |
| 5 | CAAC-Registrierungsnummer mit Echtnamen | uas_id | String | Wenn keine Registrierungsnummer vorhanden ist, verwende den Standardwert UAS-DEFAULT. | Ja |
| 6 | Aktueller Zeitstempel | time_stamp | String | UTC+8-Zeit, Format: yyyyMMddHHmmss. Beispiel: 20240124095001 | Ja |
| 7 | Produktmodell | uas_model | String | Eine Kombination aus Buchstaben, Zahlen und/oder Symbolen. | Ja |
| 8 | Koordinatensystemtyp | coordinate | Ganzzahl | 1: WGS-842: CGCS20003: GLONASS-PZ90 | Ja |
| 9 | Längengrad | longitude | Lang | Einheit: Grad (°). Tatsächlicher Wert = Feldwert / 10⁷. | Ja |
| 10 | Breitengrad | latitude | Lang | Einheit: Grad (°). Tatsächlicher Wert = Feldwert / 10⁷. | Ja |
| 11 | Echter Höhentyp | height_type | Ganzzahl | 1: Höhe relativ zum Startpunkt (ALT)2: Höhe relativ zur aktuellen Position (AGL) | Ja |
| 12 | Echte Höhe | height | Ganzzahl | Einheit: Meter (m). Tatsächlicher Wert = Feldwert / 10. | Ja |
| 13 | Höhe | altitude | Ganzzahl | Einheit: Meter (m). Tatsächlicher Wert = Feldwert / 10. | Ja |
| 14 | Vertikale Geschwindigkeit | vs | Ganzzahl | Einheit: m/s. Tatsächlicher Wert = Feldwert / 10. | Ja |
| 15 | Horizontale Fluggeschwindigkeit | gs | Ganzzahl | Einheit: m/s. Tatsächlicher Wert = Feldwert / 10. | Ja |
| 16 | Kurs | course | Ganzzahl | Winkel im Uhrzeigersinn von geografisch Nord (0°–360°). Tatsächlicher Wert = Feldwert / 10. -999 eintragen, wenn keine Daten verfügbar sind. | Ja |
| 17 | RID Übertragungsstatus | remote_id_status | Ganzzahl | 0: 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
| Feldname | Feldcode | Datentyp | Beschreibung |
|---|---|---|---|
| Status-Code | code | String | 0 = Erfolg, 400 = Fehler |
| Ergebnisbeschreibung | result | String | Detaillierte Beschreibung (z. B. success) |
Beispiel für eine Antwort:
{
"code": "0",
"result": "success"
}