Gestione spazio aereo
Descrizione della funzione
Dopo aver abilitato la segnalazione dei dati dello spazio aereo in tempo reale, puoi ottenere un URL Webhook e un token di crittografia dal tuo fornitore di servizi. Dopo averli inseriti e salvati, l'API FlightHub può inviare i dati dell'aeromobile in tempo reale a terze parti. Di seguito è riportata la guida all'integrazione per i fornitori di servizi di terze parti.
Guida all'integrazione
Protocollo di segnalazione dei dati
1. Intestazione della richiesta
| Nome del campo | Codice del campo | Tipo di dati | Descrizione | Obbligatorio |
|---|---|---|---|---|
| Origine dei dati | source | Integer | 1: segnalato direttamente dall'aeromobile2: segnalato dal sistema del produttore3: segnalato dal modulo aggiuntivo4: segnalato dal dispositivo di raccolta | Sì |
| Piattaforma di segnalazione | platform | String | Nome della piattaforma (ad es. DJI Fly) | Sì |
| Versione del programma | programVersion | String | Numero di versione (ad es. version 1.0) | Sì |
| Firma | signature | String | La firma della richiesta generata | Sì |
| Timestamp della richiesta | timestamp | String | Timestamp Unix della richiesta (in secondi) | Sì |
| Nonce | nonce | String | Una stringa generata casualmente | Sì |
Processo di generazione della firma
Parametri di input
token: chiave dell'applicazione (fornita dal fornitore di servizi integrato e configurata dall'utente in FlightHub 2). Deve essere lunga da 32 a 64 caratteri e consistere in una combinazione di almeno tre dei seguenti tipi: lettere, numeri e simboli speciali.timestamp: timestamp della richiesta (dall'intestazione della richiestatimestamp)nonce: stringa casuale (dall'intestazione della richiestanonce)body: dati in byte grezzi del corpo della richiesta (ad es. ilRequestBodyserializzato in JSON)
Regole della firma
- Concatena
timestamp,nonceebodyin un'unica stringa in quest'ordine (senza separatori). - Usa l'algoritmo HMAC-SHA256 con il
tokencome chiave per crittografare la stringa concatenata. - Converti il risultato crittografato in una stringa esadecimale minuscola.
Implementazione del codice Go
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))
}
Processo di verifica della firma
Logica di verifica
- Il server recupera quanto segue dall'intestazione della richiesta:
signature: la firma generata dal clienttimestamp: il timestamp della richiestanonce: la stringa casuale
- Il server rigenera una firma usando gli stessi parametri e la chiave segreta
appKey. - Usa un confronto a tempo costante per verificare se la firma del client corrisponde a quella generata dal server.
Implementazione del codice Go
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. Corpo della richiesta
Formato JSON
{
"app_id":"default",
"flight_hub_organization_id":"xxxx",
"paths": [
{ /* FlightPath object */ },
{ /* FlightPath object */ }
]
}
Descrizioni dei campi
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
app_id | string | Sì | Identificatore univoco dell'applicazione. Attualmente il valore predefinito è default. |
flight_hub_organization_id | string | Sì | ID dell'organizzazione FlightHub dell'utente |
paths | FlightPath[] | Sì | Array di dati dei percorsi di volo (vedi la struttura dell'oggetto di seguito) |
Descrizione della struttura FlightPathRecord
Questa struttura viene utilizzata per descrivere i dati dei punti del percorso di volo. Di seguito sono riportate le descrizioni dettagliate dei campi:
| N. | Nome del campo | Codice del campo | Tipo di dati | Descrizione | Obbligatorio |
|---|---|---|---|---|---|
| 1 | Flight Record ID | order_id | String | Formato: Numero di serie del produttore (sn)-data di decollo a 8 cifre (YYYYMMDD)-codice casuale a 8 cifre.Esempio: 1581F5FHD25G100C1SDN-20240320-owvGyLqe.Lo stesso ID viene utilizzato per l'intero volo. | Sì |
| 2 | Numero di serie dell'aeromobile | sn | String | SN di produzione dell'aeromobile del produttore | Sì |
| 3 | Stato del volo | flight_status | String | TakeOff: punto di decollo, Inflight: in volo, Land: punto di atterraggio | Sì |
| 4 | Codice unificato di credito sociale | manufacturer_id | String | Il codice unificato di credito sociale del produttore. | Sì |
| 5 | Numero di registrazione al nome reale CAAC | uas_id | String | Se non esiste un numero di registrazione, usa il valore predefinito UAS-DEFAULT. | Sì |
| 6 | Timestamp corrente | time_stamp | String | Ora UTC+8, formato: yyyyMMddHHmmss. Esempio: 20240124095001 | Sì |
| 7 | Modello del prodotto | uas_model | String | Una combinazione di lettere, numeri e/o simboli. | Sì |
| 8 | Tipo di sistema di coordinate | coordinate | Integer | 1: WGS-842: CGCS20003: GLONASS-PZ90 | Sì |
| 9 | Longitudine | longitude | Long | Unità: gradi (°). Valore effettivo = valore del campo / 10⁷. | Sì |
| 10 | Latitudine | latitude | Long | Unità: gradi (°). Valore effettivo = valore del campo / 10⁷. | Sì |
| 11 | Tipo di altezza reale | height_type | Integer | 1: altitudine relativa al punto di decollo (ALT)2: altitudine relativa alla posizione corrente (AGL) | Sì |
| 12 | Altezza reale | height | Integer | Unità: metri (m). Valore effettivo = valore del campo / 10. | Sì |
| 13 | Altitudine | altitude | Integer | Unità: metri (m). Valore effettivo = valore del campo / 10. | Sì |
| 14 | Velocità verticale | vs | Integer | Unità: m/s. Valore effettivo = valore del campo / 10. | Sì |
| 15 | Velocità di volo orizzontale | gs | Integer | Unità: m/s. Valore effettivo = valore del campo / 10. | Sì |
| 16 | Rotta | course | Integer | Angolo in senso orario dal Nord vero (0°-360°). Valore effettivo = valore del campo / 10. Compila con -999 quando non sono disponibili dati. | Sì |
| 17 | Stato di trasmissione RID | remote_id_status | Integer | 0: disabilitato 1: abilitato | Sì |
Esempio di corpo:
{
"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. Corpo della risposta
| Nome del campo | Codice del campo | Tipo di dati | Descrizione |
|---|---|---|---|
| Codice di stato | code | String | 0 = successo, 400 = errore |
| Descrizione del risultato | result | String | Descrizione dettagliata (ad es. success) |
Esempio di risposta:
{
"code": "0",
"result": "success"
}