Управление воздушным пространством

2026-09-20

Описание функции

После включения отправки данных о воздушном пространстве в реальном времени вы можете получить URL вебхука и токен шифрования у вашего поставщика услуг. После их ввода и сохранения API FlightHub сможет отправлять данные дрона в реальном времени сторонним сервисам. Ниже приведено руководство по интеграции для сторонних поставщиков услуг.

Руководство по интеграции

Протокол отправки данных

1. Заголовок запроса

Название поляКод поляТип данныхОписаниеТребуется
Источник данныхsourceЦелое число1: Передано напрямую дроном
2: Передано системой производителя
3: Передано дополнительным модулем
4: Передано устройством сбора данных
Да
Платформа отправкиplatformСтрокаНазвание платформы (например, DJI Fly)Да
Версия программыprogramVersionСтрокаНомер версии (например, version 1.0)Да
ПодписьsignatureСтрокаСгенерированная подпись запросаДа
Временная метка запросаtimestampСтрокаВременная метка Unix для запроса (в секундах)Да
NoncenonceСтрокаСлучайно сгенерированная строкаДа
Процесс генерации подписи

Входные параметры

  • token: Ключ приложения (предоставляется интегрированным поставщиком услуг и настраивается пользователем в FlightHub 2). Должен содержать от 32 до 64 символов и включать как минимум три из следующих типов: буквы, цифры и специальные символы.
  • timestamp: Временная метка запроса (из заголовка запроса timestamp)
  • nonce: Случайная строка (из заголовка запроса nonce)
  • body: Исходные байтовые данные тела запроса (например, RequestBody, сериализованный в JSON)

Правила формирования подписи

  1. Объедините timestamp, nonce и body в одну строку именно в этом порядке (без разделителей).
  2. Используйте алгоритм HMAC-SHA256, где в качестве ключа применяется токен, чтобы зашифровать объединенную строку.
  3. Преобразуйте результат шифрования в шестнадцатеричную строку в нижнем регистре.

Реализация кода на 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))
}
Процесс проверки подписи

Логика проверки

  1. Сервер получает из заголовка запроса следующие данные:
    • signature: Подпись, сгенерированная клиентом
    • timestamp: Временная метка запроса
    • nonce: Случайная строка
  2. Сервер повторно генерирует подпись, используя те же параметры и секретный ключ appKey.
  3. Используйте сравнение за постоянное время, чтобы проверить, совпадает ли подпись клиента с подписью, сгенерированной сервером.

Реализация кода на 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. Тело запроса

Формат JSON

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

Описания полей

ПолеТипОбязательноОписание
app_idstringДаУникальный идентификатор приложения. В настоящее время по умолчанию используется значение default.
flight_hub_organization_idstringДаИдентификатор организации FlightHub пользователя
pathsFlightPath[]ДаМассив данных маршрута полета (см. структуру объекта ниже)
Описание структуры FlightPathRecord

Эта структура используется для описания данных точек маршрута полета. Ниже приведено подробное описание полей:

№Название поляКод поляТип данныхОписаниеОбязательно
1Идентификатор записи полетаorder_idСтрокаФормат: серийный номер производителя (sn)-8-значная дата взлета (YYYYMMDD)-8-значный случайный код.
Пример: 1581F5FHD25G100C1SDN-20240320-owvGyLqe.
Один и тот же идентификатор используется на протяжении всего полета.
Да
2Серийный номер дронаsnСтрокаПроизводственный серийный номер дрона производителяДа
3Состояние полетаflight_statusСтрокаTakeOff: точка взлета, Inflight: в полете, Land: точка посадкиДа
4Единый код общественной кредитоспособностиmanufacturer_idСтрокаЕдиный код общественной кредитоспособности производителя.Да
5Номер регистрации CAAC по реальному имениuas_idСтрокаЕсли регистрационный номер отсутствует, используйте значение по умолчанию UAS-DEFAULT.Да
6Текущая временная меткаtime_stampСтрокаВремя UTC+8, формат: yyyyMMddHHmmss. Пример: 20240124095001Да
7Модель изделияuas_modelСтрокаКомбинация букв, цифр и/или символов.Да
8Тип системы координатcoordinateЦелое число1: WGS-84
2: CGCS2000
3: GLONASS-PZ90
Да
9ДолготаlongitudeLongЕдиница измерения: градусы (°). Фактическое значение = значение поля / 10⁷.Да
10ШиротаlatitudeLongЕдиница измерения: градусы (°). Фактическое значение = значение поля / 10⁷.Да
11Тип истинной высотыheight_typeЦелое число1: Высота относительно точки взлета (ALT)
2: Высота относительно текущего положения (AGL)
Да
12Истинная высотаheightЦелое числоЕдиница измерения: метры (м). Фактическое значение = значение поля / 10.Да
13ВысотаaltitudeЦелое числоЕдиница измерения: метры (м). Фактическое значение = значение поля / 10.Да
14Вертикальная скоростьvsЦелое числоЕдиница измерения: м/с. Фактическое значение = значение поля / 10.Да
15Горизонтальная скорость полетаgsЦелое числоЕдиница измерения: м/с. Фактическое значение = значение поля / 10.Да
16КурсcourseЦелое числоУгол по часовой стрелке относительно истинного севера (0°-360°). Фактическое значение = значение поля / 10. Укажите -999, если данные отсутствуют.Да
17Состояние трансляции RIDremote_id_statusЦелое число0: Отключено  
1: Включено
Да

Пример тела запроса:

{
	"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. Тело ответа

Название поляКод поляТип данныхОписание
Код состоянияcodeСтрока0 = Успешно, 400 = Сбой
Описание результатаresultСтрокаПодробное описание (например, success)

Пример ответа:

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