1、功能说明
从数据库表中获取车辆轨迹、车辆报警时的状态信息。
2、字段说明
一.报警表的状态字段
jt808_vehicle_alarm_xxxx 报警表:StatusStart -- StatusEnd参数说明

例子:
1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21
说明:将上面参数用|进行分割成数组array,下标从0开始.
array[0] = 1; 表示状态1;
array[1] = 2; 表示状态2;
array[2] = 3; 表示状态3;
array[3] = 4; 表示状态4;
参考api界面:

array[4] = 5; 表示速度;单位: km/h,使用中需先除以10。 9999 = 999.9
array[5] = 6; 表示经度;
如果设备定位无效,值为0。
例如:113231258,真实值为113.231258
array[6] = 7; 表示纬度;
如果设备定位无效,值为0。
例如:39231258,真实值为39.231258
array[7] = 8; 表示高度;
array[8] = 9; 表示航向;方向:正北方向为0度,顺时针方向增大,最大值360度。
array[9] = 10; 表示里程;单位: 米。
array[10] = 11; 表示油量;单位: 升,使用中需先除以100。 9999 = 99.99
array[11] = 12; 表示停车时长;单位: 秒。
array[12] = 13; 表示温度传感器1;
array[13] = 14; 表示温度传感器2;
array[14] = 15; 表示温度传感器3;
array[15] = 16; 表示温度传感器4;
array[16] = 17; 表示线路id;公交使用,线路号
array[17] = 18; 表示方向;方向 0-上行, 1-下行
array[18] = 19; 表示站点;公交使用,站点标志 0-站点 1-站场
array[19] = 20; 表示站点状态;公交使用,站点状态 0-本站 1-下一站
array[20] = 21; 表示站点索引; 公交使用,站点索引
二.gps轨迹表
jt808_vehicle_gps_xxx的GPSData字段

typedef struct _tagGPSVehicleGpsNew
{
GPSTime_S Time;
unsigned int uiSpeed:14; //速度值 KM/S 9999 = 999.9 范围(0-16384)
unsigned int uiYouLiang:18; //油量 升 9999 = 99.99 范围(0-262100)
unsigned int uiLiCheng; //里程 公里 9999 = 9.999
unsigned int uiHangXiang:9; //地面航向,(0-360) 范围(0-512)
unsigned int uiMapType:3; //地图类型 1表示GOOGLE,2表示百度,0表示无效
unsigned int uiNetWorkType:4; //网络类型(3G类,WIFI,有线,4G)
unsigned int uiTachographSpeed:14; //速度值 KM/S 9999 = 999.9 范围(0-16384) 行驶记录仪速度
//ttx协议: 为人员时,解析为 电池电量 0-100, 90 = 90%
//unsigned int uiReserve:2; //保留位1
unsigned int uiLongGps : 2; //长GPS,表示此结构体后面还有72个字节的数据 0位有效表示libmdvrnet数据有效 1位有效表示Gateway/数据库数据有效
unsigned int uiStatus[4]; //目前只使用,每1个状态 0位表示GPS定位状态(0无效,1有效)
short sTempSensor[4]; //温度传感器的状态
int nJingDu; //经度 4字节 整数部分 9999999 = 9.999999
int nWeiDu; //纬度 4字节 整数部分 9999999 = 9.999999
short nGaoDu; //高度,暂时未使用
unsigned short usSatellites:4; //卫星数,大于0时显示,范围0-12
unsigned short usReserve:8; //保留字段
unsigned short usExtraFlag:4; //附加信息标志, 默认为0
int nParkTime; //停车时长 秒 在静止状态时有效
GPSVehicleExtra_S Extra; //联合体
}GPSVehicleGpsNew_S;
const int GPSVehicleGpsNew_LEN = sizeof(GPSVehicleGpsNew_S);
static_assert(72 == GPSVehicleGpsNew_LEN, "GPSVehicleGpsNew_S Length error");
typedef struct _tagGPSVehicleLongGps : public GPSVehicleGps_S
{
GPSTime_S RecvTime; //接收GPS的系统时间
unsigned int uiLongStatus; //状态位 0位:车厢温度 1位:IO状态位 2位:扩展车辆信号状态 3位:模拟量 4位:胎压
// 5位:主动安全ADAS 6位:主动安全DSM 7位:主动安全BSD 8位:激烈驾驶参数 9位:智能检测(上海)
// 10位:卫星定位 11位:路网附加信息(车辆当前限速值) 12位:路网附加信息(当前道路信息)
// 13位:新主动安全状态位有效 14位:(副)油箱 15位:水位 16位:已产生主动安全的结束报警
// 17位:渣土车状态位有效 18位:今日里程参数有效
short usCompartmentTemp; //车厢温度(0x06)
unsigned short usIOStatus; //IO状态位(0x2A)
unsigned int uiExtraStatus; //扩展车辆信号状态位(0x25)
unsigned int uiAnalogQuantity; //模拟量(0x2B)
unsigned short usSafetyAlarm;
// 主动安全报警 一级(+1000)
// 主动安全报警 二级(+2000)
// 主动安全报警 三级(+10000)
/* 0:前向碰撞报警 1:车道偏离报警 2:车距过近报警 3:行人碰撞报警 4:频繁变道报警 5:道路标识超限报警 6:障碍物报警
7:弯道车速预警 8:驾驶辅助功能失效报警 9:路口快速通过报警 10:实线变道报警 11:设备失效提醒报警 12:低速前车碰撞预警报警1级
13: 路面抛洒 14:黑名单车辆报警 15:白名单车辆报警 16:授权超期车辆报警 17:未授权车辆报警 18:车厢过道行人检测报警 19:盲区监测报警
20:限速报警 21:限高报警 22:限宽报警 23:限重报警
*/
//主动安全dsm报警状态位 一级(+3000)
//主动安全dsm报警状态位 二级(+4000)
//主动安全dsm报警状态位 三级(+11000)
/* 0:疲劳驾驶报警 1:接打电话报警 2:抽烟报警 3:长时间不目视前方报警 4:系统不能正常工作报警 5:未系安全带报警
6:未检测到驾驶员报警 7:双手同时脱离方向盘报警 8:分神驾驶报警(苏) 9:驾驶员异常报警(苏) 10:驾驶员IC卡异常报警(陕)
11:墨镜失效 12:驾驶员行为监测功能失效报警 13:探头遮挡报警 14:换人驾驶报警 15:超时驾驶报警
16:单手脱离方向盘报警 17:喝水报警 18:长时间驾驶 19:玩手机 20:巡检乘客安全带 21:夜间异动
22:酒测正常 23:未完成酒测 24:酒后驾驶 25:醉驾驾驶
*/
//主动安全bsd报警状态位(+5000)
/* 0:左侧盲区报警 1:右侧盲区报警 2:后方接近报警 3:右侧盲区一级报警 4:右侧盲区二级报警 5:右侧盲区三级报警
6:前向盲区报警一级报警 7:前向盲区报警二级报警
*/
//激烈驾驶报警(+6000)
/* 0:急加速报警 1:急减速报警 2:急转弯报警 3:怠速报警 4:异常熄火报警 5:空挡滑行报警 6:发动机超转报警
7:侧翻报警
*/
//智能检测(上海) 一级(+7000)
//智能检测(上海) 二级(+8000)
/* 0:车厢超载报警 1:站外上客报警 2:超过车辆额定载重报警 3:超过道路承重报警
*/
//黑标相关报警 (+9000)
/* 0:人证不符报警 1:IC 卡从业资格证读卡失败报警 2:事故报警 3:主存储器异常报警 4:备用存储器异常报警 5:卫星信号异常报警
6:通信信号异常报警 7:备用电池欠压报警 8:备用电池失效报警 9:IC 卡从业资格证模块故障报警
*/
union
{
unsigned short usADASAlarmL2Reserved; //预留
unsigned short usWater;//水位 9999 = 9999 升 范围(0-65535)
};
union
{
//unsigned int uiDSMAlarmReserved;
struct
{
unsigned short usDSMAlarmL1Reserved; //预留
unsigned short usDSMAlarmL2Reserved; //预留
};
struct
{
unsigned int uiYouHaoHigh : 4; //油箱1扩展,高4位
unsigned int uiYouHao2 : 22; //副油箱油量 升 9999 = 99.99 范围(0-4194304)
unsigned int uiReserved : 6; //预留
};
};
//unsigned char ucBSDAlarmL1Reserved; //预留
//unsigned char ucBSDAlarmL2Reserved; //预留
unsigned short usTodayLiCheng; //今日里程 0.1公里 范围(0-65536)
union
{
struct
{
unsigned char ucLimitSpeedL; //路网附加信息位(11)有效时,车辆当前限速值:单位:km/h
unsigned char ucLimitSpeedH; //路网附加信息位(11)有效时,车辆当前限速值:单位:km/h
};
unsigned short usLimitSpeed;
};
unsigned char ucSatellite; //卫星定位
/* 0:超过阈值速度报警 1:超过道路限速报警 2.(黑标)超速报警 3.(黑标)路线偏离报警 4.(黑标)禁行路段/区域报警
*/
unsigned char ucReserved_1 : 3; //预留
unsigned char ucDistractedDriving : 1; //分神驾驶报警 2级(平台)
unsigned char ucReserved_2 : 4; //预留
//unsigned char ucReserved_3; //预留
unsigned char ucSatelliteContinue; //卫星定位(持续)
/* 0:超过阈值速度报警 1:超过道路限速报警 2.(黑标)超速报警 3.(黑标)路线偏离报警 4.(黑标)禁行路段/区域报警
*/
unsigned char ucRoadType; //路网附加信息位(12)有效时,表示当前道路类型
union
{
struct //注意:4字节对齐,前两个参数必须包含进来 [2020-8-21 ydl]
{
unsigned char ucRoadLimitSpeed; //路网附加信息位(12)有效时,表示当前道路限速值
unsigned char ucStatus5; //状态位(在uiStatus[4]的基础上扩展报警位)
/* 0:危险驾驶行为报警 1:IO7 2:IO8 3:备用电池欠压报警 4:备用电池失效报警 5:备用存储器故障报警 6:急转弯
*/
unsigned char ucTirePressure[30]; //胎压(0x05)
};
struct // 黑标定义
{
unsigned short usHBNotUse; //不要使用,有效数据,占位的
short sAccelerationX; //加速度,有符号 0:X 1:Y 2:Z 单位:0.01g
short sAccelerationY; //加速度,有符号 0:X 1:Y 2:Z 单位:0.01g
short sAccelerationZ; //加速度,有符号 0:X 1:Y 2:Z 单位:0.01g
short sAngularVelocityX; //角速度 0:X 1:Y 2:Z 单位:0.1°/s
short sAngularVelocityY; //角速度 0:X 1:Y 2:Z 单位:0.1°/s
short sAngularVelocityZ; //角速度 0:X 1:Y 2:Z 单位:0.1°/s
unsigned char ucAccelPedalStroke; //加速踏板行程值 范围 1~100,单位%
unsigned char ucBrakePedalStroke; //制动踏板行程值 范围 1~100,单位%
unsigned short usOBDSpeed; //OBD速度
unsigned short usOBDRpm; //发动机转速 单位 RPM 0~16384
short sOBDAngle; //方向盘角度 方向盘转过的角度,顺时针为正,逆时针为负 单位 -1024~1023
unsigned char ucOBDGear; //档位状态 0:空挡 01~09:档位 10:倒挡 11:驻车档
unsigned char ucHBReserved[9]; //预留
};
struct //渣土车定义
{
unsigned short usZtcNotUse; //不要使用,有效数据,占位的
unsigned char ucZtcTarpStatus; //渣土车 篷布状态
//0:无效 1:关闭 2:打开 3:异常 4:开启未完全 5:关闭未完全
unsigned char ucZtcLiftStatus; //渣土车 举升状态
//0:无效 1:平放 2:举升 3:异常
unsigned int uiZtcPlatformStatus; //渣土车(平台使用)
//bit0:篷布状态异常报警 bit1:举升状态异常报警 bit2:重空载状态异常报警
//bit3:进出电子围栏报警 bit4:违规区域卸载 bit5:重车行驶厢盖未关闭
//bit6:锐明渣土车协议
unsigned int uiZtcDeviceLinkStatus;//渣土车 设备连接状态
/*
0 1:连接,0:未连接 篷布检测装置
1 1:连接,0:未连接 举升检测装置
2 1:连接,0:未连接 重空载检测装置
3(锐明) 1:连接,0:未连接 ECU通信
4(锐明) 1:连接,0:未连接 声光报警器
5(锐明) 1:连接,0:未连接 厢门闭合监测
6 1:连接,0:未连接 身份验证装置
7 1:连接,0:未连接 显示外屏
8 1:连接,0:未连接 显示内屏
9 1:连接,0:未连接 DSM
10 1:连接,0:未连接 BSD
11 1:连接,0:未连接 ADAS
12 1:连接,0:未连接 第一路摄像头
13 1:连接,0:未连接 第二路摄像头
14 1:连接,0:未连接 第三路摄像头
15 1:连接,0:未连接 第四路摄像头
16 1:连接,0:未连接 第五路摄像头
17 1:连接,0:未连接 第六路摄像头
18 1:连接,0:未连接 第七路摄像头
19 1:连接,0:未连接 继电器输入状态 1:高电平 0:低电平
20 1:连接,0:未连接 继电器输出状态 1:高电平 0:低电平
21~31 保留
28(锐明) 1:管控模式
30(锐明) 1:证件有效
31(锐明) 1:有证
*/
unsigned int uiZtcAlarmStatus; //渣土车 违规报警状态
/*
0 举升作弊,标志维持至解除
1 篷布作弊,标志维持至解除
2 空重车作弊,标志维持至解除
3 GPS作弊,标志维持至解除
4 ECU作弊,标志维持至解除
5(锐明) 速度作弊
6(锐明) 开关箱作弊
7(锐明) GPS 长时间不定位
5~15 保留
16 车速线被剪报警,标志维持至解除
17 (重车)未密闭行驶报警,标志维持至解除
18 非法举升,标志维持至解除
19 无证,标志维持至解除
20 证件无效,标志维持至解除
21 偷运,标志维持至解除
22 越界,标志维持至解除
23~31 保留
*/
unsigned char ucZtcLimitStatus; //渣土车 限制状态 Bit0:锁车 Bit1:限速 Bit2:限举
unsigned char ucZtcEleFenceType; //电子围栏类型 1:工地;2:禁区;3:消纳场;4:限速圈;5:停车场;6:路线
unsigned char ucZtcEleFenceDirection; //电子围栏方向 (0:进; 1:出)
unsigned char ucZtcMuckType; //(锐明)渣土类型 1:普通渣土 2:砂石 3:建筑废料 4:盾构土
unsigned int uiZtcCarLockReason; //渣土车 锁车原因 0:未锁车 1:平台下发锁车 8:身份验证未通过锁车
unsigned int uiZtcSpeedLimitReason; //渣土车 限速原因 0:未限速(最大车速) 1:平台下发限速 2:(重车)顶盖未密闭行驶限速
// 3:重车越界限速 4:卫星信号被恶意屏蔽限速 5:无证进入工地限速
// 7:GNSS异常限速 9:举升传感器故障或未连接限速 15:SIM卡故障限速
// 16:货箱摄像头故障或未连接限速 21:区域限速 23:重车无核准证限速
unsigned int uiZtcLiftLimitReason; //渣土车 限举原因 0:未限举 1:平台下发限举 2:重车不在指定区域限举(在非指定区域限举)
// 3:无证进入工地限举 4:无证进入消纳场限举
};
};
int nDriverID; //司机ID
}GPSVehicleLongGps_S;
const int GPSVehicleLongGps_LEN = sizeof(GPSVehicleLongGps_S);
解析流程:
A、先按GPSVehicleGpsNew_S结构体来解析,判断 uiLongGps变量,如果uiLongGps =1,则后面还有72个字节的内容为GPSVehicleLongGps_S的数据。
B、uiLongGps为0,则这部分的gps数据已经解析完了。
以下为JAVA的解析代码示例
//解析GPS轨迹信息
private void analyVehicleTrack(byte[] data, int offset, StandardDeviceTrack track) {
offset += 4;
int temp = ByteArrayUtils.byteArray2int(data, offset);
//时间
offset += 4;
//速度值 KM/S 9999 = 999.9 范围(0-16384)
track.setSpeed(temp & 0x00003FFF);
//油量 升 9999 = 99.99 范围(0-262100)
track.setYouLiang((temp>>14) & 0x0003FFFF);
//里程 公里 9999 = 9.999
temp = ByteArrayUtils.byteArray2int(data, offset);
offset += 4;
track.setLiCheng(temp);
//地面航向,(0-360) 范围(0-512)
temp = ByteArrayUtils.byteArray2int(data, offset);
offset += 4;
track.setHuangXiang( temp & 0x01FF );
//状态 0位表示GPS定位状态(0无效,1有效)
temp = ByteArrayUtils.byteArray2int(data, offset);
track.setStatus1(temp);
offset += 4;
analyVehicleStatus(temp,track);
//状态2
temp = ByteArrayUtils.byteArray2int(data, offset);
track.setStatus2(temp);
offset += 4;
//状态3
temp = ByteArrayUtils.byteArray2int(data, offset);
track.setStatus3(temp);
offset += 4;
//状态4
temp = ByteArrayUtils.byteArray2int(data, offset);
track.setStatus4(temp);
offset += 4;
//温度传感器1
short sTemp = ByteArrayUtils.byteArray2short(data, offset);
offset += 2;
track.setTempSensor1((int)sTemp);
//温度传感器2
sTemp = ByteArrayUtils.byteArray2short(data, offset);
offset += 2;
track.setTempSensor2((int)sTemp);
//温度传感器3
sTemp = ByteArrayUtils.byteArray2short(data, offset);
offset += 2;
track.setTempSensor3((int)sTemp);
//温度传感器4
sTemp = ByteArrayUtils.byteArray2short(data, offset);
offset += 2;
track.setTempSensor4((int)sTemp);
//经度 4字节 整数部分 9999999 = 9.999999
temp = ByteArrayUtils.byteArray2int(data, offset);
offset += 4;
track.setJingDu(temp);
//纬度 4字节 整数部分 9999999 = 9.999999
temp = ByteArrayUtils.byteArray2int(data, offset);
offset += 4;
track.setWeiDu(temp);
//高度 2字节 整数部分 9999999 = 9.999999
temp = ByteArrayUtils.byteArray2short(data, offset);
offset += 2;
track.setGaoDu(temp);
//
temp = ByteArrayUtils.byteArray2short(data, offset);
offset += 2;
//附加信息标志位 0-公交OBD 1-视频部标 2-UAE校车
track.setExtraFlag((temp>>12)& 0x00000001);
//停车时长 秒 在静止状态时有效
temp = ByteArrayUtils.byteArray2int(data, offset);
offset += 4;
track.setParkTime(temp);
保留参数
offset += 16;
}
注:手动插入数据库的数据很可能解析失败,建议用系统自动写入数据库的数据进行测试