370 lines
15 KiB
C
370 lines
15 KiB
C
#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; // 文件CRC(2字节)
|
||
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-ss(GMT+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__
|