#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, // 车辆控制应答 } MessageID_t; #pragma pack(1) // ----------------------------- 协议消息体结构体定义 ---------- // 终端通用应答体(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;// 终端硬件版本号 uint8_t fw_ver_len;// 终端固件版本号长度 uint8_t *str_fw_ver;// 终端固件版本号 uint8_t GnssModule_attr;// GNSS模块属性 uint8_t CommModule_attr;// 通讯模块属性 }GetTermAttrResp_t; // 下发终端升级包体(0x8108) typedef struct { uint8_t upgrade_type; // 升级类型 uint8_t manufacturer_id[5];// 制造商ID, 固定5个字节 uint8_t ver_len;// 版本号长度 uint8_t *str_ver;// 版本号 uint32_t upgrade_pkg_len;// 升级包长度 单位为 BYTE uint8_t *str_upgrade_pkg;// 升级包 }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 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 enum{ MileageID = 0x01,// 里程, 1/10km, 对应车上里程表读数, DWORD OilMassID = 0x02,// 油量, 1/10L, 对应车上油量表读数, WORD TachographSpeedID = 0x03,// 行驶记录功能获取的速度, 1/10km/h, WORD AlarmCountID = 0x04,// 需要人工确认报警事件的 ID, 从 1 开始计数, WORD OverSpeedAlarmID = 0x11,// 超速报警附加信息, BYTE or BYTE+DWORD AccessAreaAlarmID = 0x12,// 进出区域/路线报警附加信息, BYTE+DWORD+BYTE DrivingTimeAlarmID = 0x13,// 路段行驶时间不足/过长报警附加信息, DWORD+WORD+BYTE VehicleSignalStatusID = 0x25,// 扩展车辆信号状态位, DWORD IoStatusID = 0x2A,// IO 状态位, WORD AnalogQuantityID = 0x2B,// 模拟量, DWORD NetworkQuantityID = 0x30,// 无线通信网络信号强度, BYTE GnssSatellitesID = 0x31,// GNSS 定位卫星数, BYTE CustomInformationLengthID = 0xE0,// 后续自定义信息长度, BYTE }addi_infoID_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; // ------------------------------ 协议帧结构体定义 ---------- // 转义相关标识 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__