Gerenciamento do espaço aéreo
Descrição do recurso
Após ativar o relatório em tempo real de dados do espaço aéreo, você poderá obter uma URL de Webhook e um token de criptografia com o seu provedor de serviços. Depois de inseri-los e salvá-los, a API do FlightHub pode enviar dados de aeronaves em tempo real para terceiros. A seguir está o guia de integração para provedores de serviços de terceiros.
Guia de integração
Protocolo de Relato de Dados
1. Cabeçalho da solicitação
| Nome do campo | Código do campo | Tipo de dado | Descrição | Necessário |
|---|---|---|---|---|
| Fonte de dados | fonte | Inteiro | 1: Reportado diretamente pela aeronave2: Reportado pelo sistema do fabricante3: Reportado por módulo adicional4: Reportado pelo dispositivo de coleta | Sim |
| Plataforma de relatório | plataforma | String | Nome da plataforma (por exemplo, DJI Fly) | Sim |
| Versão do programa | programVersion | String | Número da versão (por exemplo, versão 1.0) | Sim |
| Assinatura | assinatura | String | A assinatura de solicitação gerada | Sim |
| Marca temporal da solicitação | timestamp | String | Carimbo de data/hora Unix da solicitação (em segundos) | Sim |
| Nonce | nonce | String | Uma sequência gerada aleatoriamente | Sim |
Processo de geração de assinatura
Parâmetros de entrada
token: Chave do aplicativo (fornecida pelo provedor de serviços integrado e configurada pelo usuário no FlightHub 2). Deve ter entre 32 e 64 caracteres e consistir em uma combinação de pelo menos três dos seguintes tipos: letras, números e símbolos especiais.marca temporal: Marca temporal da solicitação (do cabeçalho de solicitação detimestamp)nonce: Cadeia de caracteres aleatória (do cabeçalho de requisiçãononce)corpo: Dados brutos em bytes do corpo da requisição (por exemplo, oRequestBodyserializado em JSON)
Regras de assinatura
- Concatene
timestamp,nonceebodyem uma única string nessa ordem (sem separadores). - Use o algoritmo HMAC-SHA256 com o
tokencomo chave para criptografar a string concatenada. - Converta o resultado criptografado em uma string hexadecimal em letras minúsculas.
Implementação em 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 de verificação de assinatura
Lógica de verificação
- O servidor obtém o seguinte do cabeçalho da requisição:
assinatura: A assinatura gerada pelo clientemarca temporal: The request timestampnonce: A string aleatória
- O servidor regenera uma assinatura usando os mesmos parâmetros e a chave secreta
appKey. - Use uma comparação em tempo constante para verificar se a assinatura do cliente corresponde à gerada pelo servidor.
Implementação em 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 da solicitação
formato JSON
{
"app_id":"default",
"flight_hub_organization_id":"xxxx",
"paths": [
{ /* FlightPath object */ },
{ /* FlightPath object */ }
]
}
Descrições de Campos
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
app_id | string | Sim | Identificador exclusivo do aplicativo. Atualmente, o padrão é default. |
flight_hub_organization_id | string | Sim | ID da organização FlightHub do usuário |
paths | FlightPath[] | Sim | Matriz de dados de trajetória de voo (consulte a estrutura do objeto abaixo) |
Descrição da estrutura FlightPathRecord
Essa estrutura é usada para descrever os dados de pontos da rota de voo. As descrições detalhadas dos campos são as seguintes:
| Nº | Nome do Campo | Código do Campo | Tipo de Dado | Descrição | Obrigatório |
|---|---|---|---|---|---|
| 1 | ID do Registro de Voo | order_id | String | Formato: Número de série do fabricante (sn) - data de decolagem com 8 dígitos (YYYYMMDD) - código aleatório com 8 dígitos.Exemplo: 1581F5FHD25G100C1SDN-20240320-owvGyLqe.O mesmo ID é usado durante todo o voo. | Sim |
| 2 | Número de série da aeronave | sn | String | SN de produção da aeronave do fabricante | Sim |
| 3 | status de Voo | flight_status | String | TakeOff: ponto de decolagem, Inflight: Em voo, Pousar: Ponto de pouso | Sim |
| 4 | Código de Crédito Social Unificado | manufacturer_id | String | Código de Crédito Social Unificado do fabricante. | Sim |
| 5 | Número de registro com nome real da CAAC | uas_id | String | Se não houver número de registro, use o valor padrão UAS-DEFAULT. | Sim |
| 6 | Carimbo de data/hora atual | time_stamp | String | Horário UTC+8, formato: yyyyMMddHHmmss. Exemplo: 20240124095001 | Sim |
| 7 | Modelo do produto | uas_model | String | Uma combinação de letras, números e/ou símbolos. | Sim |
| 8 | Tipo de sistema de coordenadas | coordinate | Inteiro | 1: WGS-842: CGCS20003: GLONASS-PZ90 | Sim |
| 9 | Longitude | longitude | Long | Unidade: graus (°). Valor real = valor do campo / 10⁷. | Sim |
| 10 | Latitude | latitude | Long | Unidade: graus (°). Valor real = valor do campo / 10⁷. | Sim |
| 11 | Tipo de altura verdadeira | height_type | Inteiro | 1: Altitude em relação ao ponto de decolagem (ALT)2: Altitude relativa à posição atual (AGL) | Sim |
| 12 | Altura real | height | Inteiro | Unidade: metros (m). Valor real = valor do campo / 10. | Sim |
| 13 | Altitude | altitude | Inteiro | Unidade: metros (m). Valor real = valor do campo / 10. | Sim |
| 14 | Velocidade vertical | vs | Inteiro | Unidade: m/s. Valor real = valor do campo / 10. | Sim |
| 15 | Vel. de voo horizontal | gs | Inteiro | Unidade: m/s. Valor real = valor do campo / 10. | Sim |
| 16 | Rumo | course | Inteiro | Ângulo no sentido horário a partir do norte verdadeiro (0°-360°). Valor real = valor do campo / 10. Preencher com -999 quando não houver dados disponíveis. | Sim |
| 17 | status de transmissão RID | remote_id_status | Inteiro | 0: Desativado 1: Ativado | Sim |
Exemplo de 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 da resposta
| Nome do campo | Código do campo | Tipo de dado | Descrição |
|---|---|---|---|
| Código de status | código | String | 0 = Sucesso, 400 = Falha |
| Descrição do resultado | resultado | String | Descrição detalhada (por exemplo, sucesso) |
Exemplo de resposta:
{
"code": "0",
"result": "success"
}