cndroneid.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. /*
  2. Copyright (C) 2019 Intel Corporation
  3. SPDX-License-Identifier: Apache-2.0
  4. Open Drone ID C Library
  5. Maintainer:
  6. Gabriel Cox
  7. gabriel.c.cox@intel.com
  8. */
  9. /*整体来看国标是开源标准的阉割板 系统报文略有区别 缺少认证报文、操作源ID识别报文*/
  10. /*民航轻微小型无人驾驶航空器试运行*/
  11. #pragma once
  12. #include <stdint.h>
  13. #include <string.h>
  14. #define CNDID_MESSAGE_SIZE 25 // 单报文字节大小
  15. #define CNDID_ID_SIZE 20 // USA ID 长度
  16. #define CNDID_STR_SIZE 23 // 描述字符串长度
  17. #define CNDID_PROTOCOL_VERSION 1 // UAS 报文版本
  18. #ifndef CNDID_BASIC_ID_MAX_MESSAGES
  19. #define CNDID_BASIC_ID_MAX_MESSAGES 2 // 可手动设置ID个数
  20. #endif
  21. #if (CNDID_BASIC_ID_MAX_MESSAGES < 1) || (CNDID_BASIC_ID_MAX_MESSAGES > 5)
  22. #error "CNDID_BASIC_ID_MAX_MESSAGES must be between 1 and 5."
  23. #endif
  24. #define CNDID_PACK_MAX_MESSAGES 10 // 最多打包10条报文
  25. #define CNDID_SUCCESS 0
  26. #define CNDID_FAIL 1
  27. #define CN_MIN_DIR 0 // Minimum direction
  28. #define CN_MAX_DIR 360 // Maximum direction
  29. #define CN_INV_DIR 361 // Invalid direction
  30. #define CN_MIN_SPEED_H 0 // Minimum speed horizontal
  31. #define CN_MAX_SPEED_H 254.25f // Maximum speed horizontal
  32. #define CN_INV_SPEED_H 255 // Invalid speed horizontal
  33. #define CN_MIN_SPEED_V (-62) // Minimum speed vertical
  34. #define CN_MAX_SPEED_V 62 // Maximum speed vertical
  35. #define CN_INV_SPEED_V 63 // Invalid speed vertical
  36. #define CN_MIN_LAT (-90) // Minimum latitude
  37. #define CN_MAX_LAT 90 // Maximum latitude
  38. #define CN_MIN_LON (-180) // Minimum longitude
  39. #define CN_MAX_LON 180 // Maximum longitude
  40. #define CN_MIN_ALT (-1000) // Minimum altitude
  41. #define CN_MAX_ALT 31767.5f// Maximum altitude
  42. #define CN_INV_ALT CN_MIN_ALT // Invalid altitude
  43. #define CN_MAX_TIMESTAMP (60 * 60)
  44. #define CN_INV_TIMESTAMP 0xFFFF // Invalid, No Value or Unknown Timestamp
  45. #define CN_MAX_AREA_RADIUS 2550
  46. #define CN_COORD_TYPE 0
  47. // #define COORDTYPE 1
  48. // #define COORDTYPE 2
  49. // #define COORDTYPE 3
  50. // 消息类型枚举
  51. typedef enum CNDID_messagetype {
  52. CNDID_MESSAGETYPE_BASIC_ID = 0,
  53. CNDID_MESSAGETYPE_LOCATION = 1,
  54. // CNDID_MESSAGETYPE_RVS1 = 2,
  55. CNDID_MESSAGETYPE_SELF_ID = 3,
  56. CNDID_MESSAGETYPE_SYSTEM = 4,
  57. // CNDID_MESSAGETYPE_RVS2 = 5,
  58. CNDID_MESSAGETYPE_PACKED = 0xF,
  59. CNDID_MESSAGETYPE_INVALID = 0xFF,
  60. } CNDID_MessageType_t;
  61. // 每种消息类型都必须维护其自身的消息uint8_t计数器。
  62. // 如果消息内容发生变化,该计数器必须递增。对于相同消息内容的重复传输,
  63. // 计数器的递增是可选的。
  64. typedef enum CNDID_msg_counter {
  65. CNDID_MSG_COUNTER_BASIC_ID = 0,
  66. CNDID_MSG_COUNTER_LOCATION = 1,
  67. // CNDID_MSG_COUNTER_RVS1 = 2,
  68. CNDID_MSG_COUNTER_SELF_ID = 3,
  69. CNDID_MSG_COUNTER_SYSTEM = 4,
  70. // CNDID_MSG_COUNTER_RVS2 = 5,
  71. CNDID_MSG_COUNTER_PACKED = 6,
  72. CNDID_MSG_COUNTER_AMOUNT = 7,
  73. } CNDID_MsgCounter_t;
  74. /***************************************0x0 ID报文*******************************************/
  75. // ID类型 ASTMF3411-22a标准的表5
  76. typedef enum CNDID_idtype {
  77. CNDID_IDTYPE_NONE = 0,
  78. CNDID_IDTYPE_SERIAL_NUMBER = 1,
  79. CNDID_IDTYPE_CAA_REGISTRATION_ID = 2, // 民航局
  80. CNDID_IDTYPE_UTM_ASSIGNED_UUID = 3, // 无人机系统(UAS,即无人驾驶航空器系统)交通管理
  81. CNDID_IDTYPE_SPECIFIC_SESSION_ID = 4, // 确切的id类型由UASID的第一个字节指定,这些类型
  82. // 这些值由国际民用航空组织(ICAO)管理。0 被保留。1 - 224 由国际民用航空组织(ICAO)管理。
  83. // 225 - 255 仅可用于私人实验用途
  84. // 5 to 15 reserved
  85. } CNDID_IDType_t;
  86. // UA 类型
  87. typedef enum CNDID_uatype {
  88. CNDID_UATYPE_NONE = 0,
  89. CNDID_UATYPE_AEROPLANE = 1, // Fixed wing
  90. CNDID_UATYPE_HELICOPTER_OR_MULTIROTOR = 2,
  91. CNDID_UATYPE_GYROPLANE = 3,
  92. CNDID_UATYPE_HYBRID_LIFT = 4, // Fixed wing aircraft that can take off vertically
  93. CNDID_UATYPE_ORNITHOPTER = 5,
  94. CNDID_UATYPE_GLIDER = 6,
  95. CNDID_UATYPE_KITE = 7,
  96. CNDID_UATYPE_FREE_BALLOON = 8,
  97. CNDID_UATYPE_CAPTIVE_BALLOON = 9,
  98. CNDID_UATYPE_AIRSHIP = 10, // Such as a blimp
  99. CNDID_UATYPE_FREE_FALL_PARACHUTE = 11, // Unpowered
  100. CNDID_UATYPE_ROCKET = 12,
  101. CNDID_UATYPE_TETHERED_POWERED_AIRCRAFT = 13,
  102. CNDID_UATYPE_GROUND_OBSTACLE = 14,
  103. CNDID_UATYPE_OTHER = 15,
  104. } CNDID_UAType_t;
  105. typedef struct CNDID_BasicID_data {
  106. CNDID_UAType_t UAType;
  107. CNDID_IDType_t IDType;
  108. char UASID[CNDID_ID_SIZE+1]; // 额外的字节用于在标准形式中容纳空终止符。用NULL填充未使用的空间
  109. } CNDID_BasicID_data;
  110. /**
  111. * @Name CNDID_PackedStructs
  112. * 为广播准备的压缩数据结构
  113. * 最好不要直接访问这些数据。请使用编码器/解码器。
  114. */
  115. typedef struct __attribute__((__packed__)) CNDID_BasicID_encoded {
  116. // Byte 0 [MessageType][ProtoVersion] -- must define LSb first
  117. uint8_t ProtoVersion: 4;
  118. uint8_t MessageType : 4;
  119. // Byte 1 [IDType][UAType] -- must define LSb first
  120. uint8_t UAType: 4;
  121. uint8_t IDType: 4;
  122. // Bytes 2-21
  123. char UASID[CNDID_ID_SIZE];
  124. // 22-23
  125. char Reserved[3];
  126. } CNDID_BasicID_encoded;
  127. /***************************************0x1 向量报文*******************************************/
  128. // 状态 ASTMF3411-22a标准的表6
  129. typedef enum CNDID_status {
  130. CNDID_STATUS_UNDECLARED = 0,
  131. CNDID_STATUS_GROUND = 1,
  132. CNDID_STATUS_AIRBORNE = 2,
  133. CNDID_STATUS_EMERGENCY = 3,
  134. CNDID_STATUS_REMOTE_ID_SYSTEM_FAILURE = 4,
  135. // 3 to 15 reserved
  136. } CNDID_Status_t;
  137. // 高度类型
  138. typedef enum CNDID_Height_reference {
  139. CNDID_HEIGHT_REF_OVER_TAKEOFF = 0,
  140. CNDID_HEIGHT_REF_OVER_GROUND = 1,
  141. } CNDID_HeightReference_t;
  142. // 水平精度
  143. typedef enum CNDID_Horizontal_accuracy {
  144. CNDID_HOR_ACC_UNKNOWN = 0,
  145. CNDID_HOR_ACC_10NM = 1, // Nautical Miles. 18.52 km
  146. CNDID_HOR_ACC_4NM = 2, // 7.408 km
  147. CNDID_HOR_ACC_2NM = 3, // 3.704 km
  148. CNDID_HOR_ACC_1NM = 4, // 1.852 km
  149. CNDID_HOR_ACC_0_5NM = 5, // 926 m
  150. CNDID_HOR_ACC_0_3NM = 6, // 555.6 m
  151. CNDID_HOR_ACC_0_1NM = 7, // 185.2 m
  152. CNDID_HOR_ACC_0_05NM = 8, // 92.6 m
  153. CNDID_HOR_ACC_30_METER = 9,
  154. CNDID_HOR_ACC_10_METER = 10,
  155. CNDID_HOR_ACC_3_METER = 11,
  156. CNDID_HOR_ACC_1_METER = 12,
  157. // 13 to 15 reserved
  158. } CNDID_HorizontalAccuracy_t;
  159. // 垂直精度
  160. typedef enum CNDID_Vertical_accuracy {
  161. CNDID_VER_ACC_UNKNOWN = 0,
  162. CNDID_VER_ACC_150_METER = 1,
  163. CNDID_VER_ACC_45_METER = 2,
  164. CNDID_VER_ACC_25_METER = 3,
  165. CNDID_VER_ACC_10_METER = 4,
  166. CNDID_VER_ACC_3_METER = 5,
  167. CNDID_VER_ACC_1_METER = 6,
  168. // 7 to 15 reserved
  169. } CNDID_VerticalAccuracy_t;
  170. // 速度精度
  171. typedef enum CNDID_Speed_accuracy {
  172. CNDID_SPEED_ACC_UNKNOWN = 0,
  173. CNDID_SPEED_ACC_10_METERS_PER_SECOND = 1,
  174. CNDID_SPEED_ACC_3_METERS_PER_SECOND = 2,
  175. CNDID_SPEED_ACC_1_METERS_PER_SECOND = 3,
  176. CNDID_SPEED_ACC_0_3_METERS_PER_SECOND = 4,
  177. // 5 to 15 reserved
  178. } CNDID_SpeedAccuracy_t;
  179. // 时间戳精度
  180. typedef enum CNDID_Timestamp_accuracy {
  181. CNDID_TIME_ACC_UNKNOWN = 0,
  182. CNDID_TIME_ACC_0_1_SECOND = 1,
  183. CNDID_TIME_ACC_0_2_SECOND = 2,
  184. CNDID_TIME_ACC_0_3_SECOND = 3,
  185. CNDID_TIME_ACC_0_4_SECOND = 4,
  186. CNDID_TIME_ACC_0_5_SECOND = 5,
  187. CNDID_TIME_ACC_0_6_SECOND = 6,
  188. CNDID_TIME_ACC_0_7_SECOND = 7,
  189. CNDID_TIME_ACC_0_8_SECOND = 8,
  190. CNDID_TIME_ACC_0_9_SECOND = 9,
  191. CNDID_TIME_ACC_1_0_SECOND = 10,
  192. CNDID_TIME_ACC_1_1_SECOND = 11,
  193. CNDID_TIME_ACC_1_2_SECOND = 12,
  194. CNDID_TIME_ACC_1_3_SECOND = 13,
  195. CNDID_TIME_ACC_1_4_SECOND = 14,
  196. CNDID_TIME_ACC_1_5_SECOND = 15,
  197. } CNDID_TimeStampAccuracy_t;
  198. typedef struct CNDID_Location_data {
  199. CNDID_Status_t Status; // 状态
  200. float Direction; // 度数。0 ≤ x < 360。基于真北的航线航向。无效、无值或未知:361度
  201. float SpeedHorizontal; // 米/秒。仅为正值。无效、无值或未知:255米/秒。如果速度≥254.25米/秒:254.25米/秒
  202. float SpeedVertical; // 米/秒。无效、无值或未知:63米/秒。如果速度≥62米/秒:62米/秒
  203. double Latitude; // 无效、无值或未知:0度(纬度/经度均为0度)
  204. double Longitude; // 无效、无值或未知:0度(纬度/经度均为0度)
  205. float AltitudeBaro; // 米(参考值29.92英寸汞柱,1013.24毫巴)。无效、无值或未知:-1000米
  206. float AltitudeGeo; // 米(WGS84 - HAE)。无效、无值或未知:-1000米
  207. CNDID_HeightReference_t HeightType;
  208. float Height; // 米。无效、无值或未知:-1000米
  209. CNDID_HorizontalAccuracy_t HorizAccuracy;
  210. CNDID_VerticalAccuracy_t VertAccuracy;
  211. CNDID_VerticalAccuracy_t BaroAccuracy;
  212. CNDID_SpeedAccuracy_t SpeedAccuracy;
  213. CNDID_TimeStampAccuracy_t TSAccuracy;
  214. float TimeStamp; // 相对于UTC的整点过后的秒数。无效、无值或未知:0xFFFF
  215. } CNDID_Location_data;
  216. // byte 0 是报头
  217. typedef struct __attribute__((__packed__)) CNDID_Location_encoded {
  218. // Byte 0 [MessageType][ProtoVersion] -- must define LSb first
  219. uint8_t ProtoVersion: 4;
  220. uint8_t MessageType : 4;
  221. // Byte 1 -- 必须先定义 低位
  222. uint8_t SpeedMult: 1;
  223. uint8_t EWDirection: 1;
  224. uint8_t HeightType: 1;
  225. uint8_t Reserved: 1;
  226. uint8_t Status: 4;
  227. // Bytes 2-17
  228. uint8_t Direction;
  229. uint8_t SpeedHorizontal;
  230. int8_t SpeedVertical;
  231. int32_t Latitude;
  232. int32_t Longitude;
  233. uint16_t AltitudeBaro;
  234. uint16_t AltitudeGeo;
  235. uint16_t Height;
  236. // Byte 19 [VertAccuracy][HorizAccuracy] -- must define LSb first 国标的PDF这里有错误
  237. uint8_t HorizAccuracy:4;
  238. uint8_t VertAccuracy:4;
  239. // Byte 20 [BaroAccuracy][SpeedAccuracy] -- must define LSb first
  240. uint8_t SpeedAccuracy:4;
  241. uint8_t BaroAccuracy:4;
  242. // Byte 21-22
  243. uint16_t TimeStamp;
  244. // Byte 23 [Reserved2][TSAccuracy] -- must define LSb first
  245. uint8_t TSAccuracy:4;
  246. uint8_t Reserved2:4;
  247. // Byte 24
  248. char Reserved3;
  249. } CNDID_Location_encoded;
  250. /***************************************0x3 运行描述报文*******************************************/
  251. // 行为描述 0x3报文 可选
  252. typedef enum {
  253. CNDID_OPERATOR_ID = 0, // 文字描述
  254. // 1 to 200 reserved
  255. // 201 to 255 available for private use
  256. } CNDID_DescType_t;
  257. typedef struct CNDID_SelfID_data {
  258. CNDID_DescType_t DescType;
  259. char Desc[CNDID_STR_SIZE+1]; // 额外的字节用于在标准形式中容纳空终止符。用NULL填充未使用的空间。
  260. } CNDID_SelfID_data;
  261. // 字节0是报文头
  262. typedef struct __attribute__((__packed__)) CNDID_SelfID_encoded {
  263. // Byte 0 [MessageType][ProtoVersion] -- must define LSb first
  264. uint8_t ProtoVersion: 4;
  265. uint8_t MessageType : 4;
  266. // Byte 1
  267. uint8_t DescType;
  268. // Byte 2-24
  269. char Desc[CNDID_STR_SIZE];
  270. } CNDID_SelfID_encoded;
  271. /***************************************0x4 系统报文*******************************************/
  272. // 坐标系类型
  273. typedef enum {
  274. CNDID_COORD_TYPE_WGS84 = 0x00, // 00:WGS-84坐标系(GPS/北斗通用,国标默认)
  275. CNDID_COORD_TYPE_GCJ02 = 0x01, // 01:GCJ-02火星坐标系(中国国测局加密)
  276. CNDID_COORD_TYPE_BD09 = 0x02, // 10:BD-09坐标系(北斗专用)
  277. CNDID_COORD_TYPE_CGCS2000 = 0x03, // 11:CGCS2000国家大地坐标系(中国新一代)
  278. } CNDID_CoordType_t;
  279. // 等级分类归属区域
  280. typedef enum {
  281. CNDID_CLASSIFICATION_TYPE_UNDECLARED = 0,
  282. CNDID_CLASSIFICATION_TYPE_EU = 1, // European Union
  283. CNDID_CLASSIFICATION_TYPE_CN = 2, // 中国
  284. // 2 to 7 reserved
  285. } CNDID_classification_type_t;
  286. // 控制站位置类型
  287. typedef enum CNDID_operator_location_type {
  288. CNDID_OPERATOR_LOCATION_TYPE_TAKEOFF = 0, // Takeoff location and altitude
  289. CNDID_OPERATOR_LOCATION_TYPE_LIVE_GNSS = 1, // Dynamic/Live location and altitude
  290. CNDID_OPERATOR_LOCATION_TYPE_FIXED = 2, // Fixed location and altitude
  291. // 3 to 255 reserved
  292. } CNDID_operator_location_type_t;
  293. // UA运行类别定义
  294. typedef enum {
  295. CNDID_CATA_CN_UNDEFINED = 0x00, // 未定义
  296. CNDID_CATA_CN_OPEN = 0x01, // 开放类
  297. CNDID_CATA_CN_SPECIAL = 0x02, // 特许类
  298. CNDID_CATA_CN_CERTIFIED = 0x03 // 审定类
  299. } CNDID_category_CN_t;
  300. // 无人机等级
  301. typedef enum {
  302. CNDID_CLASS_CN_MICRO = 0, // 微型无人机
  303. CNDID_CLASS_CN_LIGHT = 1, // 轻型无人机
  304. CNDID_CLASS_CN_SMALL = 2, // 小型无人机
  305. CNDID_CLASS_CN_IDF_OTHER = 3, // 可识别的其他类型
  306. } CNDID_class_CN_t;
  307. typedef struct CNDID_System_data {
  308. CNDID_CoordType_t Coord_Type; // 坐标系类型 多出来的 国际是保留的
  309. CNDID_classification_type_t Classification_Type; // 所属区域
  310. CNDID_operator_location_type_t OperatorLocationType; // 控制站位置类型
  311. double OperatorLatitude; // 无效、无值或未知:0度(纬度/经度均为0度)
  312. double OperatorLongitude; // 无效、无值或未知:0度(纬度/经度均为0度)
  313. uint16_t AreaCount; // 默认值 1
  314. uint16_t AreaRadius; // 米。默认值为0
  315. float AreaCeiling; // 米。无效、无值或未知:-1000米
  316. float AreaFloor; // 米。无效、无值或未知:-1000米
  317. CNDID_category_CN_t CategoryCN; // 仅在ClassificationType = CNDID_CLASSIFICATION_TYPE_CN 时填写
  318. CNDID_class_CN_t ClassCN; // 仅在ClassificationType = CNDID_CLASSIFICATION_TYPE_CN 时填写
  319. float OperatorAltitudeGeo; // 米(WGS84-HAE)。无效、无值或未知:-1000米
  320. uint32_t Timestamp; // 相对于2019年1月1日世界标准时间/ Unix时间00:00:00
  321. } CNDID_System_data;
  322. // byte 0 是报头
  323. typedef struct __attribute__((__packed__)) CNDID_System_encoded {
  324. // Byte 0 [MessageType][ProtoVersion] -- must define LSb first
  325. uint8_t ProtoVersion: 4;
  326. uint8_t MessageType : 4;
  327. // Byte 1 -- must define LSb first
  328. uint8_t OperatorLocationType: 2;
  329. uint8_t ClassificationType : 3;
  330. uint8_t CoordType :2; // 坐标系类型
  331. uint8_t Reserved: 1;
  332. // Byte 2-9
  333. int32_t OperatorLatitude;
  334. int32_t OperatorLongitude;
  335. // Byte 10-16
  336. uint16_t AreaCount;
  337. uint8_t AreaRadius;
  338. uint16_t AreaCeiling;
  339. uint16_t AreaFloor;
  340. // Byte 17 [CategoryCN][ClassCN] -- must define LSb first
  341. uint8_t ClassCN: 4;
  342. uint8_t CategoryCN: 4;
  343. // Byte 18-23
  344. uint16_t OperatorAltitudeGeo;
  345. uint32_t Timestamp;
  346. // Byte 24
  347. char Reserved2;
  348. } CNDID_System_encoded;
  349. /***************************************0xF 打包报文*******************************************/
  350. /*
  351. * 从联合成员的任何结构部分访问前两个字段(即ProtoVersion和MessageType)都是安全的,
  352. *因为这些字段的声明是相同的,并且位于结构的开头部分。
  353. *ISO/IEC 9899:1999第6.5.2.3部分第5条及相关的示例3对此进行了规定。
  354. https://www.iso.org/standard/29237.html
  355. */
  356. typedef union CNDID_Message_encoded {
  357. uint8_t rawData[CNDID_MESSAGE_SIZE]; // 一份报文25字节
  358. CNDID_BasicID_encoded basicId;
  359. CNDID_Location_encoded location;
  360. CNDID_SelfID_encoded selfId;
  361. CNDID_System_encoded system;
  362. } CNDID_Message_encoded;
  363. typedef struct __attribute__((__packed__)) CNDID_MessagePack_encoded {
  364. // Byte 0 [MessageType][ProtoVersion] -- must define LSb first
  365. uint8_t ProtoVersion: 4;
  366. uint8_t MessageType : 4;
  367. // Byte 1 - 2
  368. uint8_t SingleMessageSize; // 每个报文长度
  369. uint8_t MsgPackSize; // 报文数量
  370. // Byte 3 - 227
  371. CNDID_Message_encoded Messages[CNDID_PACK_MAX_MESSAGES];
  372. } CNDID_MessagePack_encoded;
  373. typedef struct CNDID_MessagePack_data {
  374. uint8_t SingleMessageSize; // Must always be CNDID_MESSAGE_SIZE
  375. uint8_t MsgPackSize; // Number of messages in pack (NOT number of bytes)
  376. CNDID_Message_encoded Messages[CNDID_PACK_MAX_MESSAGES];
  377. } CNDID_MessagePack_data;
  378. /*********************************************************************************************/
  379. typedef struct CNDID_UAS_Data {
  380. CNDID_BasicID_data BasicID[CNDID_BASIC_ID_MAX_MESSAGES]; // 基础ID 2个ID报文???
  381. CNDID_Location_data Location; // 位置向量
  382. CNDID_SelfID_data SelfID; // 运行描述
  383. CNDID_System_data System; // 系统
  384. uint8_t BasicIDValid[CNDID_BASIC_ID_MAX_MESSAGES]; // 基础ID非法
  385. uint8_t LocationValid; // 位置非法
  386. uint8_t SelfIDValid; // 运行描述非法
  387. uint8_t SystemValid; // 系统非法
  388. } CNDID_UAS_Data;
  389. // API Calls
  390. void cndid_initBasicIDData(CNDID_BasicID_data *data);
  391. void cndid_initLocationData(CNDID_Location_data *data);
  392. void cndid_initSelfIDData(CNDID_SelfID_data *data);
  393. void cndid_initSystemData(CNDID_System_data *data);
  394. void cndid_initMessagePackData(CNDID_MessagePack_data *data);
  395. void cndid_initUasData(CNDID_UAS_Data *data);
  396. int encodeCNBasicIDMessage(CNDID_BasicID_encoded *outEncoded, CNDID_BasicID_data *inData);
  397. int encodeCNLocationMessage(CNDID_Location_encoded *outEncoded, CNDID_Location_data *inData);
  398. int encodeCNSelfIDMessage(CNDID_SelfID_encoded *outEncoded, CNDID_SelfID_data *inData);
  399. int encodeCNSystemMessage(CNDID_System_encoded *outEncoded, CNDID_System_data *inData);
  400. int encodeCNMessagePack(CNDID_MessagePack_encoded *outEncoded, CNDID_MessagePack_data *inData);
  401. int decodeCNBasicIDMessage(CNDID_BasicID_data *outData, CNDID_BasicID_encoded *inEncoded);
  402. int decodeCNLocationMessage(CNDID_Location_data *outData, CNDID_Location_encoded *inEncoded);
  403. int decodeCNSelfIDMessage(CNDID_SelfID_data *outData, CNDID_SelfID_encoded *inEncoded);
  404. int decodeCNSystemMessage(CNDID_System_data *outData, CNDID_System_encoded *inEncoded);
  405. int decodeCNMessagePack(CNDID_UAS_Data *uasData, CNDID_MessagePack_encoded *pack);
  406. int getCNBasicIDType(CNDID_BasicID_encoded *inEncoded, enum CNDID_idtype *idType);
  407. CNDID_MessageType_t decodeCNMessageType(uint8_t byte);
  408. CNDID_MessageType_t decodeCNDroneID(CNDID_UAS_Data *uas_data, uint8_t *msg_data);
  409. // Helper Functions
  410. CNDID_HorizontalAccuracy_t createCNEnumHorizontalAccuracy(float Accuracy);
  411. CNDID_VerticalAccuracy_t createCNEnumVerticalAccuracy(float Accuracy);
  412. CNDID_SpeedAccuracy_t createCNEnumSpeedAccuracy(float Accuracy);
  413. CNDID_TimeStampAccuracy_t createCNEnumTimestampAccuracy(float Accuracy);
  414. float decodeCNHorizontalAccuracy(CNDID_HorizontalAccuracy_t Accuracy);
  415. float decodeCNVerticalAccuracy(CNDID_VerticalAccuracy_t Accuracy);
  416. float decodeCNSpeedAccuracy(CNDID_SpeedAccuracy_t Accuracy);
  417. float decodeCNTimestampAccuracy(CNDID_TimeStampAccuracy_t Accuracy);
  418. // CN DroneID WiFi functions
  419. /**
  420. * cndid_message_build_pack - 组合消息并对cndid数据包进行编码
  421. * @UAS_Data:无人机的一般状态信息
  422. * @pack:要写入的缓冲区空间
  423. * @buflen:缓冲区空间的最大长度
  424. *
  425. * Returns length on success, < 0 on failure. @buf only contains a valid message
  426. * if the return code is >0
  427. */
  428. int cndid_message_build_pack(CNDID_UAS_Data *UAS_Data, uint8_t *pack, size_t buflen);
  429. /* cndid_wifi_build_nan_sync_beacon_frame - 创建一个NAN同步信标帧
  430. * 该帧应在NAN动作帧之前发送。
  431. * @mac:将发送NAN帧的wifi适配器的mac地址
  432. * @buf:指向将写入NAN的缓冲区空间的指针
  433. *
  434. * @buf_size:缓冲区的最大大小
  435. * Returns the packet length on success, or < 0 on error.
  436. */
  437. int cndid_wifi_build_nan_sync_beacon_frame(char *mac, uint8_t *buf, size_t buf_size);
  438. /* cndid_wifi_build_message_pack_nan_action_frame - 创建一个消息包
  439. * 包含来自无人机信息的每种类型的消息,将其放入一个NAN动作帧中。
  440. * @UAS_Data:无人机的一般状态信息
  441. * @mac:将发送NAN帧的WiFi适配器的mac地址
  442. * @send_counter:序列号,每次调用此函数时需递增
  443. * @buf:指向将写入NAN的缓冲区空间的指针
  444. * @buf_size:缓冲区的最大大小
  445. *
  446. * Returns the packet length on success, or < 0 on error.
  447. */
  448. int cndid_wifi_build_message_pack_nan_action_frame(CNDID_UAS_Data *UAS_Data, char *mac,
  449. uint8_t send_counter,
  450. uint8_t *buf, size_t buf_size);
  451. /* cndid_wifi_build_message_pack_beacon_frame - 创建一个消息包
  452. * 将来自无人机信息的每种类型的消息整合到一个信标帧中。
  453. * @UAS_Data:无人机的一般状态信息
  454. * @mac:将发送信标帧的WiFi适配器的MAC地址
  455. * @SSID:要发送的WiFi网络的服务集标识符
  456. * @SSID_len:服务集标识符字符串的字节长度
  457. * @interval_tu:WiFi时间单位中的信标间隔
  458. * @send_counter:序列号,每次调用此函数时需递增
  459. * @buf:指向将写入信标帧的缓冲区空间的指针
  460. * @buf_size:缓冲区的最大大小
  461. *
  462. * Returns the packet length on success, or < 0 on error.
  463. */
  464. int cndid_wifi_build_message_pack_beacon_frame(CNDID_UAS_Data *UAS_Data, char *mac,
  465. const char *SSID, size_t SSID_len,
  466. uint16_t interval_tu, uint8_t send_counter,
  467. uint8_t *buf, size_t buf_size);
  468. /* cndid_message_process_pack - 从cndid消息包中解码消息
  469. * @UAS_Data:无人机的一般状态信息
  470. * @pack:要从中读取的缓冲区空间
  471. * @buflen:缓冲区空间的长度
  472. *
  473. * Returns 0 on success
  474. */
  475. int cndid_message_process_pack(CNDID_UAS_Data *UAS_Data, uint8_t *pack, size_t buflen);
  476. /* cndid_wifi_receive_message_pack_nan_action_frame - 处理接收到的消息包
  477. * 将来自无人机信息的每种类型的消息转换为NAN动作帧
  478. * @UAS_Data:无人机的一般状态信息
  479. * @mac:将发送NAN帧的WiFi适配器的MAC地址
  480. * @buf:存储NAN的缓冲区空间指针
  481. * @buf_size:缓冲区的最大大小
  482. *
  483. * Returns 0 on success, or < 0 on error. Will fill 6 bytes into @mac.
  484. */
  485. int cndid_wifi_receive_message_pack_nan_action_frame(CNDID_UAS_Data *UAS_Data,
  486. char *mac, uint8_t *buf, size_t buf_size);
  487. #ifndef CNDID_DISABLE_PRINTF
  488. void PrintByteArray(uint8_t *byteArray, uint16_t asize, int spaced);
  489. void PrintBasicID_data(CNDID_BasicID_data *BasicID);
  490. void PrintLocation_data(CNDID_Location_data *Location);
  491. void PrintSelfID_data(CNDID_SelfID_data *SelfID);
  492. void PrintSystem_data(CNDID_System_data *System_data);
  493. #endif // CNDID_DISABLE_PRINTF