Zarządzanie przestrzenią powietrzną
Opis funkcji
Po włączeniu raportowania danych przestrzeni powietrznej w czasie rzeczywistym możesz uzyskać adres URL Webhook i token szyfrowania od swojego dostawcy usług. Po ich wprowadzeniu i zapisaniu interfejs API FlightHub może przesyłać dane statku powietrznego w czasie rzeczywistym do stron trzecich. Poniżej znajduje się przewodnik po integracji dla dostawców usług stron trzecich.
Przewodnik po integracji
Protokół raportowania danych
1. Nagłówek żądania
| Nazwa pola | Kod pola | Typ danych | Opis | Wymagane |
|---|---|---|---|---|
| Źródło danych | source | Integer | 1: raportowane bezpośrednio przez statek powietrzny2: raportowane przez system producenta3: raportowane przez moduł dodatkowy4: raportowane przez urządzenie zbierające | Tak |
| Platforma raportująca | platform | String | Nazwa platformy (np. DJI Fly) | Tak |
| Wersja programu | programVersion | String | Numer wersji (np. version 1.0) | Tak |
| Podpis | signature | String | Wygenerowany podpis żądania | Tak |
| Znacznik czasu żądania | timestamp | String | Znacznik czasu Unix żądania (w sekundach) | Tak |
| Nonce | nonce | String | Losowo generowany ciąg | Tak |
Proces generowania podpisu
Parametry wejściowe
token: klucz aplikacji (dostarczony przez zintegrowanego dostawcę usług i skonfigurowany przez użytkownika w FlightHub 2). Musi mieć od 32 do 64 znaków i składać się z kombinacji co najmniej trzech z następujących typów: litery, cyfry i znaki specjalne.timestamp: znacznik czasu żądania (z nagłówka żądaniatimestamp)nonce: losowy ciąg (z nagłówka żądanianonce)body: surowe dane bajtowe treści żądania (np.RequestBodyzserializowany w JSON)
Zasady podpisu
- Połącz
timestamp,nonceibodyw jeden ciąg w tej kolejności (bez separatorów). - Użyj algorytmu HMAC-SHA256 z
tokenjako kluczem, aby zaszyfrować połączony ciąg. - Przekonwertuj zaszyfrowany wynik na mały ciąg szesnastkowy.
Implementacja kodu 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))
}
Proces weryfikacji podpisu
Logika weryfikacji
- Serwer pobiera następujące elementy z nagłówka żądania:
signature: podpis wygenerowany przez klientatimestamp: znacznik czasu żądanianonce: losowy ciąg
- Serwer ponownie generuje podpis przy użyciu tych samych parametrów i klucza tajnego
appKey. - Użyj porównania w stałym czasie, aby sprawdzić, czy podpis klienta jest zgodny z podpisem wygenerowanym przez serwer.
Implementacja kodu 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. Treść żądania
Format JSON
{
"app_id":"default",
"flight_hub_organization_id":"xxxx",
"paths": [
{ /* FlightPath object */ },
{ /* FlightPath object */ }
]
}
Opisy pól
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
app_id | string | Tak | Unikalny identyfikator aplikacji. Obecnie domyślnie ustawiony na default. |
flight_hub_organization_id | string | Tak | Identyfikator organizacji FlightHub użytkownika |
paths | FlightPath[] | Tak | Tablica danych tras lotu (patrz struktura obiektu poniżej) |
Opis struktury FlightPathRecord
Ta struktura służy do opisywania danych punktów trasy lotu. Poniżej znajdują się szczegółowe opisy pól:
| Nr | Nazwa pola | Kod pola | Typ danych | Opis | Wymagane |
|---|---|---|---|---|---|
| 1 | Flight Record ID | order_id | String | Format: Numer seryjny producenta (sn)-8-cyfrowa data startu (YYYYMMDD)-8-cyfrowy kod losowy.Przykład: 1581F5FHD25G100C1SDN-20240320-owvGyLqe.Ten sam identyfikator jest używany przez cały lot. | Tak |
| 2 | Numer seryjny statku powietrznego | sn | String | Numer seryjny produkcyjny statku powietrznego producenta | Tak |
| 3 | Status lotu | flight_status | String | TakeOff: punkt startu, Inflight: w locie, Land: punkt lądowania | Tak |
| 4 | Ujednolicony kod kredytu społecznego | manufacturer_id | String | Ujednolicony kod kredytu społecznego producenta. | Tak |
| 5 | Numer rejestracji na nazwisko CAAC | uas_id | String | Jeśli nie ma numeru rejestracyjnego, użyj wartości domyślnej UAS-DEFAULT. | Tak |
| 6 | Bieżący znacznik czasu | time_stamp | String | Czas UTC+8, format: yyyyMMddHHmmss. Przykład: 20240124095001 | Tak |
| 7 | Model produktu | uas_model | String | Kombinacja liter, cyfr i/lub symboli. | Tak |
| 8 | Typ układu współrzędnych | coordinate | Integer | 1: WGS-842: CGCS20003: GLONASS-PZ90 | Tak |
| 9 | Długość geograficzna | longitude | Long | Jednostka: stopnie (°). Wartość rzeczywista = wartość pola / 10⁷. | Tak |
| 10 | Szerokość geograficzna | latitude | Long | Jednostka: stopnie (°). Wartość rzeczywista = wartość pola / 10⁷. | Tak |
| 11 | Typ wysokości rzeczywistej | height_type | Integer | 1: wysokość względem punktu startu (ALT)2: wysokość względem bieżącej pozycji (AGL) | Tak |
| 12 | Wysokość rzeczywista | height | Integer | Jednostka: metry (m). Wartość rzeczywista = wartość pola / 10. | Tak |
| 13 | Wysokość | altitude | Integer | Jednostka: metry (m). Wartość rzeczywista = wartość pola / 10. | Tak |
| 14 | Prędkość pionowa | vs | Integer | Jednostka: m/s. Wartość rzeczywista = wartość pola / 10. | Tak |
| 15 | Prędkość lotu poziomego | gs | Integer | Jednostka: m/s. Wartość rzeczywista = wartość pola / 10. | Tak |
| 16 | Kurs | course | Integer | Kąt zgodnie z ruchem wskazówek zegara od północy rzeczywistej (0°-360°). Wartość rzeczywista = wartość pola / 10. Wpisz -999, gdy dane nie są dostępne. | Tak |
| 17 | Status transmisji RID | remote_id_status | Integer | 0: wyłączone 1: włączone | Tak |
Przykład treści:
{
"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. Treść odpowiedzi
| Nazwa pola | Kod pola | Typ danych | Opis |
|---|---|---|---|
| Kod stanu | code | String | 0 = sukces, 400 = niepowodzenie |
| Opis wyniku | result | String | Szczegółowy opis (np. success) |
Przykład odpowiedzi:
{
"code": "0",
"result": "success"
}