空域管理
機能説明
リアルタイム空域データ報告を有効にすると、サービスプロバイダーからWebhook URLと暗号化トークンを取得できます。それらを入力して保存すると、FlightHub APIは、リアルタイムの機体データをサードパーティにプッシュ送信できます。サードパーティのサービスプロバイダー向けの統合ガイドは、以下のとおりです。
統合ガイド
データ報告プロトコル
1. リクエストヘッダー
| フィールド名 | フィールドコード | データタイプ | 説明 | 必須 |
|---|---|---|---|---|
| データソース | source | 整数 | 1:機体から直接報告2:メーカーのシステムから報告3:アドオンモジュールから報告4:収集機器から報告 | はい |
| 報告プラットフォーム | platform | 文字列 | プラットフォーム名(例:DJI Fly) | はい |
| プログラムバージョン | programVersion | 文字列 | バージョン番号(例:version 1.0) | はい |
| 署名 | signature | 文字列 | 生成されたリクエスト署名 | はい |
| リクエストのタイムスタンプ | timestamp | 文字列 | リクエストのUnixタイムスタンプ(秒単位) | はい |
| ノンス | nonce | 文字列 | ランダムに生成された文字列 | はい |
署名生成プロセス
入力パラメーター
token:アプリケーションキー(統合サービスプロバイダーから提供され、FlightHub 2でユーザーが設定するものです)。32〜64文字で、英字・数字・特殊記号のうち3種類以上の組み合わせで構成されている必要があります。timestamp:リクエストのタイムスタンプ(timestampリクエストヘッダーから取得)nonce:ランダム文字列(nonceリクエストヘッダーから取得)body:リクエスト本文の生バイトデータ(例:JSON形式にシリアライズされたRequestBody)
署名ルール
timestamp、nonce、bodyを、その順番で(区切り文字なしで)1つの文字列に連結します。tokenをキーとしてHMAC-SHA256アルゴリズムを使用し、連結された文字列を暗号化します。- 暗号化された結果を小文字の16進数文字列に変換します。
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 | はい | 一意のアプリケーション識別子。現在はデフォルトに設定されています。 |
flight_hub_organization_id | string | はい | ユーザーのFlightHub組織ID |
paths | FlightPath[] | はい | 飛行経路データの配列(下記のオブジェクト構造を参照してください) |
FlightPathRecord構造の説明
この構造は飛行経路ポイントデータを記述するために使用されます。以下は各フィールドの詳細説明です。
| 番号 | フィールド名 | フィールドコード | データタイプ | 説明 | 必須 |
|---|---|---|---|---|---|
| 1 | 飛行記録ID | order_id | 文字列 | 形式:メーカーシリアル番号(sn)-8桁の離陸日(YYYYMMDD)-8桁のランダムコード。例: 1581F5FHD25G100C1SDN-20240320-owvGyLqe。飛行全体を通して同じIDが使用されます。 | はい |
| 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 | 整数 | 単位:メートル(m)。実際の値=フィールド値/10。 | はい |
| 13 | 高度 | altitude | 整数 | 単位:メートル(m)。実際の値=フィールド値/10。 | はい |
| 14 | 垂直速度 | vs | 整数 | 単位:m/s。実際の値=フィールド値/10。 | はい |
| 15 | 水平飛行速度 | gs | 整数 | 単位:m/s。実際の値=フィールド値/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 | 文字列 | 詳細な説明(例:成功) |
応答の例:
{
"code": "0",
"result": "success"
}