4G_module/custom/jt808/inc/jt808_protocol.h

373 lines
15 KiB
C
Raw Normal View History

#ifndef __JT808_PROTOCOL__
#define __JT808_PROTOCOL__
#include "jt808_config.h"
// 已支持的消息ID
typedef enum {
ID_Term_GenResp = 0x0001, // 终端通用应答
ID_Plat_GenResp = 0x8001, // 平台通用应答
ID_Term_HB = 0x0002, // 终端心跳
ID_FillPktReq = 0x8003, // 补传分包请求
ID_Term_Reg = 0x0100, // 终端注册
ID_Term_RegResp = 0x8100, // 终端注册应答
ID_Term_Logout = 0x0003, // 终端注销
ID_Term_Auth = 0x0102, // 终端鉴权
ID_SetTermParams = 0x8103, // 设置终端参数
ID_GetTermParams = 0x8104, // 查询终端参数
ID_GetTermParamsResp = 0x0104, // 查询终端参数应答
ID_Term_Ctrl = 0x8105, // 终端控制
ID_GetSpecificTermParams = 0x8106,// 查询指定终端参数
ID_GetTermAttr = 0x8107, // 查询终端属性
ID_GetTermAttrResp = 0x0107, // 查询终端属性应答
ID_Term_Upgrade = 0x8108, // 下发终端升级包
ID_Term_UpgradeResult = 0x0108, // 终端升级结果通知
ID_LocReport = 0x0200, // 位置信息汇报
ID_GetLocInfo = 0x8201, // 位置信息查询
ID_GetLocInfoResp = 0x0201, // 位置信息查询应答
ID_LocTrackingCtrl = 0x8202, // 临时位置跟踪控制
ID_TxtMsgdelivery = 0x8300, // 文本信息下发
ID_Car_Ctrl = 0x8500, // 车辆控制
ID_Car_CtrlResp = 0x0500, // 车辆控制应答
ID_Set_Circle_Area = 0x8600, //设置圆形区域 增加景点
ID_Delete_Circle_area = 0x8601, // 删除圆形区域 删除景点
ID_Set_Polygon_area = 0x8604, // 设置多边形区域
ID_Delete_Polygon_area = 0x8605, // 删除多边形区域
ID_Data_Down = 0x8900, // 数据透传下行
ID_Data_Up = 0x0900, // 数据透传上行
ID_Req_data_update = 0x0B03, //请求电子围栏/景点更新
ID_data_update_reply = 0x8B03, //电子围栏/景点数量下发
ID_data_update_complete = 0x8B02, //电子围栏/景点更新完成
}MessageID_t;
#pragma pack(1)
// ----------------------------- 协议消息体结构体定义 ----------
typedef enum{
Msg_ok = 0, // 成功
Msg_err = 1, // 失败
Msg_invalid = 2, // 消息有误//无效
Msg_no_support = 3, // 不支持
}Msg_result_t;
// 终端通用应答体0x0001
typedef struct {
uint16_t msg_flow_num; // 对应的平台消息的流水号
uint16_t msg_id_ack; // 对应的平台消息的 ID
uint8_t result; // 结果 0成功/确认1失败2消息有误3不支持
}Term_GenResp_t;
// 平台通用应答体0x8001
typedef struct {
uint16_t msg_flow_num; // 对应的终端消息的流水号
uint16_t msg_id_ack; // 对应的终端消息的 ID
uint8_t result; // 结果 0成功/确认1失败2消息有误3不支持
}Plat_GenResp_t;
// 终端心跳体(0x0002空包)
// 补传分包请求体0x8003
typedef struct {
uint16_t msg_flow_num; // 对应要求补传的原始消息第一包的消息流水号
uint8_t Total_num; // 重传包总数
uint16_t *pkt_seq; // 重传包序号顺序排列,如“包 ID1 包 ID2包 IDn”。
}FillPktReq_t;
typedef enum {
none_plate = 0, // 无牌照
blue_plate = 1, // 蓝牌
yellow_plate = 2, // 黄牌
black_plate = 3, // 黑牌
white_plate = 4, // 白牌
green_plate = 5, // 绿牌
other_plate = 6, // 其他牌照
}plate_type_t;
// 终端注册体0x0100
typedef struct {
uint16_t province_id;// 省域ID
uint16_t city_id;// 市县域ID
uint8_t manufacturer_id[5];// 制造商ID, 固定5个字节
uint8_t term_model[20];// 终端型号, 固定20个字节, 位数不足后补0x00
uint8_t term_id[7];// 终端ID, 固定7个字节, 位数不足后补0x00
uint8_t car_plate_color;// 车牌颜色, 0表示未上牌
uint8_t car_plate_num[10];// 车辆标识, 仅在上牌时使用
}Term_RegInfo_t;
// 终端注册应答体0x8100
typedef struct {
uint16_t msg_flow_num; // 对应的终端注册消息的流水号
uint8_t result; // 0成功1车辆已被注册2数据库中无该车辆3终端已被注册4数据库中无该终端
// uint8_t *str_auth_code; //只有在成功后才有该字段
}Term_RegResp_t;
// 终端注销体(0x0003空包)
// 终端鉴权体0x0102
typedef struct {
void *str_auth_code; //只有在成功后才有该字段
}Term_Auth_t;
// 终端参数项数据结构体
typedef struct TermParamlist_t{
uint32_t param_id; // 参数ID
uint8_t param_len; // 参数长度
void *param_value; // 参数值
struct TermParamlist_t *next; // 下一个参数项
}TermParamlist_t;
// 设置终端参数体0x8103
typedef struct {
uint8_t param_Total_num; // 参数总数
TermParamlist_t *param_list; // 参数项列表
}SetTermParams_t;
// 查询终端参数体(0x8104空包)
// 查询指定终端参数体0x8106
typedef struct {
uint8_t param_Total_num; // 参数总数
uint32_t *param_id_list; // 参数ID列表
}GetSpecificTermParams_t;
// 查询终端参数应答体0x0104
typedef struct {
uint16_t msg_flow_num; // 对应的终端参数查询消息的流水号
uint8_t param_Total_num; // 参数总数
TermParamlist_t *param_list; // 参数项列表
}GetTermParamsResp_t;
// 终端控制命令字
typedef union {
struct{
uint8_t _0 : 1; //
uint8_t _1 : 1; // 无线升级
uint8_t _2 : 1; // 控制终端连接指定服务器
uint8_t _3 : 1; // 终端关机
uint8_t _4 : 1; // 终端复位
uint8_t _5 : 1; // 终端恢复出厂设置
uint8_t _6 : 1; // 关闭数据通信
uint8_t _7 : 1; // 关闭所有无线通信
};
uint8_t val8;
}Term_Ctrl_Cmd_t;
// 终端控制体0x8105
typedef struct {
Term_Ctrl_Cmd_t com_word; //命令字
uint8_t *str_cmd_params; //命令参数每个 STRING 字段先按 GBK 编码处理后再组成消息
}Term_Ctrl_t;
// 查询终端属性体(0x8107空包)
// 查询终端属性应答体(0x0107)
typedef struct {
uint16_t term_type; // 终端类型
uint8_t manufacturer_id[5];// 制造商ID, 固定5个字节
uint8_t term_model[20];// 终端型号, 固定20个字节, 位数不足后补0x00
uint8_t term_id[7];// 终端ID, 固定7个字节, 位数不足后补0x00
uint8_t term_ICCID[10];// ICCID
uint8_t hw_ver_len;// 终端硬件版本号长度
uint8_t str_hw_ver[5];// 终端硬件版本号
uint8_t fw_ver_len;// 终端固件版本号长度
uint8_t str_fw_ver[5];// 终端固件版本号
uint8_t GnssModule_attr;// GNSS模块属性
uint8_t CommModule_attr;// 通讯模块属性
}GetTermAttrResp_t;
// 下发终端升级包体0x8108
typedef struct {
uint8_t upgrade_type; // 升级类型1字节
uint16_t file_crc; // 文件CRC2字节
uint8_t path_len; // 文件路径长度1字节
char *file_path; // 文件路径字符串
}Term_Upgrade_t;
// 终端升级结果通知体0x0108
typedef struct {
uint8_t upgrade_type; // 升级类型 0终端12道路运输证 IC 卡读卡器52北斗卫星定位模块
uint8_t upgrade_result; // 结果 0成功1失败2取消
}Term_UpgradeResult_t;
// 报警标志位
typedef union{
struct{
uint32_t sos : 1;// bit_0 紧急报警,触动报警开关后触/收到应答后清零
uint32_t overspeed : 1;// bit_1 超速报警
uint32_t fatigue : 1;// bit_2 疲劳驾驶
uint32_t early_warning : 1;// bit_3 危险预警
uint32_t gnss_fault : 1;// bit_4 GNSS模块发生故障
uint32_t gnss_antenna_cut : 1; // bit_5 GNSS天线未接或被剪断
uint32_t gnss_antenna_shortcircuit : 1;// bit_6 GNSS天线短路
uint32_t power_low : 1;// bit_7 终端主电源欠压
uint32_t power_cut : 1;// bit_8 终端主电源掉电
uint32_t lcd_fault : 1;// bit_9 终端LCD或显示器故障
uint32_t tts_fault : 1;// bit_10 TTS模块故障
uint32_t camera_fault : 1;// bit_11 摄像头故障
uint32_t transport_license_IC_card_fault : 1;// bit_12 道路运输证 IC 卡模块故障
uint32_t overspeed_notice : 1; // bit_1 超速预警
uint32_t fatigue_notice : 1;// bit_2 疲劳驾驶预警
uint32_t retain1 : 3;// 保留3位
uint32_t day_drive_overtime : 1;// bit_18 当天累计驾驶超时
uint32_t stop_driving_overtime : 1;// bit_19 超时停车
uint32_t in_out_area : 1;// bit_20 进出区域.收到应答后清零
uint32_t in_out_road : 1; // bit_21 进出路线.收到应答后清零
uint32_t road_drive_time : 1;// bit_22 路段行驶时间不足/过长.收到应答后清零
uint32_t road_deviate : 1;// bit_23 路线偏离报警
uint32_t vss_fault : 1;// bit_24 车辆VSS故障
uint32_t oil_fault : 1;// bit_25 车辆油量异常
uint32_t car_alarm : 1;// bit_26 车辆被盗(通过车辆防盗器)
uint32_t car_acc_alarm : 1;// bit_27 车辆非法点火.收到应答后清零
uint32_t car_move : 1;// bit_28 车辆非法位移.收到应答后清零
uint32_t collision : 1;// 碰撞报警
uint32_t rollover : 1;// 侧翻报警
uint32_t Illegal_opendoor : 1;// 非法开门报警(终端未设置区域时,不判断非法开门)/收到应答后清零
};
uint32_t val32;
}LocAlarm_t;
// 状态位
typedef union{
struct{
uint32_t acc : 1;// ACC开关, 0:ACC关; 1:ACC开
uint32_t positioning : 1;// 定位标志, 0:未定位; 1:定位
uint32_t sn_latitude : 1;// 纬度半球, 0:北纬: 1:南纬
uint32_t ew_longitude : 1;// 经度半球, 0:东经; 1:西经
uint32_t operation : 1; // 0:运营状态; 1:停运状态
uint32_t gps_encrypt : 1;// 0:经纬度未经保密插件加密; 1:经纬度已经保密插件加密
uint32_t retain1 : 2;// 保留2位
uint32_t trip_status : 2;// 00: 空车; 01: 半载; 10: 保留; 11: 满载
uint32_t oil_cut : 1;// 0:车辆油路正常; 1:车辆油路断开
uint32_t circuit_cut : 1;// 0:车辆电路正常; 1:车辆电路断开
uint32_t door_lock : 1;// 0:车门解锁; 1: 车门加锁
uint32_t door1_status : 1;// 0:门1 关; 1: 门1 开; (前门)
uint32_t door2_status : 1;// 0:门2 关; 1: 门2 开; (中门)
uint32_t door3_status : 1;// 0:门 3 关; 1: 门 3 开; (后门)
uint32_t door4_status : 1;// 0:门 4 关; 1: 门 4 开; (驾驶席门)
uint32_t door5_status : 1;// 0:门 5 关; 1: 门 5 开; (自定义)
uint32_t gps_en : 1;// 0: 未使用 GPS 卫星进行定位; 1: 使用 GPS 卫星进行定位
uint32_t beidou_en : 1;// 0: 未使用北斗卫星进行定位; 1: 使用北斗卫星进行定位
uint32_t glonass_en : 1;// 0: 未使用 GLONASS 卫星进行定位; 1: 使用 GLONASS 卫星进行定位
uint32_t galileo_en : 1;// 0: 未使用 Galileo 卫星进行定位; 1: 使用 Galileo 卫星进行定位
// uint32_t retain2 : 10;// 保留10位
uint32_t MAG_MODE :1; // 1:游客模式,0:管理模式
uint32_t PLT_MODE :1; // 1:游客模式,0:管理模式
uint32_t IO_RX_back :1; // 1:正常 0:倒车
uint32_t IO_TX_brake :1; // 1:正常 0:刹车
uint32_t A_brake :1; // 1:自动刹车,0:手动刹车
uint32_t A_Speed_Cut :1; // 1:自动减速,0:手动减速
uint32_t P_Radar_EN :2; // 1:雷达使能,0:雷达禁止
2025-09-15 16:24:44 +08:00
uint32_t retain2 : 2;// 保留10位
};
uint32_t val32;
}LocStatus_t;
// 位置信息汇报消息体
typedef struct{
LocAlarm_t alarm_flag; // 报警标志
LocStatus_t status; // 状态
uint32_t latitude; // 纬度
uint32_t longitude; // 经度
uint16_t altitude; // 高度
uint16_t speed; // 速度
uint16_t direction; // 方向
uint8_t BCDtime[6]; // 时间YY-MM-DD-hh-mm-ssGMT+8 时间,本标准中之后涉及的时间均采用此时区)
}Loc_basic_info_t;
// 位置附加信息
typedef struct Loc_addi_info_t{
uint8_t msg_id; // 附加消息ID
uint8_t msg_len; // 附加消息长度
void *msg; // 附加消息内容
struct Loc_addi_info_t *next; // 下一个附加信息
}Loc_addi_info_t;
// 位置信息汇报体0x0200
typedef struct{
Loc_basic_info_t basic_info; // 基本信息
Loc_addi_info_t *addi_info; // 附加信息
}LocReport_t;
// 位置信息查询体(0x8201空包)
// 位置信息查询应答体0x0201
typedef struct {
uint16_t msg_flow_num; // 对应的位置信息查询消息的流水号
LocReport_t *loc_info; // 位置信息
}GetLocInfoResp_t;
// 临时位置跟踪控制体0x8202
typedef struct {
uint16_t time_intv; // 时间间隔
uint32_t eff_time; // 追踪有效时间单位为秒s
}LocTrackingCtrl_t;
// 文本信息下发体0x8300
typedef struct {
uint8_t flag_bit; // 标志位
uint8_t *TxtString; // 文本信息字符串
}TxtMsgdelivery_t;
// 设置多边形区域体0x8604
typedef struct {
uint32_t lat; // 纬度 以度为单位的纬度值乘以 10 的 6 次方
uint32_t lng; // 经度
}AreaPoint_t;
typedef struct {
uint32_t Area_ID; // 区域ID
uint16_t Area_att; // 区域属性
uint8_t Start_Time[6]; // 起始时间
uint8_t End_Time[6]; // 结束时间
uint16_t MaxSpeed; // 最大速度
uint8_t Overspeed_duration; // 超速持续时间
uint16_t Area_Points_Num; // 区域内点的数量
AreaPoint_t *Area_Points; // 区域内点的坐标集合
}SetPolygonArea_t;
// 删除多边形区域体0x8605
typedef struct {
uint8_t Area_Num; // 区域数量
uint32_t *Area_ID_list; // 区域ID集合
}DeletePolygonArea_t;
// 数据透传体0x8900/0x0900
typedef struct {
uint8_t Msg_type; // 数据类型
uint8_t *Msg_Data; // 数据内容
uint16_t Msg_Data_Len; // 数据长度
}Data_SeriaNet_t;
// ------------------------------ 协议帧结构体定义 ----------
// 转义相关标识
typedef enum {
PSIGN = 0x7E, // 标识位
PESC = 0x7D, // 转义标识
PESC_SIGN = 0x02, // 0x7E<-->0x7D后紧跟一个0x02
PESC_ESCAPE = 0x01, // 0x7D<-->0x7D后紧跟一个0x01
} ProtocolEscapeFlag;
// 消息体属性
typedef union {
struct {
uint16_t msgbodylen : 10;// 消息体长度, 占用10bit
uint16_t encrypt : 3;// 数据加密方式, 当此三位都为0, 表示消息体不加密, 当第10位为1, 表示消息体经过RSA算法加密
uint16_t packet : 1;// 分包标记
uint16_t retain : 2;// 保留2位
};
uint16_t val16;
}MsgBodyAttr_t;
// 消息头
typedef struct {
uint16_t msg_id;// 消息ID
MsgBodyAttr_t msgbody_attr;// 消息体属性
uint8_t phone_BCDnum[6];// 终端手机号
uint16_t msg_flow_num;// 消息流水号
uint16_t total_packet;// 总包数, 分包情况下使用
uint16_t packet_seq;// 当前包序号, 分包情况下使用
}MsgHead_t;
// 消息结构体
typedef struct {
uint8_t Head_SIGN; // 头标识位
MsgHead_t msg_head; // 消息头
void *p_msg_body; // 消息体
uint8_t BCC_Check; // BCC校验码
uint8_t Tail_SIGN; // 尾标识位
}JT808_2013_MsgFrame_t;
#pragma pack()
#endif // __JT808_PROTOCOL__