Gestión del espacio aéreo
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 campo | Código de campo | Tipo de datos | Descripción | Obligatorio |
|---|---|---|---|---|
| Fuente de datos | source | Entero | 1: Información proporcionada directamente por la aeronave2: Información proporcionada por el sistema del fabricante3: Información proporcionada por el módulo complementario4: Información proporcionada por el dispositivo de recopilación | Sí |
| Plataforma de informes | platform | Cadena | Nombre de la plataforma (p. ej., DJI Fly) | Sí |
| Versión del programa | programVersion | Cadena | Número de versión (p. ej., version 1.0) | Sí |
| Firma | signature | Cadena | La firma de solicitud generada | Sí |
| Marca de tiempo de la solicitud | timestamp | Cadena | Marca de tiempo Unix de la solicitud (en segundos) | Sí |
| Nonce | nonce | Cadena | Una cadena generada aleatoriamente | Sí |
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 solicitudtimestamp)nonce: Cadena aleatoria (del encabezado de la solicitudnonce)body: Datos en bruto en bytes del cuerpo de la solicitud (p. ej., elRequestBodyserializado en JSON)
Reglas de firma
- Concatena
timestamp,nonceybodyen una sola cadena en ese orden (sin separadores). - Utiliza el algoritmo HMAC-SHA256 con el
tokencomo clave para cifrar la cadena concatenada. - 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
- El servidor recupera lo siguiente del encabezado de la solicitud:
signature: La firma generada por el clientetimestamp: La marca de tiempo de la solicitudnonce: La cadena aleatoria
- El servidor vuelve a generar una firma utilizando los mismos parámetros y la clave secreta
appKey. - 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
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
app_id | string | Sí | Identificador exclusivo de la aplicación. Actualmente se establece en el valor predeterminado. |
flight_hub_organization_id | string | Sí | ID de organización de FlightHub del usuario |
paths | FlightPath[] | 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 campo | Código de campo | Tipo de datos | Descripción | Obligatorio |
|---|---|---|---|---|---|
| 1 | ID de registro de vuelo | order_id | Cadena | Formato: 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í |
| 2 | Número de serie de la aeronave | sn | Cadena | Número de serie de producción de la aeronave del fabricante | Sí |
| 3 | Estado de vuelo | flight_status | Cadena | TakeOff: punto de despegue, Inflight: en vuelo, Land: punto de aterrizaje | Sí |
| 4 | Código de crédito social unificado | manufacturer_id | Cadena | El código unificado de crédito social del fabricante. | Sí |
| 5 | Número de registro con nombre real de la CAAC | uas_id | Cadena | Si no hay número de registro, utiliza el valor predeterminado UAS-DEFAULT. | Sí |
| 6 | Marca de tiempo actual | time_stamp | Cadena | Hora UTC+8, formato: yyyyMMddHHmmss. Ejemplo: 20240124095001 | Sí |
| 7 | Modelo de producto | uas_model | Cadena | Una combinación de letras, números y/o símbolos. | Sí |
| 8 | Tipo de sistema de coordenadas | coordinate | Entero | 1: WGS-842: CGCS20003: GLONASS-PZ90 | Sí |
| 9 | Longitud | longitude | Largo | Unidad: grados (°). Valor real = valor del campo/10⁷. | Sí |
| 10 | Latitud | latitude | Largo | Unidad: grados (°). Valor real = valor del campo/10⁷. | Sí |
| 11 | Tipo de altura real | height_type | Entero | 1: Altitud relativa al punto de despegue (ALT)2: Altitud relativa a la posición actual (AGL) | Sí |
| 12 | Altura real | height | Entero | Unidad: metros (m). El valor real = valor del campo/10. | Sí |
| 13 | Altitud | altitude | Entero | Unidad: metros (m). El valor real = valor del campo/10. | Sí |
| 14 | Velocidad vertical | vs | Entero | Unidad: m/s. El valor real = valor del campo/10. | Sí |
| 15 | Velocidad horizontal de vuelo | gs | Entero | Unidad: m/s. El valor real = valor del campo/10. | Sí |
| 16 | Rumbo | course | Entero | Á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í |
| 17 | Estado de la transmisión RID | remote_id_status | Entero | 0: 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 campo | Código de campo | Tipo de datos | Descripción |
|---|---|---|---|
| Código de estado | code | Cadena | 0 = success (éxito), 400 = Error |
| Descripción del resultado | result | Cadena | Descripción detallada (por ejemplo, success) |
Ejemplo de respuesta:
{
"code": "0",
"result": "success"
}