Commit 65b50318 authored by p x's avatar p x
Browse files

解析DTO

parent f2e07035
...@@ -36,7 +36,7 @@ public class VehicleInfoDto { ...@@ -36,7 +36,7 @@ public class VehicleInfoDto {
//档位 //档位
@Order(7) @Order(7)
private byte tapPos ; private short tapPos ;
//方向盘转角 //方向盘转角
@Order(8) @Order(8)
private double steeringAngle; private double steeringAngle;
...@@ -46,41 +46,41 @@ public class VehicleInfoDto { ...@@ -46,41 +46,41 @@ public class VehicleInfoDto {
//纵向加速度 //纵向加速度
@Order(10) @Order(10)
private float accelerationLon; private float accelerationLon;
//横向加速度 //横向加速度
@Order(11) @Order(11)
private float accelerationLat; private float accelerationLat;
//垂向加速度 //垂向加速度
@Order(12) @Order(12)
private float accelerationVer; private float accelerationVer;
//横摆角速度 //横摆角速度
@Order(13) @Order(13)
private float yawRate; private float yawRate;
//油门开度 //油门开度
@Order(14) @Order(14)
private float accelPos; private float accelPos;
//发动机输出转速 //发动机输出转速
@Order(15) @Order(15)
private float engineSpeed; private float engineSpeed;
//发动机扭矩 //发动机扭矩
@Order(16) @Order(16)
private double engineTorque; private double engineTorque;
//制动踏板开关 //制动踏板开关
@Order(17) @Order(17)
private short brakeFlag; private short brakeFlag;
//制动踏板开度 //制动踏板开度
@Order(18) @Order(18)
private float brakePos; private float brakePos;
//制动主缸压力 //制动主缸压力
@Order(19) @Order(19)
private int brakePressure; private float brakePressure;
//油耗 //油耗
@Order(20) @Order(20)
......
...@@ -7,6 +7,8 @@ import java.nio.ByteBuffer; ...@@ -7,6 +7,8 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.SortedMap; import java.util.SortedMap;
import java.util.TreeMap; import java.util.TreeMap;
...@@ -15,286 +17,308 @@ import io.netty.buffer.ByteBuf; ...@@ -15,286 +17,308 @@ import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
public class Parse { public class Parse {
public static <T> T parse(ByteBuf data, T t) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, ClassNotFoundException { public static <T> T parse(ByteBuf data, T t) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, ClassNotFoundException {
Field [] fields = t.getClass().getDeclaredFields(); Field[] fields = t.getClass().getDeclaredFields();
List<Field> fList = new ArrayList<>(); List<Field> fList = new ArrayList<>();
SortedMap<Integer,Field> rstMap = new TreeMap<>(); SortedMap<Integer, Field> rstMap = new TreeMap<>();
for(Field field : fields) {
field.setAccessible(true); for (Field field : fields) {
if (field.isAnnotationPresent(Order.class)) {
String fieldName = field.getName(); if (field.isAnnotationPresent(Order.class)) {
Order order = field.getAnnotation(Order.class);
fList.add(field);
}
int num = order.value(); }
//基础数据类型 且 不是数组 Collections.sort(fList, new Comparator<Field>() {
if(field.getType().isPrimitive() && !field.getType().isArray() ) { @Override
// data.re public int compare(Field f1, Field f2) {
// field.set(fList, rstMap); return f1.getAnnotation(Order.class).value() - f2.getAnnotation(Order.class).value();
readBuf(t,field,data); }
}else if(field.getClass().isPrimitive() && field.getType().isArray()){ });
// 基础数据类型 且 是数组
}else if(List.class.isAssignableFrom(field.getType())) { for (Field field : fList) {
// 集合类型 field.setAccessible(true);
//读取属性的注解是否引用其他字段的长度 if (field.isAnnotationPresent(Order.class)) {
if( field.isAnnotationPresent(RefNumFlag.class)) {
String fieldName = field.getName();
RefNumFlag refNumFlag = field.getAnnotation(RefNumFlag.class); Order order = field.getAnnotation(Order.class);
String refField = refNumFlag.value(); System.out.println(fieldName);
Class<?> clazz1 = t.getClass();
Field nameField = clazz1.getDeclaredField(refField); int num = order.value();
Type genericType = nameField.getGenericType(); //基础数据类型 且 不是数组
nameField.setAccessible(true); if (field.getType().isPrimitive() && !field.getType().isArray()) {
// data.re
if (genericType instanceof ParameterizedType) { // field.set(fList, rstMap);
ParameterizedType pt = (ParameterizedType) genericType; readBuf(t, field, data);
Type[] actualTypes = pt.getActualTypeArguments(); } else if (field.getClass().isPrimitive() && field.getType().isArray()) {
if (actualTypes.length > 0) { // 基础数据类型 且 是数组
actualTypes[0].getClass(); } else if (List.class.isAssignableFrom(field.getType())) {
int len= (int) nameField.get(t); // 集合类型
for(int i=0;i<len;i++) { //读取属性的注解是否引用其他字段的长度
actualTypes[0].getClass(); if (field.isAnnotationPresent(RefNumFlag.class)) {
}
} RefNumFlag refNumFlag = field.getAnnotation(RefNumFlag.class);
} String refField = refNumFlag.value();
} Class<?> clazz1 = t.getClass();
Field nameField = clazz1.getDeclaredField(refField);
}else if(field.getType()==String.class) { Type genericType = nameField.getGenericType();
//类型为字符串 nameField.setAccessible(true);
readBuf(t,field,data);
}else { if (genericType instanceof ParameterizedType) {
//其他对象类型 ParameterizedType pt = (ParameterizedType) genericType;
Class<?> cls = Class.forName(field.getType().getName()); Type[] actualTypes = pt.getActualTypeArguments();
Object obj = cls.newInstance(); if (actualTypes.length > 0) {
actualTypes[0].getClass();
parse(data, obj); int len = (int) nameField.get(t);
field.set(t, obj); for (int i = 0; i < len; i++) {
} actualTypes[0].getClass();
rstMap.put(num,field); }
} }
} }
return t; }
}
} else if (field.getType() == String.class) {
/** //类型为字符串
* 读取字节流 readBuf(t, field, data);
* @param t } else {
* @param field //其他对象类型
* @param data Class<?> cls = Class.forName(field.getType().getName());
* @throws IllegalArgumentException Object obj = cls.newInstance();
* @throws IllegalAccessException
*/ parse(data, obj);
public static void readBuf(Object t, Field field,ByteBuf data ) throws IllegalArgumentException, IllegalAccessException { field.set(t, obj);
if(data.readerIndex()==data.maxCapacity() ) }
return ; rstMap.put(num, field);
FieldDef fieldDef =null; }
if(field.isAnnotationPresent(FieldDef.class)) { }
fieldDef = field.getAnnotation(FieldDef.class); return t;
} }
Class<?> type = field.getType(); /**
* 读取字节流
if(type==String.class && fieldDef!=null &&fieldDef.type().equals("BYTE")) { *
byte[]by = new byte[fieldDef.length()]; * @param t
data.readBytes(by); * @param field
String str = new String(by, StandardCharsets.UTF_8); * @param data
field.set(t, str); * @throws IllegalArgumentException
}else if(type==short.class) { * @throws IllegalAccessException
field.set(t, data.readUnsignedByte()); */
}else if(type==int.class) { public static void readBuf(Object t, Field field, ByteBuf data) throws IllegalArgumentException, IllegalAccessException {
field.set(t, data.readUnsignedShort()); if (data.readerIndex() == data.maxCapacity())
}else if(type==long.class && fieldDef==null ) { return;
field.set(t, data.readUnsignedInt()); FieldDef fieldDef = null;
}else if(type==long.class && fieldDef!=null &&fieldDef.type().equals("TIMESTAMP") && fieldDef.length()==8 ) { if (field.isAnnotationPresent(FieldDef.class)) {
field.set(t, data.readLong()); fieldDef = field.getAnnotation(FieldDef.class);
}else if(type==long.class && fieldDef!=null &&fieldDef.type().equals("BYTE") ) { }
field.set(t, data.readLong());
} Class<?> type = field.getType();
}
public static byte[] longToBytes(long value) { if (type == String.class && fieldDef != null && fieldDef.type().equals("BYTE")) {
ByteBuffer buffer = ByteBuffer.allocate(8); byte[] by = new byte[fieldDef.length()];
buffer.order(ByteOrder.BIG_ENDIAN); // 指定小端模式 data.readBytes(by);
buffer.putLong(value); // 将long值存入buffer String str = new String(by, StandardCharsets.UTF_8);
return buffer.array(); // 获取byte数组 field.set(t, str);
} } else if (type == short.class) {
public static byte[] longToBytes1(long value) { field.set(t, data.readUnsignedByte());
ByteBuffer buffer = ByteBuffer.allocate(4); } else if (type == int.class) {
buffer.order(ByteOrder.BIG_ENDIAN); // 指定小端模式 field.set(t, data.readUnsignedShort());
buffer.putLong(value); // 将long值存入buffer } else if (type == long.class && fieldDef == null) {
return buffer.array(); // 获取byte数组 field.set(t, data.readUnsignedInt());
} } else if (type == long.class && fieldDef != null && fieldDef.type().equals("TIMESTAMP") && fieldDef.length() == 8) {
field.set(t, data.readLong());
public static byte[] intToBytes(int value) { } else if (type == long.class && fieldDef != null && fieldDef.type().equals("BYTE")) {
ByteBuffer buffer = ByteBuffer.allocate(4); field.set(t, data.readLong());
buffer.order(ByteOrder.BIG_ENDIAN); // 指定小端模式 }
buffer.putLong(value); // 将long值存入buffer }
return buffer.array(); // 获取byte数组
} public static byte[] longToBytes(long value) {
ByteBuffer buffer = ByteBuffer.allocate(8);
buffer.order(ByteOrder.BIG_ENDIAN); // 指定小端模式
public static String byteToHexString(byte[] bytes) { buffer.putLong(value); // 将long值存入buffer
StringBuilder sb = new StringBuilder(); return buffer.array(); // 获取byte数组
for (byte b : bytes) { }
sb.append(String.format("%02x", b));
} public static byte[] longToBytes1(long value) {
return sb.toString(); ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.order(ByteOrder.BIG_ENDIAN); // 指定小端模式
//return null; buffer.putLong(value); // 将long值存入buffer
return buffer.array(); // 获取byte数组
}
public static byte[] intToBytes(int value) {
ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.order(ByteOrder.BIG_ENDIAN); // 指定小端模式
buffer.putLong(value); // 将long值存入buffer
return buffer.array(); // 获取byte数组
}
public static String byteToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
//return null;
// ByteBuffer buffer = ByteBuffer.allocate(8); // ByteBuffer buffer = ByteBuffer.allocate(8);
// buffer.order(ByteOrder.LITTLE_ENDIAN); // 指定小端模式 // buffer.order(ByteOrder.LITTLE_ENDIAN); // 指定小端模式
// buffer.putLong(value); // 将long值存入buffer // buffer.putLong(value); // 将long值存入buffer
// return buffer.array(); // 获取byte数组 // return buffer.array(); // 获取byte数组
} }
public static String long2Hex(long num, int len) {
String hex = Long.toHexString(num); public static String long2Hex(long num, int len) {
int padLength = len * 2; String hex = Long.toHexString(num);
if (hex.length() >= padLength) { int padLength = len * 2;
return hex.substring(hex.length() - padLength); // 超长时截断 if (hex.length() >= padLength) {
} return hex.substring(hex.length() - padLength); // 超长时截断
return String.format("%0" + padLength + "d", 0).replace("0", "0") + hex; // 或直接格式化 }
} return String.format("%0" + padLength + "d", 0).replace("0", "0") + hex; // 或直接格式化
}
public static void main(String [] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, ClassNotFoundException {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, ClassNotFoundException {
String hexString = "F20000000015018cb864640000000000";
byte[] bytes = HexStringToByteArray.hexStringToByteArray(hexString); String hexString = "F20000000015018cb864640000000000";
ByteBuf byteBuf = Unpooled.buffer(16); byte[] bytes = HexStringToByteArray.hexStringToByteArray(hexString);
long l = 500000; ByteBuf byteBuf = Unpooled.buffer(16);
//3600000000 long l = 500000;
// 1164916946 //3600000000
// byte [] bs = Long.toHexString(l); // 1164916946
String s = long2Hex(l,4); // byte [] bs = Long.toHexString(l);
//longToBytes1(l); String s = long2Hex(l, 4);
int i = 990; //longToBytes1(l);
String hex = Integer.toHexString(i); int i = 33;
String hex = Integer.toHexString(i);
String vid = "T1023459";
byte[] by1 = vid.getBytes(); String vid = "T1023459";
s = byteToHexString(by1); byte[] by1 = vid.getBytes();
s = byteToHexString(by1);
System.out.println(s);
System.out.println(s);
// //
// //
// List<Byte> byteList = new ArrayList<Byte>(); // List<Byte> byteList = new ArrayList<Byte>();
// //
// Byte[] bytes = byteList.toArray(new Byte[byteList.size()]); // Byte[] bytes = byteList.toArray(new Byte[byteList.size()]);
//byte[] bs = convoter(bytes); //byte[] bs = convoter(bytes);
//byteBuf.writeBytes(bytes); //byteBuf.writeBytes(bytes);
//VehicleMessage vehicleMessage = parse(byteBuf,new VehicleMessage()); //VehicleMessage vehicleMessage = parse(byteBuf,new VehicleMessage());
//System.out.print(vehicleMessage); //System.out.print(vehicleMessage);
} }
public static void convoterBean( Object source , Object target) throws IllegalArgumentException, IllegalAccessException, ClassNotFoundException, InstantiationException, NoSuchFieldException, SecurityException { public static void convoterBean(Object source, Object target) {
Field [] fields = source.getClass().getDeclaredFields(); Field field;
List<Field> fList = new ArrayList<>(); Field tField;
SortedMap<Integer,Field> rstMap = new TreeMap<>(); try {
for(Field field : fields) { Field[] fields = source.getClass().getDeclaredFields();
field.setAccessible(true); //List<Field> fList = new ArrayList<>();
Object o= field.get(source); //SortedMap<Integer,Field> rstMap = new TreeMap<>();
if(o==null) { for (Field cfield : fields) {
continue; field = cfield;
} field.setAccessible(true);
Object o = field.get(source);
OffsetDef offsetDef =null; if (o == null) {
if(field.isAnnotationPresent(OffsetDef.class)) { continue;
offsetDef = field.getAnnotation(OffsetDef.class); }
}
//获取目标对象指定的属性 OffsetDef offsetDef = null;
Field tField = target.getClass().getDeclaredField(field.getName()); if (field.isAnnotationPresent(OffsetDef.class)) {
tField.setAccessible(true); offsetDef = field.getAnnotation(OffsetDef.class);
if (field.isAnnotationPresent(Order.class)) { }
if(field.getType().isPrimitive() && !field.getType().isArray() ) { //获取目标对象指定的属性
//如果属性添加了自定义注解 offset tField = target.getClass().getDeclaredField(field.getName());
tField.setAccessible(true);
Class<?> type = field.getType(); if (field.isAnnotationPresent(Order.class)) {
if(offsetDef!=null) { if (field.getType().isPrimitive() && !field.getType().isArray()) {
double offset =offsetDef.value(); //如果属性添加了自定义注解 offset
int ofsetType =offsetDef.type();
int minValidLength =offsetDef.minValidLength(); Class<?> type = field.getType();
if (offsetDef != null) {
//startindex double offset = offsetDef.value();
int type1 = offsetDef.type();
if(type==byte.class) { int minValidLength = offsetDef.minValidLength();
tField.set(target, o);
}else if(type==short.class) { //startindex
if(minValidLength>0 ) { if (type == byte.class) {
int len = String.valueOf((Short)o).length(); tField.set(target, o);
if(len<minValidLength) { } else if (type == short.class) {
int subtract = minValidLength-len;
double f =(Short)o*Math.pow(10, subtract)*offset; if (minValidLength > 0) {
tField.set(target, (float)f); int len = String.valueOf((Short) o).length();
}else { if (len < minValidLength) {
double f =(Short)o*offset; int subtract = minValidLength - len;
tField.set(target, (float)f); double f = (Short) o * Math.pow(10, subtract) * offset;
} tField.set(target, (float) f);
}else { } else {
double f =(Short)o*offset; double f = (Short) o * offset;
tField.set(target, (float)f); tField.set(target, (float) f);
} }
} else {
double f = (Short) o * offset;
tField.set(target, (short) f);
}else if(type==int.class) { }
if(minValidLength>0 ) {
int len = String.valueOf((Integer)o).length();
if(len<minValidLength) { } else if (type == int.class) {
int subtract = minValidLength-len; if (minValidLength > 0) {
double f =(Integer)o*Math.pow(10, subtract)*offset; int len = String.valueOf((Integer) o).length();
tField.set(target, (float)f); if (len < minValidLength) {
}else { int subtract = minValidLength - len;
double f =(Integer)o*offset; double f = (Integer) o * Math.pow(10, subtract) * offset;
tField.set(target, (float)f); tField.set(target, (float) f);
} } else {
}else { double f = (Integer) o * offset;
// double f =(Integer)o*offset; tField.set(target, (float) f);
float f = (float) ((Integer)o*offset); }
tField.set(target, (float)f); } else {
} double f = (Integer) o * offset;
}else if(type==long.class) { tField.set(target, (float) f);
if(minValidLength>0 ) { }
int len = String.valueOf((Long)o).length(); } else if (type == long.class) {
if(len<minValidLength) { if (minValidLength > 0) {
int subtract = minValidLength-len; int len = String.valueOf((Long) o).length();
double f =(Long)o*Math.pow(10, subtract)*offset; if (len < minValidLength) {
tField.set(target, (float)f); int subtract = minValidLength - len;
}else { double f = (Long) o * Math.pow(10, subtract) * offset;
double f =(Long)o*offset; tField.set(target, (float) f);
tField.set(target, (float)f); } else {
} double f = (Long) o * offset;
}else { tField.set(target, (float) f);
double d =(Long)o*offset; }
} else {
tField.set(target, d); double d = (Long) o * offset;
}
} tField.set(target, (float)d);
}
}
}else {
tField.set(target, o);
} } else {
tField.set(target, o);
}else if(field.getClass().isPrimitive() && field.getType().isArray()){ }
// 基础数据类型 且 是数组
}else if(List.class.isAssignableFrom(field.getType())) { } else if (field.getClass().isPrimitive() && field.getType().isArray()) {
// 集合类型 // 基础数据类型 且 是数组
//读取属性的注解是否引用其他字段的长度 } else if (List.class.isAssignableFrom(field.getType())) {
if( field.isAnnotationPresent(RefNumFlag.class)) { // 集合类型
//读取属性的注解是否引用其他字段的长度
if (field.isAnnotationPresent(RefNumFlag.class)) {
// RefNumFlag refNumFlag = field.getAnnotation(RefNumFlag.class); // RefNumFlag refNumFlag = field.getAnnotation(RefNumFlag.class);
// String refField = refNumFlag.value(); // String refField = refNumFlag.value();
// Class<?> clazz1 = t.getClass(); // Class<?> clazz1 = t.getClass();
// Field nameField = clazz1.getDeclaredField(refField); // Field nameField = clazz1.getDeclaredField(refField);
// Type genericType = nameField.getGenericType(); // Type genericType = nameField.getGenericType();
// nameField.setAccessible(true); // nameField.setAccessible(true);
// //
// if (genericType instanceof ParameterizedType) { // if (genericType instanceof ParameterizedType) {
// ParameterizedType pt = (ParameterizedType) genericType; // ParameterizedType pt = (ParameterizedType) genericType;
// Type[] actualTypes = pt.getActualTypeArguments(); // Type[] actualTypes = pt.getActualTypeArguments();
...@@ -306,29 +330,51 @@ public class Parse { ...@@ -306,29 +330,51 @@ public class Parse {
// } // }
// } // }
// } // }
} }
}else if(field.getType()==String.class) { } else if (field.getType() == String.class) {
//类型为字符串 //类型为字符串
// try { // try {
// String s = (String)o; // String s = (String)o;
// String s1 = new String(s.getBytes()); // String s1 = new String(s.getBytes());
tField.set(target, o); tField.set(target, o);
// }catch(Exception e) { // }catch(Exception e) {
// e.printStackTrace(); // e.printStackTrace();
// } // }
}else { } else {
//其他对象类型 //其他对象类型
Class<?> cls = Class.forName(tField.getType().getName()); Class<?> cls = Class.forName(tField.getType().getName());
Object obj = cls.newInstance(); Object obj = cls.newInstance();
convoterBean(o, obj); convoterBean(o, obj);
tField.set(target, obj); tField.set(target, obj);
} }
} }
} }
} } catch (IllegalArgumentException e) {
System.out.println("e = " + e.getMessage());
} catch (IllegalAccessException e) {
System.out.println("e = " + e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println("e = " + e.getMessage());
} catch (InstantiationException e) {
System.out.println("e = " + e.getMessage());
} catch (NoSuchFieldException e) {
System.out.println("e = " + e.getMessage());
} catch (SecurityException e) {
System.out.println("e = " + e.getMessage());
}
}
public static byte[] convoter(Byte[] bytes) {
byte[] bs = new byte[bytes.length];
int i = 0;
for (Byte b : bytes) {
bs[i++] = b;
}
return bs;
}
} }
...@@ -6,10 +6,10 @@ import com.cusc.adas.v2x.utils.Order; ...@@ -6,10 +6,10 @@ import com.cusc.adas.v2x.utils.Order;
public class Position2D { public class Position2D {
//经度 //经度
@Order(1) @Order(1)
@OffsetDef(value=10000000) @OffsetDef(value=0.0000001,minValidLength=10)
private long longitude; private long longitude;
//纬度 //纬度
@Order(2) @Order(2)
@OffsetDef(value=10000000) @OffsetDef(value=0.0000001,minValidLength=9)
private long latitude; private long latitude;
} }
...@@ -7,118 +7,116 @@ import com.cusc.adas.v2x.utils.NumFlag; ...@@ -7,118 +7,116 @@ import com.cusc.adas.v2x.utils.NumFlag;
import com.cusc.adas.v2x.utils.OffsetDef; import com.cusc.adas.v2x.utils.OffsetDef;
import com.cusc.adas.v2x.utils.Order; import com.cusc.adas.v2x.utils.Order;
import com.cusc.adas.v2x.utils.RefNumFlag; import com.cusc.adas.v2x.utils.RefNumFlag;
/** /**
* 车辆基础信息 * 车辆基础信息
* @author huangml
* *
* @author huangml
*/ */
public class VehicleInfo { public class VehicleInfo {
//车辆编号 //车辆编号
@Order(1) @Order(1)
@FieldDef(type="BYTE",isArray=true,length=8) @FieldDef(type = "BYTE", isArray = true, length = 8)
private String vehicleId; private String vehicleId;
//消息编号 //消息编号
@Order(2) @Order(2)
@FieldDef(type="BYTE",isArray=true,length=8) @FieldDef(type = "BYTE", isArray = true, length = 8)
private long messageId; private long messageId;
//GNSS 时间戳 //GNSS 时间戳
@Order(3) @Order(3)
@FieldDef(type="TIMESTAMP",isArray=false,length=8) @FieldDef(type = "TIMESTAMP", isArray = false, length = 8)
private long timestampGNSS; private long timestampGNSS;
//GNSS 速度 单位:0.01 m/s //GNSS 速度 单位:0.01 m/s
@Order(4) @Order(4)
@OffsetDef(value=0.036,type=2) @OffsetDef(value = 0.036, type = 2)
private int velocityGNSS; private int velocityGNSS;
//位置 //位置
@Order(5) @Order(5)
private Position position; private Position position;
//航向角 单位为 1e-4 °
@Order(6) /****[0..3600000],正北方向顺时针旋转至与车辆当前运动方向重合所转 过的角度,单位为 1e-4 ° , 不可缺省,0xFFFFFFFF 表示异常**/
@OffsetDef(value=0.0001,type = 2) @Order(6)
private int heading; @OffsetDef(value = 0.0001)
private long heading;
//档位
@Order(7) /**
private byte tapPos ; * 档位 枚举类型:[0..50],0:数据失效;1-20:表示手动档车辆前进档对 应档位,1 表示 1 档,2 表示 2 档,以此类推;21-30:表示手动挡车 辆倒档对应档位,
//方向盘转角 单位为 1e-4 ° * 21 表示 R1 档,22 表示 R2 档,以此类推;31:D 档 (前进档);32:R 档(倒档);33:P 档(驻车档);34:N 档(空 档);
@Order(8) * 35:S 档(运动模式);36:L 档(低速档);37:H 档;38; HL 档;39-50:预留,不可缺省,0xFF 表示异常
@OffsetDef(value=0.0001) */
private long steeringAngle; @Order(7)
//当前车速 单位:0.01m/s private short tapPos;
@Order(9) //方向盘转角 单位为 1e-4 °
@OffsetDef(value=0.036,type=2) @Order(8)
private int velocity; @OffsetDef(value = 0.0001)
//纵向加速度 单位:0.01m/s private long steeringAngle;
@Order(10) /**[0..20000],CAN 总线数据中的行驶速度,单位:0.01m/s,0xFFFF 表 示缺省***/
@OffsetDef(value=36,type=2) @Order(9)
private int accelerationLon; @OffsetDef(value = 0.036, type = 2)
private int velocity;
//横向加速度 单位:0.01m/s //纵向加速度 单位:0.01m/s
@Order(11) @Order(10)
@OffsetDef(value=36,type=2) @OffsetDef(value = 0.036, type = 2)
private int accelerationLat; private int accelerationLon;
//垂向加速度 单位:0.01m/s //横向加速度 单位:0.01m/s
@Order(12) @Order(11)
@OffsetDef(value=36,type=2) @OffsetDef(value = 0.036, type = 2)
private int accelerationVer; private int accelerationLat;
//横摆角速度 单位:0.01m/s
@Order(13) //垂向加速度 单位:0.01m/s
@OffsetDef(value=36,type=2) @Order(12)
private int yawRate; @OffsetDef(value = 0.036, type = 2)
private int accelerationVer;
//油门开度 单位:0.1% //横摆角速度 单位:0.01m/s
@Order(14) @Order(13)
@OffsetDef(value = 0.036, type = 2)
private int accelPos; private int yawRate;
//发动机输出转速 单位:r/min //油门开度 单位:0.1%
@Order(15) @Order(14)
private int engineSpeed; private int accelPos;
//发动机扭矩 单位:0.01Nm //发动机输出转速 单位:r/min
@Order(16) @Order(15)
private long engineTorque; private int engineSpeed;
//制动踏板开关 //发动机扭矩 单位:0.01Nm
@Order(17) @Order(16)
private short brakeFlag; private long engineTorque;
//制动踏板开度 单位:0.1% //制动踏板开关
@Order(18) @Order(17)
private int brakePos; private short brakeFlag;
//制动主缸压力 单位 0.01MPa //制动踏板开度 单位:0.1%
@Order(19) @Order(18)
private int brakePressure; private int brakePos;
//油耗 单位 0.01L/100km //制动主缸压力 单位 0.01MPa
@Order(20) @Order(19)
private int fuelConsumption; private int brakePressure;
//车辆驾驶模式 //油耗 单位 0.01L/100km
@Order(21) @Order(20)
private byte driveMode; private int fuelConsumption;
//目的地位置 //车辆驾驶模式
@Order(22) @Order(21)
private Position2D destLocation; private short driveMode;
//途经点数量 //目的地位置
@Order(23) @Order(22)
@NumFlag private Position2D destLocation;
private short passPointsNum;
//途经点 //途经点数量
@Order(24) @Order(23)
@RefNumFlag(value="passPointsNum") @NumFlag
private List<Position2D> passPoints; private short passPointsNum;
//途经点
@Order(24)
@RefNumFlag(value = "passPointsNum")
private List<Position2D> passPoints;
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment