Gestione spazio aereo

2026-09-22

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 campoCodice del campoTipo di datiDescrizioneObbligatorio
Origine dei datisourceInteger1: segnalato direttamente dall'aeromobile
2: segnalato dal sistema del produttore
3: segnalato dal modulo aggiuntivo
4: segnalato dal dispositivo di raccolta
Sì
Piattaforma di segnalazioneplatformStringNome della piattaforma (ad es. DJI Fly)Sì
Versione del programmaprogramVersionStringNumero di versione (ad es. version 1.0)Sì
FirmasignatureStringLa firma della richiesta generataSì
Timestamp della richiestatimestampStringTimestamp Unix della richiesta (in secondi)Sì
NoncenonceStringUna stringa generata casualmenteSì
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 richiesta timestamp)
  • nonce: stringa casuale (dall'intestazione della richiesta nonce)
  • body: dati in byte grezzi del corpo della richiesta (ad es. il RequestBody serializzato in JSON)

Regole della firma

  1. Concatena timestamp, nonce e body in un'unica stringa in quest'ordine (senza separatori).
  2. Usa l'algoritmo HMAC-SHA256 con il token come chiave per crittografare la stringa concatenata.
  3. 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

  1. Il server recupera quanto segue dall'intestazione della richiesta:
    • signature: la firma generata dal client
    • timestamp: il timestamp della richiesta
    • nonce: la stringa casuale
  2. Il server rigenera una firma usando gli stessi parametri e la chiave segreta appKey.
  3. 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

CampoTipoObbligatorioDescrizione
app_idstringSìIdentificatore univoco dell'applicazione. Attualmente il valore predefinito è default.
flight_hub_organization_idstringSìID dell'organizzazione FlightHub dell'utente
pathsFlightPath[]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 campoCodice del campoTipo di datiDescrizioneObbligatorio
1Flight Record IDorder_idStringFormato: 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ì
2Numero di serie dell'aeromobilesnStringSN di produzione dell'aeromobile del produttoreSì
3Stato del voloflight_statusStringTakeOff: punto di decollo, Inflight: in volo, Land: punto di atterraggioSì
4Codice unificato di credito socialemanufacturer_idStringIl codice unificato di credito sociale del produttore.Sì
5Numero di registrazione al nome reale CAACuas_idStringSe non esiste un numero di registrazione, usa il valore predefinito UAS-DEFAULT.Sì
6Timestamp correntetime_stampStringOra UTC+8, formato: yyyyMMddHHmmss. Esempio: 20240124095001Sì
7Modello del prodottouas_modelStringUna combinazione di lettere, numeri e/o simboli.Sì
8Tipo di sistema di coordinatecoordinateInteger1: WGS-84
2: CGCS2000
3: GLONASS-PZ90
Sì
9LongitudinelongitudeLongUnità: gradi (°). Valore effettivo = valore del campo / 10⁷.Sì
10LatitudinelatitudeLongUnità: gradi (°). Valore effettivo = valore del campo / 10⁷.Sì
11Tipo di altezza realeheight_typeInteger1: altitudine relativa al punto di decollo (ALT)
2: altitudine relativa alla posizione corrente (AGL)
Sì
12Altezza realeheightIntegerUnità: metri (m). Valore effettivo = valore del campo / 10.Sì
13AltitudinealtitudeIntegerUnità: metri (m). Valore effettivo = valore del campo / 10.Sì
14Velocità verticalevsIntegerUnità: m/s. Valore effettivo = valore del campo / 10.Sì
15Velocità di volo orizzontalegsIntegerUnità: m/s. Valore effettivo = valore del campo / 10.Sì
16RottacourseIntegerAngolo in senso orario dal Nord vero (0°-360°). Valore effettivo = valore del campo / 10. Compila con -999 quando non sono disponibili dati.Sì
17Stato di trasmissione RIDremote_id_statusInteger0: 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 campoCodice del campoTipo di datiDescrizione
Codice di statocodeString0 = successo, 400 = errore
Descrizione del risultatoresultStringDescrizione dettagliata (ad es. success)

Esempio di risposta:

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