공역 관리

2026-09-20

기능 설명

실시간 공역 데이터 보고를 활성화하면 서비스 제공업체로부터 웹훅 URL과 암호화 토큰을 받을 수 있습니다. 입력하고 저장하면, FlightHub API는 실시간 기체 데이터를 제3자에게 푸시할 수 있습니다. 다음은 타사 서비스 제공업체를 위한 통합 가이드입니다.

통합 가이드

데이터 보고 프로토콜

1. 요청 헤더

필드 이름필드 코드데이터 유형설명필수
데이터 소스source정수1: 기체에서 직접 보고
2: 제조업체 시스템에서 보고
3: 추가 모듈에서 보고
4: 수집 기기에서 보고
예
보고 플랫폼platform문자열플랫폼 이름(예: DJI Fly)예
프로그램 버전programVersion문자열버전 번호(예: version 1.0)예
서명signature문자열생성된 요청 서명예
요청 타임스탬프timestamp문자열요청 Unix 타임스탬프(초)예
논스nonce문자열무작위로 생성된 문자열예
서명 생성 프로세스

입력 매개변수

  • token: 애플리케이션 키(통합 서비스 제공업체가 제공하며, FlightHub 2에서 사용자가 구성함). 32~64자 길이여야 하며, 문자, 숫자, 특수기호 중 최소 세 가지를 조합해야 합니다.
  • timestamp: 요청 타임스탬프(timestamp 요청 헤더에서 가져옴)
  • nonce: 무작위 문자열(nonce 요청 헤더에서 가져옴)
  • body: 요청 본문의 원시 바이트 데이터(예: JSON으로 직렬화된 RequestBody)

서명 규칙

  1. timestamp, nonce, body를 이 순서로 구분자 없이 하나의 문자열로 연결합니다.
  2. token을 키로 사용하는 HMAC-SHA256 알고리즘으로 연결된 문자열을 암호화합니다.
  3. 암호화된 결과를 소문자 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))
}
서명 검증 프로세스

검증 로직

  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예고유한 애플리케이션 식별자입니다. 현재 기본값으로 설정되어 있습니다.
flight_hub_organization_idstring예사용자의 FlightHub 조직 ID
pathsFlightPath[]예비행경로 데이터 배열(아래 객체 구조 참조)
FlightPathRecord 구조 설명

이 구조는 비행경로 포인트 데이터를 설명하는 데 사용됩니다. 다음은 각 필드의 상세 설명입니다.

번호필드 이름필드 코드데이터 유형설명필수
1비행 기록 IDorder_id문자열형식: 제조업체 시리얼 넘버(SN)-8자리 이륙 날짜(YYYYMMDD)-8자리 무작위 코드.
예: 1581F5FHD25G100C1SDN-20240320-owvGyLqe.
동일한 ID가 전체 비행 동안 사용됩니다.
예
2기체 시리얼 넘버sn문자열제조업체의 기체 생산 SN예
3비행 상태flight_status문자열TakeOff: 이륙 지점, Inflight: 비행 중, Land: 착륙 지점예
4통합 사회 신용 번호manufacturer_id문자열제조업체의 통합 사회 신용 번호입니다.예
5CAAC 실명 등록 번호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정수단위: 미터(m). 실제 값 = 필드 값 / 10.예
13고도altitude정수단위: 미터(m). 실제 값 = 필드 값 / 10.예
14수직 속도vs정수단위: m/s. 실제 값 = 필드 값 / 10.예
15수평 비행 속도gs정수단위: m/s. 실제 값 = 필드 값 / 10.예
16코스course정수진북에서 시계 방향 각도(0~360°). 실제 값 = 필드 값 / 10. 데이터가 없는 경우 -999로 채우십시오.예
17RID 방송 상태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"
}
Last Updated: