| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- #pragma once
- #include <stdint.h>
- #include <stdbool.h>
- #include <string.h>
- #include <math.h>
- /************************** 标准编码规则宏定义(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);
|