did_GB_2025.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. #pragma once
  2. #include <stdint.h>
  3. #include <stdbool.h>
  4. #include <string.h>
  5. #include <math.h>
  6. /************************** 标准编码规则宏定义(GB46750-2025表3) **************************/
  7. // 数据类型固定值(表1要求)
  8. #define PACKET_DATA_TYPE 0xFF
  9. // 版本号宏(标准要求:前3位固定001,后5位0~63,即V1.X)
  10. #define VERSION_MAJOR_FIXED 1 // 主版本固定为1(前3位001)
  11. #define VERSION_MINOR_FIXED 0
  12. #define VERSION_ENCODE ((((VERSION_MAJOR_FIXED) & 0x07) << 5) | ((VERSION_MINOR_FIXED) & 0x3F))
  13. #define VERSION_DECODE_MAJOR(ver) ((ver) >> 5) // 从编码值解码主版本
  14. #define VERSION_DECODE_MINOR(ver) ((ver) & 0x3F) // 从编码值解码从版本
  15. // 基础数据标识字节数(3字节),扩展标志位默认0(表2要求)
  16. #define BASE_DATA_FLAG_BYTES 3
  17. // 最大数据内容项字节数(1~200)(表1要求)
  18. #define MAX_CONTENT_BYTES 200
  19. // 字符串填充字符(NULL)(表3要求)
  20. #define FILL_CHAR '\0'
  21. // 经纬度放大倍数(×10^7)(表3要求)
  22. #define LAT_LON_SCALE 10000000LL
  23. // 大地高度/气压高度:(h+1000)×2,分辨率0.5m(表3要求)
  24. #define GEO_ALT_OFFSET 1000
  25. #define GEO_ALT_SCALE 2
  26. // 相对高度:(h+9000)×2,分辨率0.5m(表3要求)
  27. #define REL_ALT_OFFSET 9000
  28. #define REL_ALT_SCALE 2
  29. // 航迹角/地速放大倍数(×10),分辨率0.1°/0.1m/s(表3要求)
  30. #define ANGLE_SPEED_SCALE 10
  31. // 垂直速度放大倍数(×2),分辨率0.5m/s(表3要求)
  32. #define VERT_SPEED_SCALE 2
  33. // 定义总编码发送字节数
  34. #define EXTEND_N_BYTE (0) // 除了默认3字节 扩展的字节
  35. #define EXTEND_N_INFO (0) // 除了默认3字节数据包字节数 扩展的包数据数
  36. #define SEND_ENCODE_PACKAGE_HEAD_LEN (0x3)
  37. #define SEND_ENCODE_PACKAGE_DATA_MARK (0x3+EXTEND_N_BYTE)
  38. #define SEND_ENCODE_PACKAGE_INFO (72)
  39. #define SEND_ENCODE_PACKAGE_LEN (SEND_ENCODE_PACKAGE_HEAD_LEN+SEND_ENCODE_PACKAGE_DATA_MARK+SEND_ENCODE_PACKAGE_INFO)
  40. /************************** 按字节分类的掩码宏定义 **************************/
  41. // 第1字节:控制001~007项(表2对应关系)
  42. #define BYTE1_MASK_001 0x80 // 唯一产品识别码(M)
  43. #define BYTE1_MASK_002 0x40 // 实名登记标志(M)
  44. #define BYTE1_MASK_003 0x20 // 运行类别(O)
  45. #define BYTE1_MASK_004 0x10 // 无人机分类(M)
  46. #define BYTE1_MASK_005 0x08 // 遥控站位置类型(M)
  47. #define BYTE1_MASK_006 0x04 // 遥控站位置(M)
  48. #define BYTE1_MASK_007 0x02 // 遥控站高度(M)
  49. // 第2字节:控制008~014项(表2对应关系)
  50. #define BYTE2_MASK_008 0x80 // 无人机位置(M)
  51. #define BYTE2_MASK_009 0x40 // 航迹角(M)
  52. #define BYTE2_MASK_010 0x20 // 地速(M)
  53. #define BYTE2_MASK_011 0x10 // 相对高度(O)
  54. #define BYTE2_MASK_012 0x08 // 垂直速度(O)
  55. #define BYTE2_MASK_013 0x04 // 无人机大地高度(M)
  56. #define BYTE2_MASK_014 0x02 // 气压高度(O)
  57. // 第3字节:控制015~021项(表2对应关系)
  58. #define BYTE3_MASK_015 0x80 // 运行状态(M)
  59. #define BYTE3_MASK_016 0x40 // 坐标系类型(M)
  60. #define BYTE3_MASK_017 0x20 // 水平精度(M)
  61. #define BYTE3_MASK_018 0x10 // 垂直精度(M)
  62. #define BYTE3_MASK_019 0x08 // 速度精度(M)
  63. #define BYTE3_MASK_020 0x04 // 时间戳(M)
  64. #define BYTE3_MASK_021 0x02 // 时间戳精度(M)
  65. // 下一个字节是否是标识字节
  66. #define MARK_BYTE_NEXT (0x01)
  67. // 全字段使能掩码(可选字段强制发送)
  68. // 第1字节所有必选+可选字段掩码(不含扩展位)
  69. #define BYTE1_ALL_FIELDS (BYTE1_MASK_001 | BYTE1_MASK_002 | BYTE1_MASK_003 | \
  70. BYTE1_MASK_004 | BYTE1_MASK_005 | BYTE1_MASK_006 | \
  71. BYTE1_MASK_007)
  72. #define BYTE2_ALL_FIELDS (BYTE2_MASK_008 | BYTE2_MASK_009 | BYTE2_MASK_010 | \
  73. BYTE2_MASK_011 | BYTE2_MASK_012 | BYTE2_MASK_013 | \
  74. BYTE2_MASK_014) // 0xFE
  75. #define BYTE3_ALL_FIELDS (BYTE3_MASK_015 | BYTE3_MASK_016 | BYTE3_MASK_017 | \
  76. BYTE3_MASK_018 | BYTE3_MASK_019 | BYTE3_MASK_020 | \
  77. BYTE3_MASK_021) // 0xFE
  78. /************************** 枚举类型定义(GB46750-2025表2/表3) **************************/
  79. // 坐标系类型
  80. typedef enum {
  81. COORD_WGS84 = 0, // WGS-84(默认)
  82. COORD_CGCS2000 = 1, // 2000国家大地坐标系
  83. COORD_RESERVED = 2 // 预留
  84. } UavCoordType;
  85. // 无人机分类
  86. typedef enum {
  87. UAV_TYPE_MICRO = 0, // 微型
  88. UAV_TYPE_LIGHT = 1, // 轻型
  89. UAV_TYPE_SMALL = 2, // 小型
  90. UAV_TYPE_MEDIUM = 3, // 中型
  91. UAV_TYPE_LARGE = 4, // 大型
  92. UAV_TYPE_RESERVED = 5 // 预留
  93. } UavType;
  94. // 无人机运行状态
  95. typedef enum {
  96. UAV_STATE_UNREPORTED = 0, // 未报告
  97. UAV_STATE_GROUND = 1, // 地面
  98. UAV_STATE_AIR = 2, // 空中
  99. UAV_STATE_EMERGENCY = 3, // 紧急状态
  100. UAV_STATE_TX_FAIL_NORMAL = 4, // 发送失效-非紧急
  101. UAV_STATE_TX_FAIL_EMERG = 5, // 发送失效-紧急
  102. UAV_STATE_RESERVED = 6 // 预留
  103. } UavRunState;
  104. // 遥控站位置类型
  105. typedef enum {
  106. STATION_TYPE_TAKEOFF = 0, // 起飞点位置
  107. STATION_TYPE_REMOTE = 1, // 遥控站位置
  108. STATION_TYPE_RESERVED= 2 // 预留
  109. } UavStationType;
  110. // 无人机运行类别
  111. typedef enum {
  112. UAV_RUN_UNDEFINED = 0, // 未定义
  113. UAV_RUN_OPEN = 1, // 开放类
  114. UAV_RUN_SPECIFIC = 2, // 特定类
  115. UAV_RUN_APPROVED = 3, // 审定类
  116. UAV_RUN_RESERVED = 4 // 预留
  117. } UavRunClass;
  118. typedef enum UavHorizontalAccuracy {
  119. UAV_HOR_ACC_UNKNOWN = 0,
  120. UAV_HOR_ACC_10NM = 1, // Nautical Miles. 18.52 km
  121. UAV_HOR_ACC_4NM = 2, // 7.408 km
  122. UAV_HOR_ACC_2NM = 3, // 3.704 km
  123. UAV_HOR_ACC_1NM = 4, // 1.852 km
  124. UAV_HOR_ACC_0_5NM = 5, // 926 m
  125. UAV_HOR_ACC_0_3NM = 6, // 555.6 m
  126. UAV_HOR_ACC_0_1NM = 7, // 185.2 m
  127. UAV_HOR_ACC_0_05NM = 8, // 92.6 m
  128. UAV_HOR_ACC_30_METER = 9,
  129. UAV_HOR_ACC_10_METER = 10,
  130. UAV_HOR_ACC_3_METER = 11,
  131. UAV_HOR_ACC_1_METER = 12,
  132. // 13 to 15 reserved
  133. } UavHorizontalAccuracy_t;
  134. typedef enum UavVerticalAccuracy {
  135. UAV_VER_ACC_UNKNOWN = 0,
  136. UAV_VER_ACC_150_METER = 1,
  137. UAV_VER_ACC_45_METER = 2,
  138. UAV_VER_ACC_25_METER = 3,
  139. UAV_VER_ACC_10_METER = 4,
  140. UAV_VER_ACC_3_METER = 5,
  141. UAV_VER_ACC_1_METER = 6,
  142. // 7 to 15 reserved
  143. } UavVerticalAccuracy_t;
  144. typedef enum UAVSpeedAccuracy {
  145. UAV_SPEED_ACC_UNKNOWN = 0,
  146. UAV_SPEED_ACC_10_METERS_PER_SECOND = 1,
  147. UAV_SPEED_ACC_3_METERS_PER_SECOND = 2,
  148. UAV_SPEED_ACC_1_METERS_PER_SECOND = 3,
  149. UAV_SPEED_ACC_0_3_METERS_PER_SECOND = 4,
  150. // 5 to 15 reserved
  151. } UAVSpeedAccuracy_t;
  152. typedef enum UavTimestampAccuracy {
  153. UAV_TIME_ACC_UNKNOWN = 0,
  154. UAV_TIME_ACC_0_5_SECOND = 1,
  155. UAV_TIME_ACC_0_4_SECOND = 2,
  156. UAV_TIME_ACC_0_3_SECOND = 3,
  157. UAV_TIME_ACC_0_2_SECOND = 4,
  158. UAV_TIME_ACC_0_1_SECOND = 5,
  159. UAV_TIME_ACC_0_05_SECOND = 6,
  160. UAV_TIME_ACC_0_02_SECOND = 7,
  161. UAV_TIME_ACC_0_01_SECOND = 8,
  162. } UavTimestampAccuracy_t;
  163. /************************** 核心数据结构体(存储原始物理值) **************************/
  164. // 无人机运行识别原始数据(上层业务直接赋值,无需关心编码规则)
  165. typedef struct {
  166. // 必选-身份信息
  167. char unique_code[20+1]; // 001-唯一产品识别码(20byte,ASCII) 大端序
  168. char register_id[8+1]; // 002-实名登记标志(8byte,ASCII,后8位) 大端序
  169. UavType uav_type; // 004-无人机分类
  170. UavRunState run_state; // 015-运行状态
  171. UavCoordType coord_type; // 016-坐标系类型
  172. // 必选-位置信息(原始值:经纬度°,高度m;西经/南纬为负)
  173. UavStationType station_type; // 005-遥控站位置类型
  174. double station_lon; // 006-遥控站经度
  175. double station_lat; // 006-遥控站纬度
  176. double station_geo_alt; // 007-遥控站大地高度
  177. double uav_lon; // 008-无人机经度
  178. double uav_lat; // 008-无人机纬度
  179. double uav_geo_alt; // 013-无人机大地高度
  180. // 必选-运动信息(原始值:航迹角°,地速m/s)
  181. double track_angle; // 009-航迹角(真北顺时针,0~359.9)
  182. double ground_speed; // 010-地速(≥0)
  183. // 必选-精度信息(按表3取值)
  184. UavHorizontalAccuracy_t hori_accuracy; // 017-水平精度
  185. UavVerticalAccuracy_t vert_accuracy; // 018-垂直精度
  186. UAVSpeedAccuracy_t speed_accuracy; // 019-速度精度
  187. uint64_t timestamp; // 020-时间戳(ms,Unix)
  188. UavTimestampAccuracy_t time_accuracy; // 021-时间戳精度
  189. // 可选-扩展信息(强制发送,无需外部使能)
  190. UavRunClass run_class; // 003-运行类别
  191. double uav_rel_alt; // 011-相对高度(m,基于起飞点)
  192. double uav_vert_speed; // 012-垂直速度(m/s,正升负降)
  193. double uav_press_alt; // 014-气压高度(m,101.325kPa为基准)
  194. // 字段有效性标志(是否有效,无效则编码为未知值)
  195. bool is_station_pos_valid; // 遥控站经纬度
  196. bool is_uav_pos_valid; // 无人机经纬度
  197. bool is_station_alt_valid; // 遥控站大地高度
  198. bool is_uav_geo_alt_valid; // 无人机大地高度
  199. bool is_track_angle_valid; // 航迹角
  200. bool is_ground_speed_valid; // 地速
  201. bool is_timestamp_valid; // 时间戳
  202. bool is_rel_alt_valid; // 相对高度
  203. bool is_vert_speed_valid; // 垂直速度
  204. bool is_press_alt_valid; // 气压高度
  205. // 可选字段接收标志(解包时自动置位,组包时无需关注)
  206. bool flag_run_class; // 003-运行类别是否接收
  207. bool flag_rel_alt; // 011-相对高度是否接收
  208. bool flag_vert_speed; // 012-垂直速度是否接收
  209. bool flag_press_alt; // 014-气压高度是否接收
  210. } UavIdentificationData;
  211. /************************** 数据包结构体(GB46750-2025图3) **************************/
  212. // 无人机运行识别数据包(组包后/解包前的字节流载体)
  213. typedef struct {
  214. uint8_t data_type; // 1byte-数据类型(固定0xFF)
  215. uint8_t version; // 1byte-版本号(3+5bit,V1.X)
  216. uint8_t content_len; // 1byte-数据内容项字节数
  217. uint8_t data_flag[BASE_DATA_FLAG_BYTES]; // 3byte-基础数据标识位
  218. uint8_t content[MAX_CONTENT_BYTES]; // 可变长-数据内容项(编码后)
  219. } UavIdentificationPacket;
  220. /************************** 工具函数:字节序转换 **************************/
  221. // 16位无符号整数转小端序字节
  222. void uav_put_uint16_le(uint16_t val, uint8_t *buf);
  223. // 32位无符号整数转小端序字节
  224. void uav_put_uint32_le(uint32_t val, uint8_t *buf);
  225. // 小端序字节转16位无符号整数
  226. uint16_t uav_get_uint16_le(const uint8_t *buf);
  227. // 小端序字节转32位无符号整数
  228. uint32_t uav_get_uint32_le(const uint8_t *buf);
  229. /************************** 编码函数:原始值→标准编码值 **************************/
  230. // 经纬度编码(°→32位小端序整数,×10^7)
  231. uint32_t uav_enc_lat(double lat, bool is_valid);
  232. uint32_t uav_enc_lon(double lon, bool is_valid);
  233. // 大地高度/气压高度编码(m→16位小端序整数,(h+1000)×2)
  234. uint16_t uav_enc_geo_alt(double alt, bool is_valid);
  235. // 相对高度编码(m→16位小端序整数,(h+9000)×2)
  236. uint16_t uav_enc_rel_alt(double alt, bool is_valid);
  237. // 航迹角编码(°→16位小端序整数,×10)
  238. uint16_t uav_enc_track_angle(double angle, bool is_valid);
  239. // 地速编码(m/s→16位小端序整数,×10)
  240. uint16_t uav_enc_ground_speed(double speed, bool is_valid);
  241. // 垂直速度编码(m/s→1字节,bit7表方向,数值×2)
  242. uint8_t uav_enc_vert_speed(double v_speed, bool is_valid);
  243. // 时间戳编码(ms→6字节小端序,仅取低6字节)
  244. void uav_enc_timestamp(uint64_t timestamp, bool is_valid, uint8_t *buf);
  245. // 设置数据包版本号(从版本X→V1.X,返回1字节编码值)
  246. uint8_t uav_set_packet_version(uint8_t minor);
  247. /************************** 解码函数:标准编码值→原始值 **************************/
  248. // 经纬度解码(32位编码值→°,÷10^7)
  249. double uav_dec_lat(uint32_t enc_val);
  250. double uav_dec_lon(uint32_t enc_val);
  251. // 大地高度/气压高度解码(16位编码值→m,(val/2)-1000)
  252. double uav_dec_geo_alt(uint16_t enc_val);
  253. // 相对高度解码(16位编码值→m,(val/2)-9000)
  254. double uav_dec_rel_alt(uint16_t enc_val);
  255. // 航迹角解码(16位编码值→°,÷10)
  256. double uav_dec_track_angle(uint16_t enc_val);
  257. // 地速解码(16位编码值→m/s,÷10)
  258. double uav_dec_ground_speed(uint16_t enc_val);
  259. // 垂直速度解码(1字节编码值→m/s,正升负降)
  260. double uav_dec_vert_speed(uint8_t enc_val);
  261. // 时间戳解码(6字节小端序→ms,Unix)
  262. uint64_t uav_dec_timestamp(const uint8_t *buf);
  263. /************************** 核心函数:组包+解包 **************************/
  264. // 初始化原始数据结构体(填充默认值/空字符/标志位false)
  265. void uav_identification_data_init(UavIdentificationData *data);
  266. // 组包:原始数据→标准数据包(返回0成功,-1参数错,-2内容超长)
  267. int8_t uav_identification_pack(UavIdentificationPacket *packet, const UavIdentificationData *data );
  268. // 解包:标准数据包→原始数据(返回0成功,-1参数错,-2包格式错,-3数据标识位异常)
  269. int8_t uav_identification_unpack(UavIdentificationData *data, const UavIdentificationPacket *packet);
  270. // 打印数据包(调试用,输出十六进制+关键字段)
  271. void uav_identification_packet_print(const UavIdentificationPacket *packet);
  272. // 打印原始数据(调试用,输出解码后的物理值)
  273. void uav_identification_data_print(const UavIdentificationData *data);
  274. // 组wifi和ble包函数
  275. int did_GB2025_message_build_pack(UavIdentificationData *UAS_Data, uint8_t *pack, size_t buflen);
  276. int did_GB2025_wifi_build_nan_sync_beacon_frame(char *mac, uint8_t *buf, size_t buf_size);
  277. int did_GB2025_wifi_build_message_pack_nan_action_frame(UavIdentificationData *UAS_Data, char *mac,
  278. uint8_t send_counter,
  279. uint8_t *buf, size_t buf_size);
  280. int did_GB2025_wifi_build_message_pack_beacon_frame(UavIdentificationData *UAS_Data, char *mac,
  281. const char *SSID, size_t SSID_len,
  282. uint16_t interval_tu, uint8_t send_counter,
  283. uint8_t *buf, size_t buf_size);
  284. int did_GB2025_message_process_pack(UavIdentificationData *UAS_Data, uint8_t *pack, size_t buflen);
  285. int did_GB2025_wifi_receive_message_pack_nan_action_frame(UavIdentificationData *UAS_Data,
  286. char *mac, uint8_t *buf, size_t buf_size);