Gestion de l'espace aérien
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 champ | Code du champ | Type de données | Description | Requis |
|---|---|---|---|---|
| Source de données | source | Entier | 1 : Rapporté directement par l’appareil2 : Rapporté par le système du fabricant3 : Rapporté par le module complémentaire4 : Rapporté par le dispositif de collecte | Oui |
| Plateforme de rapport | plateform | Chaîne de caractères | Nom de la plateforme (par exemple, DJI Fly) | Oui |
| Version du programme | programVersion | Chaîne de caractères | Numéro de version (par exemple, version 1.0) | Oui |
| Signature | signature | Chaîne de caractères | La signature de requête générée | Oui |
| Horodatage de la requête | timestamp | Chaîne de caractères | Horodatage Unix de la requête (en secondes) | Oui |
| Nonce | nonce | Chaîne de caractères | Une chaîne générée aléatoirement | Oui |
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êtetimestamp)nonce: Chaîne aléatoire (provenant de l’en-tête de requêtenonce)body: Données brutes d’octets du corps de la requête (par exemple,RequestBodysérialisé en JSON)
Règles de signature
- Concaténer
timestamp,nonceet lebodydans cet ordre pour former une seule chaîne (sans séparateurs). - Utiliser l’algorithme HMAC-SHA256 avec le
tokencomme clé pour chiffrer la chaîne concaténée. - 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
- 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 clienttimestamp: L’horodatage de la requêtenonce: La chaîne aléatoire
- Le serveur régénère une signature en utilisant les mêmes paramètres et la clé secrète
appKey. - 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
| Champ | Type | Requis | Description |
|---|---|---|---|
app_id | string | Oui | Identifiant unique de l’application. Actuellement défini par défaut. |
flight_hub_organization_id | string | Oui | ID d’organisation FlightHub de l’utilisateur |
paths | FlightPath[] | Oui | Tableau 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 champ | Code du champ | Type de données | Description | Requis |
|---|---|---|---|---|---|
| 1 | ID de données de vol | order_id | Chaîne de caractères | Format : 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 |
| 2 | Numéro de série de l'appareil | sn | Chaîne de caractères | N° de série de production de l’appareil du fabricant | Oui |
| 3 | Statut du vol | flight_status | Chaîne de caractères | TakeOff : point de décollage, Inflight : En vol, Land : Point d’atterrissage | Oui |
| 4 | Code de crédit social unifié | manufacturer_id | Chaîne de caractères | Le code de crédit social unifié du fabricant. | Oui |
| 5 | Numéro d’enregistrement réel CAAC | uas_id | Chaîne de caractères | S’il n’y a pas de numéro d’enregistrement, utilisez la valeur par défaut UAS-DEFAULT. | Oui |
| 6 | Horodatage actuel | time_stamp | Chaîne de caractères | Heure UTC+8, format : aaaaMMjjHHmmss. Exemple : 20240124095001 | Oui |
| 7 | Modèle de produit | uas_model | Chaîne de caractères | Une combinaison de lettres, de chiffres et/ou de symboles. | Oui |
| 8 | Type de système de coordonnées | coordinate | Entier | 1 : WGS-842 : CGCS20003 : GLONASS-PZ90 | Oui |
| 9 | Longitude | longitude | Long | Unité : degrés (°). Valeur réelle = valeur du champ / 10⁷. | Oui |
| 10 | Latitude | latitude | Long | Unité : degrés (°). Valeur réelle = valeur du champ / 10⁷. | Oui |
| 11 | Type de hauteur réelle | height_type | Entier | 1 : Altitude relative au point de décollage (ALT)2 : Altitude relative à la position actuelle (AGL) | Oui |
| 12 | Hauteur réelle | height | Entier | Unité : mètres (m). Valeur réelle = valeur du champ / 10. | Oui |
| 13 | Altitude | altitude | Entier | Unité : mètres (m). Valeur réelle = valeur du champ / 10. | Oui |
| 14 | Vitesse verticale | vs | Entier | Unité : m/s. Valeur réelle = valeur du champ / 10. | Oui |
| 15 | Vitesse de vol horizontale | gs | Entier | Unité : m/s. Valeur réelle = valeur du champ / 10. | Oui |
| 16 | Course | course | Entier | Angle 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 |
| 17 | Statut de diffusion RID | remote_id_status | Entier | 0 : 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 champ | Code du champ | Type de données | Description |
|---|---|---|---|
| Code de statut | code | Chaîne de caractères | 0 = Succès, 400 = Échec |
| Description du résultat | result | Chaîne de caractères | Description détaillée (par exemple, succès) |
Exemple de réponse :
{
"code": "0",
"result": "success"
}