Gestion de l'espace aérien

2026-09-20

Description de la fonctionnalité

Après avoir activé le rapport en temps réel des données d’espace aérien, vous pouvez obtenir une URL Webhook et un jeton de chiffrement auprès de votre fournisseur de services. Après les avoir saisis et enregistrés, l’API FlightHub peut transmettre en temps réel les données d’appareil à des tiers. Voici le guide d’intégration à l’intention des fournisseurs de services tiers.

Guide d’intégration

Protocole de rapport de données

1. En-tête de requête

Nom du champCode du champType de donnéesDescriptionRequis
Source de donnéessourceEntier1 : Rapporté directement par l’appareil
2 : Rapporté par le système du fabricant
3 : Rapporté par le module complémentaire
4 : Rapporté par le dispositif de collecte
Oui
Plateforme de rapportplateformChaîne de caractèresNom de la plateforme (par exemple, DJI Fly)Oui
Version du programmeprogramVersionChaîne de caractèresNuméro de version (par exemple, version 1.0)Oui
SignaturesignatureChaîne de caractèresLa signature de requête généréeOui
Horodatage de la requêtetimestampChaîne de caractèresHorodatage Unix de la requête (en secondes)Oui
NoncenonceChaîne de caractèresUne chaîne générée aléatoirementOui
Processus de génération de signature

Paramètres d’entrée

  • token : Clé d’application (fournie par le prestataire de services intégré et configurée par l’utilisateur dans FlightHub 2). Doit comporter entre 32 et 64 caractères et comprendre une combinaison d’au moins trois des types suivants : lettres, chiffres et symboles spéciaux.
  • timestamp : Horodatage de la requête (depuis l’en-tête de requête timestamp)
  • nonce : Chaîne aléatoire (provenant de l’en-tête de requête nonce)
  • body : Données brutes d’octets du corps de la requête (par exemple, RequestBody sérialisé en JSON)

Règles de signature

  1. Concaténer timestamp, nonce et le body dans cet ordre pour former une seule chaîne (sans séparateurs).
  2. Utiliser l’algorithme HMAC-SHA256 avec le token comme clé pour chiffrer la chaîne concaténée.
  3. Convertir le résultat chiffré en une chaîne hexadécimale en minuscules.

Implémentation Go Code

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))
}
Processus de vérification de la signature

Logique de vérification

  1. Le serveur extrait les éléments suivants de l’en-tête de la requête :
    • signature : La signature générée par le client
    • timestamp : L’horodatage de la requête
    • nonce : La chaîne aléatoire
  2. Le serveur régénère une signature en utilisant les mêmes paramètres et la clé secrète appKey.
  3. Utilisez une comparaison en temps constant pour vérifier si la signature du client correspond à celle générée par le serveur.

Implémentation Go Code

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. Corps de la requête

Format JSON

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

Descriptions des champs

ChampTypeRequisDescription
app_idstringOuiIdentifiant unique de l’application. Actuellement défini par défaut.
flight_hub_organization_idstringOuiID d’organisation FlightHub de l’utilisateur
pathsFlightPath[]OuiTableau de données de trajectoires de vol (voir la structure de l’objet ci-dessous)
Description de la structure FlightPathRecord

Cette structure est utilisée pour décrire les données de points de trajectoire de vol. Voici les descriptions détaillées des champs :

NºNom du champCode du champType de donnéesDescriptionRequis
1ID de données de volorder_idChaîne de caractèresFormat : Numéro de série du fabricant (sn) – date de décollage à 8 chiffres (AAAAMMJJ) – code aléatoire à 8 chiffres.
Exemple : 1581F5FHD25G100C1SDN-20240320-owvGyLqe.
Le même identifiant est utilisé pendant l’ensemble du vol.
Oui
2Numéro de série de l'appareilsnChaîne de caractèresN° de série de production de l’appareil du fabricantOui
3Statut du volflight_statusChaîne de caractèresTakeOff : point de décollage, Inflight : En vol, Land : Point d’atterrissageOui
4Code de crédit social unifiémanufacturer_idChaîne de caractèresLe code de crédit social unifié du fabricant.Oui
5Numéro d’enregistrement réel CAACuas_idChaîne de caractèresS’il n’y a pas de numéro d’enregistrement, utilisez la valeur par défaut UAS-DEFAULT.Oui
6Horodatage actueltime_stampChaîne de caractèresHeure UTC+8, format : aaaaMMjjHHmmss. Exemple : 20240124095001Oui
7Modèle de produituas_modelChaîne de caractèresUne combinaison de lettres, de chiffres et/ou de symboles.Oui
8Type de système de coordonnéescoordinateEntier1 : WGS-84
2 : CGCS2000
3 : GLONASS-PZ90
Oui
9LongitudelongitudeLongUnité : degrés (°). Valeur réelle = valeur du champ / 10⁷.Oui
10LatitudelatitudeLongUnité : degrés (°). Valeur réelle = valeur du champ / 10⁷.Oui
11Type de hauteur réelleheight_typeEntier1 : Altitude relative au point de décollage (ALT)
2 : Altitude relative à la position actuelle (AGL)
Oui
12Hauteur réelleheightEntierUnité : mètres (m). Valeur réelle = valeur du champ / 10.Oui
13AltitudealtitudeEntierUnité : mètres (m). Valeur réelle = valeur du champ / 10.Oui
14Vitesse verticalevsEntierUnité : m/s. Valeur réelle = valeur du champ / 10.Oui
15Vitesse de vol horizontalegsEntierUnité : m/s. Valeur réelle = valeur du champ / 10.Oui
16CoursecourseEntierAngle dans le sens horaire par rapport au nord vrai (0°-360°). Valeur réelle = valeur du champ / 10. Renseignez -999 lorsqu’aucune donnée n’est disponible.Oui
17Statut de diffusion RIDremote_id_statusEntier0 : Désactivé  
1 : Activé
Oui

Exemple de corps :

{
	"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. Corps de la réponse

Nom du champCode du champType de donnéesDescription
Code de statutcodeChaîne de caractères0 = Succès, 400 = Échec
Description du résultatresultChaîne de caractèresDescription détaillée (par exemple, succès)

Exemple de réponse :

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