aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjose <joseantonio@grdar.es>2016-12-13 09:03:08 +0100
committerjose <joseantonio@grdar.es>2016-12-14 17:44:39 +0100
commit69595987b3da18b518ac0dcb7082324d096cdb35 (patch)
tree7eebf1d6a7c484fad2294128b3c583a095dbb07a
parent4557cf912fada1dc249333aa05215b0116b8ebab (diff)
downloadtraccar-server-69595987b3da18b518ac0dcb7082324d096cdb35.tar.gz
traccar-server-69595987b3da18b518ac0dcb7082324d096cdb35.tar.bz2
traccar-server-69595987b3da18b518ac0dcb7082324d096cdb35.zip
Fix Meiligao Protocol to work with tk228
-rw-r--r--src/org/traccar/model/Position.java19
-rw-r--r--src/org/traccar/protocol/MeiligaoProtocolDecoder.java122
-rw-r--r--test/org/traccar/protocol/MeiligaoProtocolDecoderTest.java2
3 files changed, 98 insertions, 45 deletions
diff --git a/src/org/traccar/model/Position.java b/src/org/traccar/model/Position.java
index 8ca2588e2..3e8cb27bc 100644
--- a/src/org/traccar/model/Position.java
+++ b/src/org/traccar/model/Position.java
@@ -60,11 +60,26 @@ public class Position extends Message {
public static final String KEY_ARMED = "armed";
public static final String KEY_ACCURACY = "accuracy";
public static final String KEY_GEOFENCE = "geofence";
-
public static final String KEY_DTCS = "dtcs";
public static final String KEY_OBD_SPEED = "obdSpeed";
public static final String KEY_OBD_ODOMETER = "obdOdometer";
-
+ public static final String KEY_OBD_ENGINE_LOAD = "engineLoad";
+ public static final String KEY_OBD_AVERAGE_FUEL = "averageFuelConsumition";
+ public static final String KEY_OBD_DRIVING_RANGE = "drivingRange";
+ public static final String KEY_OBD_SINGLE_FUEL_CONSUMPTION = "singleFuelConsumption";
+ public static final String KEY_OBD_TOTAL_FUEL_CONSUMPTION = "totalFuelConsumption";
+ public static final String KEY_OBD_CURRENT_ERROR = "currentError";
+ public static final String KEY_OBD_HARSH_ACCELERATION = "harshAcelerationNo";
+ public static final String KEY_OBD_HARSH_BREAK = "harshBreakerNo";
+ public static final String KEY_OBD_TOTAL_IGNITION = "totalIgnitionNo";
+ public static final String KEY_OBD_TOTAL_DRIVING_TIME = "totalDrivingTime";
+ public static final String KEY_OBD_TOTAL_IDLING_TIME = "totalIdlingTime";
+ public static final String KEY_OBD_AVERAGE_HOT_START = "averageHotStartTime";
+ public static final String KEY_OBD_AVERAGE_SPEED = "averageSpeed";
+ public static final String KEY_OBD_HISTORY_HIGHT_SPEED = "historyHightestSpeed";
+ public static final String KEY_OBD_HISTORY_HIGHT_RPM = "historyHightestRPM";
+ public static final String KEY_OBD_TOTAL_HARSH_ACCELERATION = "totalHarshAccerleration";
+ public static final String KEY_OBD_TOTAL_HARSH_BRAKE = "totalHarshBrake";
public static final String KEY_RESULT = "result";
// Starts with 1 not 0
diff --git a/src/org/traccar/protocol/MeiligaoProtocolDecoder.java b/src/org/traccar/protocol/MeiligaoProtocolDecoder.java
index 9915eab8c..ee41c26c3 100644
--- a/src/org/traccar/protocol/MeiligaoProtocolDecoder.java
+++ b/src/org/traccar/protocol/MeiligaoProtocolDecoder.java
@@ -39,31 +39,31 @@ public class MeiligaoProtocolDecoder extends BaseProtocolDecoder {
}
private static final Pattern PATTERN = new PatternBuilder()
- .number("(dd)(dd)(dd).?(d+)?,") // time
- .expression("([AV]),") // validity
- .number("(d+)(dd.d+),") // latitude
+ .number("(dd)(dd)(dd).?(d+)?,") // time
+ .expression("([AV]),") // validity
+ .number("(d+)(dd.d+),") // latitude
.expression("([NS]),")
- .number("(d+)(dd.d+),") // longitude
+ .number("(d+)(dd.d+),") // longitude
.expression("([EW]),")
- .number("(d+.?d*)?,") // speed
- .number("(d+.?d*)?,") // course
- .number("(dd)(dd)(dd)") // date (ddmmyy)
+ .number("(d+.?d*)?,") // speed
+ .number("(d+.?d*)?,") // course
+ .number("(dd)(dd)(dd)") // date (ddmmyy)
.expression("[^\\|]*")
.groupBegin()
- .number("|(d+.d+)?") // hdop
- .number("|(-?d+.?d*)?") // altitude
- .number("|(xxxx)?") // state
+ .number("|(d+.d+)?") // hdop
+ .number("|(-?d+.?d*)?") // altitude
+ .number("|(xxxx)?") // state
.groupBegin()
- .number("|(xxxx),(xxxx)") // adc
+ .number("|(xxxx),(xxxx)") // adc
.number("(?:,(xxxx),(xxxx),(xxxx),(xxxx),(xxxx),(xxxx))?")
.groupBegin()
- .number("|x{16}") // cell
- .number("|(xx)") // gsm
- .number("|(x{8})") // odometer
+ .number("|x{16}") // cell
+ .number("|(xx)") // gsm
+ .number("|(x{8})") // odometer
.or()
- .number("|(x{9})") // odometer
+ .number("|(x{9})") // odometer
.groupBegin()
- .number("|(x{5,})") // rfid
+ .number("|(x{5,})") // rfid
.groupEnd("?")
.groupEnd("?")
.groupEnd("?")
@@ -72,30 +72,42 @@ public class MeiligaoProtocolDecoder extends BaseProtocolDecoder {
.compile();
private static final Pattern PATTERN_RFID = new PatternBuilder()
- .number("|(dd)(dd)(dd),") // time
- .number("(dd)(dd)(dd),") // Date (ddmmyy)
- .number("(d+)(dd.d+),") // latitude
+ .number("|(dd)(dd)(dd),") // time
+ .number("(dd)(dd)(dd),") // Date (ddmmyy)
+ .number("(d+)(dd.d+),") // latitude
.expression("([NS]),")
- .number("(d+)(dd.d+),") // longitude
+ .number("(d+)(dd.d+),") // longitude
.expression("([EW])")
.compile();
private static final Pattern PATTERN_OBD = new PatternBuilder()
- .number("(d+.d+),") // battery
- .number("(d+),") // rpm
- .number("(d+),") // speed
- .number("(d+.d+),") // throttle
- .number("(d+.d+),") // engine load
- .number("(-?d+),") // coolant temp
- .number("d+.d+,") // instantaneous fuel
- .number("(d+.d+),") // average fuel
- .number("(d+.d+),") // driving range
- .number("(d+.?d*),") // odometer
- .number("(d+.d+),")
- .number("(d+.d+),")
- .number("(d+),") // error code count
- .number("d+,") // harsh acceleration count
- .number("d+") // harsh break count
+ .number("(d+.d+),") // battery
+ .number("(d+),") // rpm
+ .number("(d+),") // speed
+ .number("(d+.d+),") // throttle
+ .number("(d+.d+),") // engine load
+ .number("(-?d+),") // coolant temp
+ .number("(d+.d+),") // instantaneous fuel
+ .number("(d+.d+),") // average fuel
+ .number("(d+.d+),") // driving range
+ .number("(d+.?d*),") // odometer
+ .number("(d+.d+),") // Single Fuel Consumption
+ .number("(d+.d+),") // Total Fuel Consumption
+ .number("(d+),") // error code count
+ .number("(d+),") // harsh acceleration count
+ .number("(d+)") // harsh break count
+ .compile();
+
+ private static final Pattern PATTERN_OBDA = new PatternBuilder()
+ .number("(d+),") // Total ignition
+ .number("(d+.d+),") // Total driving time
+ .number("(d+.d+),") // Total idling time
+ .number("(d+),") // Average hot start time
+ .number("(d+),") // Average speed
+ .number("(d+),") // history hightest speed
+ .number("(d+),") // history hightest rpm
+ .number("(d+),") // total harsh acceleration
+ .number("(d+)") // total harsh break n0
.compile();
public static final int MSG_HEARTBEAT = 0x0001;
@@ -110,6 +122,7 @@ public class MeiligaoProtocolDecoder extends BaseProtocolDecoder {
public static final int MSG_RFID = 0x9966;
public static final int MSG_OBD_RT = 0x9901;
+ public static final int MSG_OBD_RTA = 0x9902;
private DeviceSession identify(ChannelBuffer buf, Channel channel, SocketAddress remoteAddress) {
StringBuilder builder = new StringBuilder();
@@ -281,14 +294,37 @@ public class MeiligaoProtocolDecoder extends BaseProtocolDecoder {
position.set(Position.KEY_RPM, parser.nextInt());
position.set(Position.KEY_OBD_SPEED, parser.nextInt());
position.set(Position.KEY_THROTTLE, parser.nextDouble());
- position.set("engineLoad", parser.nextDouble());
+ position.set(Position.KEY_OBD_ENGINE_LOAD, parser.nextDouble());
position.set(Position.PREFIX_TEMP + 1, parser.nextInt());
position.set(Position.KEY_FUEL_CONSUMPTION, parser.nextDouble());
- position.set("drivingRange", parser.nextDouble() * 1000);
- position.set(Position.KEY_ODOMETER, parser.nextDouble() * 1000);
- position.set("singleFuelConsumption", parser.nextDouble());
- position.set("totalFuelConsumption", parser.nextDouble());
+ position.set(Position.KEY_OBD_AVERAGE_FUEL, parser.nextDouble());
+ position.set(Position.KEY_OBD_DRIVING_RANGE, parser.nextDouble());
+ position.set(Position.KEY_ODOMETER, parser.nextDouble());
+ position.set(Position.KEY_OBD_SINGLE_FUEL_CONSUMPTION, parser.nextDouble());
+ position.set(Position.KEY_OBD_TOTAL_FUEL_CONSUMPTION, parser.nextDouble());
+ position.set(Position.KEY_OBD_CURRENT_ERROR, parser.nextInt());
+ position.set(Position.KEY_OBD_HARSH_ACCELERATION, parser.nextInt());
+ position.set(Position.KEY_OBD_HARSH_BREAK, parser.nextInt());
+ return position;
+ }
+
+ private Position decodeObdA(Position position, String sentence) {
+ Parser parser = new Parser(PATTERN_OBDA, sentence);
+ if (!parser.matches()) {
+ return null;
+ }
+
+ getLastLocation(position, null);
+ position.set(Position.KEY_OBD_TOTAL_IGNITION, parser.nextInt());
+ position.set(Position.KEY_OBD_TOTAL_DRIVING_TIME, parser.nextDouble());
+ position.set(Position.KEY_OBD_TOTAL_IDLING_TIME, parser.nextDouble());
+ position.set(Position.KEY_OBD_AVERAGE_HOT_START, parser.nextInt());
+ position.set(Position.KEY_OBD_AVERAGE_SPEED, parser.nextInt());
+ position.set(Position.KEY_OBD_HISTORY_HIGHT_SPEED, parser.nextInt());
+ position.set(Position.KEY_OBD_HISTORY_HIGHT_RPM, parser.nextInt());
+ position.set(Position.KEY_OBD_TOTAL_HARSH_ACCELERATION, parser.nextInt());
+ position.set(Position.KEY_OBD_TOTAL_HARSH_BRAKE, parser.nextInt());
return position;
}
@@ -305,11 +341,11 @@ public class MeiligaoProtocolDecoder extends BaseProtocolDecoder {
if (channel != null) {
if (command == MSG_LOGIN) {
- response = ChannelBuffers.wrappedBuffer(new byte[] {0x01});
+ response = ChannelBuffers.wrappedBuffer(new byte[]{0x01});
sendResponse(channel, remoteAddress, id, MSG_LOGIN_RESPONSE, response);
return null;
} else if (command == MSG_HEARTBEAT) {
- response = ChannelBuffers.wrappedBuffer(new byte[] {0x01});
+ response = ChannelBuffers.wrappedBuffer(new byte[]{0x01});
sendResponse(channel, remoteAddress, id, MSG_HEARTBEAT, response);
return null;
} else if (command == MSG_SERVER) {
@@ -353,6 +389,8 @@ public class MeiligaoProtocolDecoder extends BaseProtocolDecoder {
return decodeRfid(position, sentence);
} else if (command == MSG_OBD_RT) {
return decodeObd(position, sentence);
+ } else if (command == MSG_OBD_RTA) {
+ return decodeObdA(position, sentence);
}
return null;
diff --git a/test/org/traccar/protocol/MeiligaoProtocolDecoderTest.java b/test/org/traccar/protocol/MeiligaoProtocolDecoderTest.java
index 10fa3f971..fb1c44bb7 100644
--- a/test/org/traccar/protocol/MeiligaoProtocolDecoderTest.java
+++ b/test/org/traccar/protocol/MeiligaoProtocolDecoderTest.java
@@ -17,7 +17,7 @@ public class MeiligaoProtocolDecoderTest extends ProtocolTest {
"2424007d0000000000000099553231303333302e3030302c562c343533342e333832342c532c30373230332e303630302c572c302e30302c302c3231313031362c2c2a31327c302e307c3332397c323030307c303030452c303030437c303244413030303145413634393541417c31307c30303030303030306e540d0a"));
verifyAttributes(decoder, binary(
- "4040005066104020094432990131302E312C302C3135362C302E30302C31392E36312C2D33342C33342E32362C32312E38332C372E39312C313033332C322E36392C362E35352C302C302C309DBF0D0A"));
+ "2424005066104020094432990131302E312C302C3135362C302E30302C31392E36312C2D33342C33342E32362C32312E38332C372E39312C313033332C322E36392C362E35352C302C302C309DBF0D0A"));
verifyPosition(decoder, binary(
"242400746251103044ffff99553033353033392e3939392c412c323832332e373632312c4e2c31303635322e303730342c572c3030302e302c3030302e302c3136303631362c2c2c412a37357c302e397c323038332e327c303030307c303030302c303030307c31303034333736333265780d0a"));