Gestión del espacio aéreo

2026-09-20

Descripción de funciones

Después de habilitar los informes de datos del espacio aéreo en tiempo real, puedes obtener una URL de Webhook y un token de cifrado de tu proveedor de servicios. Después de introducirlos y guardarlos, la API de FlightHub puede enviar datos de la aeronave a terceros en tiempo real. A continuación, se presenta la guía de integración para los proveedores de servicios de terceros.

Guía de integración

Protocolo de informes de datos

1. Encabezado de la solicitud

Nombre de campoCódigo de campoTipo de datosDescripciónObligatorio
Fuente de datossourceEntero1: Información proporcionada directamente por la aeronave
2: Información proporcionada por el sistema del fabricante
3: Información proporcionada por el módulo complementario
4: Información proporcionada por el dispositivo de recopilación
Sí
Plataforma de informesplatformCadenaNombre de la plataforma (p. ej., DJI Fly)Sí
Versión del programaprogramVersionCadenaNúmero de versión (p. ej., version 1.0)Sí
FirmasignatureCadenaLa firma de solicitud generadaSí
Marca de tiempo de la solicitudtimestampCadenaMarca de tiempo Unix de la solicitud (en segundos)Sí
NoncenonceCadenaUna cadena generada aleatoriamenteSí
Proceso de generación de la firma

Parámetros de entrada

  • token: Clave de aplicación (proporcionada por el proveedor de servicios integrado y configurada por el usuario en FlightHub 2). Debe tener entre 32 y 64 caracteres y estar compuesto por una combinación de al menos tres de los siguientes tipos: letras, números y símbolos especiales.
  • timestamp: Marca de tiempo de la solicitud (del encabezado de la solicitud timestamp)
  • nonce: Cadena aleatoria (del encabezado de la solicitud nonce)
  • body: Datos en bruto en bytes del cuerpo de la solicitud (p. ej., el RequestBody serializado en JSON)

Reglas de firma

  1. Concatena timestamp, nonce y body en una sola cadena en ese orden (sin separadores).
  2. Utiliza el algoritmo HMAC-SHA256 con el token como clave para cifrar la cadena concatenada.
  3. Convierte el resultado encriptado en una cadena hexadecimal en minúsculas.

Implementación de código 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))
}
Proceso de verificación de firma

Lógica de verificación

  1. El servidor recupera lo siguiente del encabezado de la solicitud:
    • signature: La firma generada por el cliente
    • timestamp: La marca de tiempo de la solicitud
    • nonce: La cadena aleatoria
  2. El servidor vuelve a generar una firma utilizando los mismos parámetros y la clave secreta appKey.
  3. Utiliza una comparación en tiempo constante para verificar si la firma del cliente coincide con la generada por el servidor.

Implementación de código 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. Cuerpo de la solicitud

Formato JSON

{
  "app_id":"default",
  "flight_hub_organization_id":"xxxx",
  "paths": [
    { /* FlightPath object */ },
    { /* FlightPath object */ }
  ]
}

Descripciones de campos

CampoTipoObligatorioDescripción
app_idstringSíIdentificador exclusivo de la aplicación. Actualmente se establece en el valor predeterminado.
flight_hub_organization_idstringSíID de organización de FlightHub del usuario
pathsFlightPath[]SíMatriz de datos de ruta de vuelo (consultar la estructura del objeto a continuación)
Descripción de la estructura de FlightPathRecord

Esta estructura se utiliza para describir los datos de puntos de la ruta de vuelo. A continuación se describen detalladamente los campos:

N.ºNombre de campoCódigo de campoTipo de datosDescripciónObligatorio
1ID de registro de vueloorder_idCadenaFormato: Manufacturer Serial Number (sn)-8-digit takeoff date (YYYYMMDD)-8-digit random code.
Ejemplo: 1581F5FHD25G100C1SDN-20240320-owvGyLqe.
El mismo ID se utiliza durante todo el vuelo.
Sí
2Número de serie de la aeronavesnCadenaNúmero de serie de producción de la aeronave del fabricanteSí
3Estado de vueloflight_statusCadenaTakeOff: punto de despegue, Inflight: en vuelo, Land: punto de aterrizajeSí
4Código de crédito social unificadomanufacturer_idCadenaEl código unificado de crédito social del fabricante.Sí
5Número de registro con nombre real de la CAACuas_idCadenaSi no hay número de registro, utiliza el valor predeterminado UAS-DEFAULT.Sí
6Marca de tiempo actualtime_stampCadenaHora UTC+8, formato: yyyyMMddHHmmss. Ejemplo: 20240124095001Sí
7Modelo de productouas_modelCadenaUna combinación de letras, números y/o símbolos.Sí
8Tipo de sistema de coordenadascoordinateEntero1: WGS-84
2: CGCS2000
3: GLONASS-PZ90
Sí
9LongitudlongitudeLargoUnidad: grados (°). Valor real = valor del campo/10⁷.Sí
10LatitudlatitudeLargoUnidad: grados (°). Valor real = valor del campo/10⁷.Sí
11Tipo de altura realheight_typeEntero1: Altitud relativa al punto de despegue (ALT)
2: Altitud relativa a la posición actual (AGL)
Sí
12Altura realheightEnteroUnidad: metros (m). El valor real = valor del campo/10.Sí
13AltitudaltitudeEnteroUnidad: metros (m). El valor real = valor del campo/10.Sí
14Velocidad verticalvsEnteroUnidad: m/s. El valor real = valor del campo/10.Sí
15Velocidad horizontal de vuelogsEnteroUnidad: m/s. El valor real = valor del campo/10.Sí
16RumbocourseEnteroÁngulo en el sentido de las agujas del reloj desde el norte verdadero (0°-360°). Valor real = valor del campo/10. Rellenar con –999 cuando no haya datos disponibles.Sí
17Estado de la transmisión RIDremote_id_statusEntero0: Desactivado  
1: Activado
Sí

Ejemplo de cuerpo:

{
	"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. Cuerpo de respuesta

Nombre de campoCódigo de campoTipo de datosDescripción
Código de estadocodeCadena0 = success (éxito), 400 = Error
Descripción del resultadoresultCadenaDescripción detallada (por ejemplo, success)

Ejemplo de respuesta:

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