#pragma once #include #include #include #include /************************** 标准编码规则宏定义(GB46750-2025表3) **************************/ // 数据类型固定值(表1要求) #define PACKET_DATA_TYPE 0xFF // 版本号宏(标准要求:前3位固定001,后5位0~63,即V1.X) #define VERSION_MAJOR_FIXED 1 // 主版本固定为1(前3位001) #define VERSION_MINOR_FIXED 0 #define VERSION_ENCODE ((((VERSION_MAJOR_FIXED) & 0x07) << 5) | ((VERSION_MINOR_FIXED) & 0x3F)) #define VERSION_DECODE_MAJOR(ver) ((ver) >> 5) // 从编码值解码主版本 #define VERSION_DECODE_MINOR(ver) ((ver) & 0x3F) // 从编码值解码从版本 // 基础数据标识字节数(3字节),扩展标志位默认0(表2要求) #define BASE_DATA_FLAG_BYTES 3 // 最大数据内容项字节数(1~200)(表1要求) #define MAX_CONTENT_BYTES 200 // 字符串填充字符(NULL)(表3要求) #define FILL_CHAR '\0' // 经纬度放大倍数(×10^7)(表3要求) #define LAT_LON_SCALE 10000000LL // 大地高度/气压高度:(h+1000)×2,分辨率0.5m(表3要求) #define GEO_ALT_OFFSET 1000 #define GEO_ALT_SCALE 2 // 相对高度:(h+9000)×2,分辨率0.5m(表3要求) #define REL_ALT_OFFSET 9000 #define REL_ALT_SCALE 2 // 航迹角/地速放大倍数(×10),分辨率0.1°/0.1m/s(表3要求) #define ANGLE_SPEED_SCALE 10 // 垂直速度放大倍数(×2),分辨率0.5m/s(表3要求) #define VERT_SPEED_SCALE 2 // 定义总编码发送字节数 #define EXTEND_N_BYTE (0) // 除了默认3字节 扩展的字节 #define EXTEND_N_INFO (0) // 除了默认3字节数据包字节数 扩展的包数据数 #define SEND_ENCODE_PACKAGE_HEAD_LEN (0x3) #define SEND_ENCODE_PACKAGE_DATA_MARK (0x3+EXTEND_N_BYTE) #define SEND_ENCODE_PACKAGE_INFO (72) #define SEND_ENCODE_PACKAGE_LEN (SEND_ENCODE_PACKAGE_HEAD_LEN+SEND_ENCODE_PACKAGE_DATA_MARK+SEND_ENCODE_PACKAGE_INFO) /************************** 按字节分类的掩码宏定义 **************************/ // 第1字节:控制001~007项(表2对应关系) #define BYTE1_MASK_001 0x80 // 唯一产品识别码(M) #define BYTE1_MASK_002 0x40 // 实名登记标志(M) #define BYTE1_MASK_003 0x20 // 运行类别(O) #define BYTE1_MASK_004 0x10 // 无人机分类(M) #define BYTE1_MASK_005 0x08 // 遥控站位置类型(M) #define BYTE1_MASK_006 0x04 // 遥控站位置(M) #define BYTE1_MASK_007 0x02 // 遥控站高度(M) // 第2字节:控制008~014项(表2对应关系) #define BYTE2_MASK_008 0x80 // 无人机位置(M) #define BYTE2_MASK_009 0x40 // 航迹角(M) #define BYTE2_MASK_010 0x20 // 地速(M) #define BYTE2_MASK_011 0x10 // 相对高度(O) #define BYTE2_MASK_012 0x08 // 垂直速度(O) #define BYTE2_MASK_013 0x04 // 无人机大地高度(M) #define BYTE2_MASK_014 0x02 // 气压高度(O) // 第3字节:控制015~021项(表2对应关系) #define BYTE3_MASK_015 0x80 // 运行状态(M) #define BYTE3_MASK_016 0x40 // 坐标系类型(M) #define BYTE3_MASK_017 0x20 // 水平精度(M) #define BYTE3_MASK_018 0x10 // 垂直精度(M) #define BYTE3_MASK_019 0x08 // 速度精度(M) #define BYTE3_MASK_020 0x04 // 时间戳(M) #define BYTE3_MASK_021 0x02 // 时间戳精度(M) // 下一个字节是否是标识字节 #define MARK_BYTE_NEXT (0x01) // 全字段使能掩码(可选字段强制发送) // 第1字节所有必选+可选字段掩码(不含扩展位) #define BYTE1_ALL_FIELDS (BYTE1_MASK_001 | BYTE1_MASK_002 | BYTE1_MASK_003 | \ BYTE1_MASK_004 | BYTE1_MASK_005 | BYTE1_MASK_006 | \ BYTE1_MASK_007) #define BYTE2_ALL_FIELDS (BYTE2_MASK_008 | BYTE2_MASK_009 | BYTE2_MASK_010 | \ BYTE2_MASK_011 | BYTE2_MASK_012 | BYTE2_MASK_013 | \ BYTE2_MASK_014) // 0xFE #define BYTE3_ALL_FIELDS (BYTE3_MASK_015 | BYTE3_MASK_016 | BYTE3_MASK_017 | \ BYTE3_MASK_018 | BYTE3_MASK_019 | BYTE3_MASK_020 | \ BYTE3_MASK_021) // 0xFE /************************** 枚举类型定义(GB46750-2025表2/表3) **************************/ // 坐标系类型 typedef enum { COORD_WGS84 = 0, // WGS-84(默认) COORD_CGCS2000 = 1, // 2000国家大地坐标系 COORD_RESERVED = 2 // 预留 } UavCoordType; // 无人机分类 typedef enum { UAV_TYPE_MICRO = 0, // 微型 UAV_TYPE_LIGHT = 1, // 轻型 UAV_TYPE_SMALL = 2, // 小型 UAV_TYPE_MEDIUM = 3, // 中型 UAV_TYPE_LARGE = 4, // 大型 UAV_TYPE_RESERVED = 5 // 预留 } UavType; // 无人机运行状态 typedef enum { UAV_STATE_UNREPORTED = 0, // 未报告 UAV_STATE_GROUND = 1, // 地面 UAV_STATE_AIR = 2, // 空中 UAV_STATE_EMERGENCY = 3, // 紧急状态 UAV_STATE_TX_FAIL_NORMAL = 4, // 发送失效-非紧急 UAV_STATE_TX_FAIL_EMERG = 5, // 发送失效-紧急 UAV_STATE_RESERVED = 6 // 预留 } UavRunState; // 遥控站位置类型 typedef enum { STATION_TYPE_TAKEOFF = 0, // 起飞点位置 STATION_TYPE_REMOTE = 1, // 遥控站位置 STATION_TYPE_RESERVED= 2 // 预留 } UavStationType; // 无人机运行类别 typedef enum { UAV_RUN_UNDEFINED = 0, // 未定义 UAV_RUN_OPEN = 1, // 开放类 UAV_RUN_SPECIFIC = 2, // 特定类 UAV_RUN_APPROVED = 3, // 审定类 UAV_RUN_RESERVED = 4 // 预留 } UavRunClass; typedef enum UavHorizontalAccuracy { UAV_HOR_ACC_UNKNOWN = 0, UAV_HOR_ACC_10NM = 1, // Nautical Miles. 18.52 km UAV_HOR_ACC_4NM = 2, // 7.408 km UAV_HOR_ACC_2NM = 3, // 3.704 km UAV_HOR_ACC_1NM = 4, // 1.852 km UAV_HOR_ACC_0_5NM = 5, // 926 m UAV_HOR_ACC_0_3NM = 6, // 555.6 m UAV_HOR_ACC_0_1NM = 7, // 185.2 m UAV_HOR_ACC_0_05NM = 8, // 92.6 m UAV_HOR_ACC_30_METER = 9, UAV_HOR_ACC_10_METER = 10, UAV_HOR_ACC_3_METER = 11, UAV_HOR_ACC_1_METER = 12, // 13 to 15 reserved } UavHorizontalAccuracy_t; typedef enum UavVerticalAccuracy { UAV_VER_ACC_UNKNOWN = 0, UAV_VER_ACC_150_METER = 1, UAV_VER_ACC_45_METER = 2, UAV_VER_ACC_25_METER = 3, UAV_VER_ACC_10_METER = 4, UAV_VER_ACC_3_METER = 5, UAV_VER_ACC_1_METER = 6, // 7 to 15 reserved } UavVerticalAccuracy_t; typedef enum UAVSpeedAccuracy { UAV_SPEED_ACC_UNKNOWN = 0, UAV_SPEED_ACC_10_METERS_PER_SECOND = 1, UAV_SPEED_ACC_3_METERS_PER_SECOND = 2, UAV_SPEED_ACC_1_METERS_PER_SECOND = 3, UAV_SPEED_ACC_0_3_METERS_PER_SECOND = 4, // 5 to 15 reserved } UAVSpeedAccuracy_t; typedef enum UavTimestampAccuracy { UAV_TIME_ACC_UNKNOWN = 0, UAV_TIME_ACC_0_5_SECOND = 1, UAV_TIME_ACC_0_4_SECOND = 2, UAV_TIME_ACC_0_3_SECOND = 3, UAV_TIME_ACC_0_2_SECOND = 4, UAV_TIME_ACC_0_1_SECOND = 5, UAV_TIME_ACC_0_05_SECOND = 6, UAV_TIME_ACC_0_02_SECOND = 7, UAV_TIME_ACC_0_01_SECOND = 8, } UavTimestampAccuracy_t; /************************** 核心数据结构体(存储原始物理值) **************************/ // 无人机运行识别原始数据(上层业务直接赋值,无需关心编码规则) typedef struct { // 必选-身份信息 char unique_code[20+1]; // 001-唯一产品识别码(20byte,ASCII) 大端序 char register_id[8+1]; // 002-实名登记标志(8byte,ASCII,后8位) 大端序 UavType uav_type; // 004-无人机分类 UavRunState run_state; // 015-运行状态 UavCoordType coord_type; // 016-坐标系类型 // 必选-位置信息(原始值:经纬度°,高度m;西经/南纬为负) UavStationType station_type; // 005-遥控站位置类型 double station_lon; // 006-遥控站经度 double station_lat; // 006-遥控站纬度 double station_geo_alt; // 007-遥控站大地高度 double uav_lon; // 008-无人机经度 double uav_lat; // 008-无人机纬度 double uav_geo_alt; // 013-无人机大地高度 // 必选-运动信息(原始值:航迹角°,地速m/s) double track_angle; // 009-航迹角(真北顺时针,0~359.9) double ground_speed; // 010-地速(≥0) // 必选-精度信息(按表3取值) UavHorizontalAccuracy_t hori_accuracy; // 017-水平精度 UavVerticalAccuracy_t vert_accuracy; // 018-垂直精度 UAVSpeedAccuracy_t speed_accuracy; // 019-速度精度 uint64_t timestamp; // 020-时间戳(ms,Unix) UavTimestampAccuracy_t time_accuracy; // 021-时间戳精度 // 可选-扩展信息(强制发送,无需外部使能) UavRunClass run_class; // 003-运行类别 double uav_rel_alt; // 011-相对高度(m,基于起飞点) double uav_vert_speed; // 012-垂直速度(m/s,正升负降) double uav_press_alt; // 014-气压高度(m,101.325kPa为基准) // 字段有效性标志(是否有效,无效则编码为未知值) bool is_station_pos_valid; // 遥控站经纬度 bool is_uav_pos_valid; // 无人机经纬度 bool is_station_alt_valid; // 遥控站大地高度 bool is_uav_geo_alt_valid; // 无人机大地高度 bool is_track_angle_valid; // 航迹角 bool is_ground_speed_valid; // 地速 bool is_timestamp_valid; // 时间戳 bool is_rel_alt_valid; // 相对高度 bool is_vert_speed_valid; // 垂直速度 bool is_press_alt_valid; // 气压高度 // 可选字段接收标志(解包时自动置位,组包时无需关注) bool flag_run_class; // 003-运行类别是否接收 bool flag_rel_alt; // 011-相对高度是否接收 bool flag_vert_speed; // 012-垂直速度是否接收 bool flag_press_alt; // 014-气压高度是否接收 } UavIdentificationData; /************************** 数据包结构体(GB46750-2025图3) **************************/ // 无人机运行识别数据包(组包后/解包前的字节流载体) typedef struct { uint8_t data_type; // 1byte-数据类型(固定0xFF) uint8_t version; // 1byte-版本号(3+5bit,V1.X) uint8_t content_len; // 1byte-数据内容项字节数 uint8_t data_flag[BASE_DATA_FLAG_BYTES]; // 3byte-基础数据标识位 uint8_t content[MAX_CONTENT_BYTES]; // 可变长-数据内容项(编码后) } UavIdentificationPacket; /************************** 工具函数:字节序转换 **************************/ // 16位无符号整数转小端序字节 void uav_put_uint16_le(uint16_t val, uint8_t *buf); // 32位无符号整数转小端序字节 void uav_put_uint32_le(uint32_t val, uint8_t *buf); // 小端序字节转16位无符号整数 uint16_t uav_get_uint16_le(const uint8_t *buf); // 小端序字节转32位无符号整数 uint32_t uav_get_uint32_le(const uint8_t *buf); /************************** 编码函数:原始值→标准编码值 **************************/ // 经纬度编码(°→32位小端序整数,×10^7) uint32_t uav_enc_lat(double lat, bool is_valid); uint32_t uav_enc_lon(double lon, bool is_valid); // 大地高度/气压高度编码(m→16位小端序整数,(h+1000)×2) uint16_t uav_enc_geo_alt(double alt, bool is_valid); // 相对高度编码(m→16位小端序整数,(h+9000)×2) uint16_t uav_enc_rel_alt(double alt, bool is_valid); // 航迹角编码(°→16位小端序整数,×10) uint16_t uav_enc_track_angle(double angle, bool is_valid); // 地速编码(m/s→16位小端序整数,×10) uint16_t uav_enc_ground_speed(double speed, bool is_valid); // 垂直速度编码(m/s→1字节,bit7表方向,数值×2) uint8_t uav_enc_vert_speed(double v_speed, bool is_valid); // 时间戳编码(ms→6字节小端序,仅取低6字节) void uav_enc_timestamp(uint64_t timestamp, bool is_valid, uint8_t *buf); // 设置数据包版本号(从版本X→V1.X,返回1字节编码值) uint8_t uav_set_packet_version(uint8_t minor); /************************** 解码函数:标准编码值→原始值 **************************/ // 经纬度解码(32位编码值→°,÷10^7) double uav_dec_lat(uint32_t enc_val); double uav_dec_lon(uint32_t enc_val); // 大地高度/气压高度解码(16位编码值→m,(val/2)-1000) double uav_dec_geo_alt(uint16_t enc_val); // 相对高度解码(16位编码值→m,(val/2)-9000) double uav_dec_rel_alt(uint16_t enc_val); // 航迹角解码(16位编码值→°,÷10) double uav_dec_track_angle(uint16_t enc_val); // 地速解码(16位编码值→m/s,÷10) double uav_dec_ground_speed(uint16_t enc_val); // 垂直速度解码(1字节编码值→m/s,正升负降) double uav_dec_vert_speed(uint8_t enc_val); // 时间戳解码(6字节小端序→ms,Unix) uint64_t uav_dec_timestamp(const uint8_t *buf); /************************** 核心函数:组包+解包 **************************/ // 初始化原始数据结构体(填充默认值/空字符/标志位false) void uav_identification_data_init(UavIdentificationData *data); // 组包:原始数据→标准数据包(返回0成功,-1参数错,-2内容超长) int8_t uav_identification_pack(UavIdentificationPacket *packet, const UavIdentificationData *data ); // 解包:标准数据包→原始数据(返回0成功,-1参数错,-2包格式错,-3数据标识位异常) int8_t uav_identification_unpack(UavIdentificationData *data, const UavIdentificationPacket *packet); // 打印数据包(调试用,输出十六进制+关键字段) void uav_identification_packet_print(const UavIdentificationPacket *packet); // 打印原始数据(调试用,输出解码后的物理值) void uav_identification_data_print(const UavIdentificationData *data); // 组wifi和ble包函数 int did_GB2025_message_build_pack(UavIdentificationData *UAS_Data, uint8_t *pack, size_t buflen); int did_GB2025_wifi_build_nan_sync_beacon_frame(char *mac, uint8_t *buf, size_t buf_size); int did_GB2025_wifi_build_message_pack_nan_action_frame(UavIdentificationData *UAS_Data, char *mac, uint8_t send_counter, uint8_t *buf, size_t buf_size); int did_GB2025_wifi_build_message_pack_beacon_frame(UavIdentificationData *UAS_Data, char *mac, const char *SSID, size_t SSID_len, uint16_t interval_tu, uint8_t send_counter, uint8_t *buf, size_t buf_size); int did_GB2025_message_process_pack(UavIdentificationData *UAS_Data, uint8_t *pack, size_t buflen); int did_GB2025_wifi_receive_message_pack_nan_action_frame(UavIdentificationData *UAS_Data, char *mac, uint8_t *buf, size_t buf_size);