Gerenciamento do espaço aéreo

2026-09-20

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 campoCódigo do campoTipo de dadoDescriçãoNecessário
Fonte de dadosfonteInteiro1: Reportado diretamente pela aeronave
2: Reportado pelo sistema do fabricante
3: Reportado por módulo adicional
4: Reportado pelo dispositivo de coleta
Sim
Plataforma de relatórioplataformaStringNome da plataforma (por exemplo, DJI Fly)Sim
Versão do programaprogramVersionStringNúmero da versão (por exemplo, versão 1.0)Sim
AssinaturaassinaturaStringA assinatura de solicitação geradaSim
Marca temporal da solicitaçãotimestampStringCarimbo de data/hora Unix da solicitação (em segundos)Sim
NoncenonceStringUma sequência gerada aleatoriamenteSim
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 de timestamp)
  • nonce: Cadeia de caracteres aleatória (do cabeçalho de requisição nonce)
  • corpo: Dados brutos em bytes do corpo da requisição (por exemplo, o RequestBody serializado em JSON)

Regras de assinatura

  1. Concatene timestamp, nonce e body em uma única string nessa ordem (sem separadores).
  2. Use o algoritmo HMAC-SHA256 com o token como chave para criptografar a string concatenada.
  3. 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

  1. O servidor obtém o seguinte do cabeçalho da requisição:
    • assinatura: A assinatura gerada pelo cliente
    • marca temporal: The request timestamp
    • nonce: A string aleatória
  2. O servidor regenera uma assinatura usando os mesmos parâmetros e a chave secreta appKey.
  3. 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

CampoTipoObrigatórioDescrição
app_idstringSimIdentificador exclusivo do aplicativo. Atualmente, o padrão é default.
flight_hub_organization_idstringSimID da organização FlightHub do usuário
pathsFlightPath[]SimMatriz 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 CampoCódigo do CampoTipo de DadoDescriçãoObrigatório
1ID do Registro de Vooorder_idStringFormato: 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
2Número de série da aeronavesnStringSN de produção da aeronave do fabricanteSim
3status de Vooflight_statusStringTakeOff: ponto de decolagem, Inflight: Em voo, Pousar: Ponto de pousoSim
4Código de Crédito Social Unificadomanufacturer_idStringCódigo de Crédito Social Unificado do fabricante.Sim
5Número de registro com nome real da CAACuas_idStringSe não houver número de registro, use o valor padrão UAS-DEFAULT.Sim
6Carimbo de data/hora atualtime_stampStringHorário UTC+8, formato: yyyyMMddHHmmss. Exemplo: 20240124095001 Sim
7Modelo do produtouas_modelStringUma combinação de letras, números e/ou símbolos.Sim
8Tipo de sistema de coordenadascoordinateInteiro1: WGS-84
2: CGCS2000
3: GLONASS-PZ90
Sim
9LongitudelongitudeLongUnidade: graus (°). Valor real = valor do campo / 10⁷.Sim
10LatitudelatitudeLongUnidade: graus (°). Valor real = valor do campo / 10⁷.Sim
11Tipo de altura verdadeiraheight_typeInteiro1: Altitude em relação ao ponto de decolagem (ALT)
2: Altitude relativa à posição atual (AGL)
Sim
12Altura realheightInteiroUnidade: metros (m). Valor real = valor do campo / 10.Sim
13AltitudealtitudeInteiroUnidade: metros (m). Valor real = valor do campo / 10.Sim
14Velocidade verticalvsInteiroUnidade: m/s. Valor real = valor do campo / 10.Sim
15Vel. de voo horizontalgsInteiroUnidade: m/s. Valor real = valor do campo / 10.Sim
16RumocourseInteiroÂ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
17status de transmissão RIDremote_id_statusInteiro0: 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 campoCódigo do campoTipo de dadoDescrição
Código de statuscódigoString0 = Sucesso, 400 = Falha
Descrição do resultadoresultadoStringDescrição detalhada (por exemplo, sucesso)

Exemplo de resposta:

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