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

370 lines
15 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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, // 数据透传上行
}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 :1; // 1:雷达使能,0:雷达禁止
uint32_t retain2 : 3;// 保留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__