Управление воздушным пространством
Описание функции
После включения отправки данных о воздушном пространстве в реальном времени вы можете получить URL вебхука и токен шифрования у вашего поставщика услуг. После их ввода и сохранения API FlightHub сможет отправлять данные дрона в реальном времени сторонним сервисам. Ниже приведено руководство по интеграции для сторонних поставщиков услуг.
Руководство по интеграции
Протокол отправки данных
1. Заголовок запроса
| Название поля | Код поля | Тип данных | Описание | Требуется |
|---|---|---|---|---|
| Источник данных | source | Целое число | 1: Передано напрямую дроном2: Передано системой производителя3: Передано дополнительным модулем4: Передано устройством сбора данных | Да |
| Платформа отправки | platform | Строка | Название платформы (например, DJI Fly) | Да |
| Версия программы | programVersion | Строка | Номер версии (например, version 1.0) | Да |
| Подпись | signature | Строка | Сгенерированная подпись запроса | Да |
| Временная метка запроса | timestamp | Строка | Временная метка Unix для запроса (в секундах) | Да |
| Nonce | nonce | Строка | Случайно сгенерированная строка | Да |
Процесс генерации подписи
Входные параметры
token: Ключ приложения (предоставляется интегрированным поставщиком услуг и настраивается пользователем в FlightHub 2). Должен содержать от 32 до 64 символов и включать как минимум три из следующих типов: буквы, цифры и специальные символы.timestamp: Временная метка запроса (из заголовка запросаtimestamp)nonce: Случайная строка (из заголовка запросаnonce)body: Исходные байтовые данные тела запроса (например,RequestBody, сериализованный в JSON)
Правила формирования подписи
- Объедините
timestamp,nonceиbodyв одну строку именно в этом порядке (без разделителей). - Используйте алгоритм HMAC-SHA256, где в качестве ключа применяется
токен, чтобы зашифровать объединенную строку. - Преобразуйте результат шифрования в шестнадцатеричную строку в нижнем регистре.
Реализация кода на 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))
}
Процесс проверки подписи
Логика проверки
- Сервер получает из заголовка запроса следующие данные:
signature: Подпись, сгенерированная клиентомtimestamp: Временная метка запросаnonce: Случайная строка
- Сервер повторно генерирует подпись, используя те же параметры и секретный ключ
appKey. - Используйте сравнение за постоянное время, чтобы проверить, совпадает ли подпись клиента с подписью, сгенерированной сервером.
Реализация кода на 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_id | string | Да | Уникальный идентификатор приложения. В настоящее время по умолчанию используется значение default. |
flight_hub_organization_id | string | Да | Идентификатор организации FlightHub пользователя |
paths | FlightPath[] | Да | Массив данных маршрута полета (см. структуру объекта ниже) |
Описание структуры 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-842: CGCS20003: GLONASS-PZ90 | Да |
| 9 | Долгота | longitude | Long | Единица измерения: градусы (°). Фактическое значение = значение поля / 10⁷. | Да |
| 10 | Широта | latitude | Long | Единица измерения: градусы (°). Фактическое значение = значение поля / 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 | Состояние трансляции RID | remote_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"
}