aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/traccar/protocol/Vt200ProtocolDecoder.java47
-rw-r--r--src/test/java/org/traccar/protocol/Vt200ProtocolDecoderTest.java19
2 files changed, 46 insertions, 20 deletions
diff --git a/src/main/java/org/traccar/protocol/Vt200ProtocolDecoder.java b/src/main/java/org/traccar/protocol/Vt200ProtocolDecoder.java
index b1564abd9..84ad09caa 100644
--- a/src/main/java/org/traccar/protocol/Vt200ProtocolDecoder.java
+++ b/src/main/java/org/traccar/protocol/Vt200ProtocolDecoder.java
@@ -67,37 +67,46 @@ public class Vt200ProtocolDecoder extends BaseProtocolDecoder {
int type = buf.readUnsignedShort();
buf.readUnsignedShort(); // length
- if (type == 0x2086 || type == 0x2084 || type == 0x2082) {
+ if (type == 0x2086 || type == 0x2084 || type == 0x2082 || type == 0x3089) {
Position position = new Position(getProtocolName());
position.setDeviceId(deviceSession.getDeviceId());
- buf.readUnsignedByte(); // data type
+ if (type == 0x3089) {
+ position.set(Position.KEY_IGNITION, buf.readUnsignedByte() == 1);
+ } else {
+ buf.readUnsignedByte(); // data type
+ }
+
buf.readUnsignedShort(); // trip id
position.setTime(decodeDate(buf));
- position.setLatitude(decodeCoordinate(BcdUtil.readInteger(buf, 8)));
- position.setLongitude(decodeCoordinate(BcdUtil.readInteger(buf, 9)));
-
- int flags = buf.readUnsignedByte();
- position.setValid(BitUtil.check(flags, 0));
- if (!BitUtil.check(flags, 1)) {
- position.setLatitude(-position.getLatitude());
- }
- if (!BitUtil.check(flags, 2)) {
- position.setLongitude(-position.getLongitude());
+ if (buf.readableBytes() > 2) {
+ position.setLatitude(decodeCoordinate(BcdUtil.readInteger(buf, 8)));
+ position.setLongitude(decodeCoordinate(BcdUtil.readInteger(buf, 9)));
+
+ int flags = buf.readUnsignedByte();
+ position.setValid(BitUtil.check(flags, 0));
+ if (!BitUtil.check(flags, 1)) {
+ position.setLatitude(-position.getLatitude());
+ }
+ if (!BitUtil.check(flags, 2)) {
+ position.setLongitude(-position.getLongitude());
+ }
}
- position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte()));
- position.setCourse(buf.readUnsignedByte() * 2);
+ if (type != 0x3089) {
+ position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte()));
+ position.setCourse(buf.readUnsignedByte() * 2);
- position.set(Position.KEY_SATELLITES, buf.readUnsignedByte());
- position.set(Position.KEY_RSSI, buf.readUnsignedByte());
- position.set(Position.KEY_ODOMETER, buf.readUnsignedInt() * 1000);
- position.set(Position.KEY_STATUS, buf.readUnsignedInt());
+ position.set(Position.KEY_SATELLITES, buf.readUnsignedByte());
+ position.set(Position.KEY_RSSI, buf.readUnsignedByte());
+ position.set(Position.KEY_ODOMETER, buf.readUnsignedInt() * 1000);
+ position.set(Position.KEY_STATUS, buf.readUnsignedInt());
- // additional data
+ // additional data
+ }
return position;
diff --git a/src/test/java/org/traccar/protocol/Vt200ProtocolDecoderTest.java b/src/test/java/org/traccar/protocol/Vt200ProtocolDecoderTest.java
index 423d4342c..791751c27 100644
--- a/src/test/java/org/traccar/protocol/Vt200ProtocolDecoderTest.java
+++ b/src/test/java/org/traccar/protocol/Vt200ProtocolDecoderTest.java
@@ -2,6 +2,7 @@ package org.traccar.protocol;
import org.junit.Test;
import org.traccar.ProtocolTest;
+import org.traccar.model.Position;
public class Vt200ProtocolDecoderTest extends ProtocolTest {
@@ -43,7 +44,7 @@ public class Vt200ProtocolDecoderTest extends ProtocolTest {
verifyPosition(decoder, binary(
"28631037309456208200210103302307171805444417097301147188170198090f0000073a002000007e00074429"));
- verifyNull(decoder, binary(
+ verifyPosition(decoder, binary(
"286310373094563089001200032f2107171740144417075001147188872c29"));
verifyAttributes(decoder, binary(
@@ -55,6 +56,22 @@ public class Vt200ProtocolDecoderTest extends ProtocolTest {
verifyPosition(decoder, binary(
"28631037309456208400340102dc090617161654441577230114439597368c0a0c0000030500200100417c1baa349d3290510000006a00007000003d15004c11c629"));
+ verifyPosition(decoder, binary(
+ "2830140414000130890009010003280414090004df29"),
+ position("2014-04-28 09:00:04.000", false, 0.0, 0.0));
+
+ verifyPosition(decoder, binary(
+ "2830140414000130890012000003280414090004224388161134912397df29"),
+ position("2014-04-28 09:00:04.000", true, 22.73136, 113.81873166666666));
+
+ verifyAttribute(decoder, binary(
+ "2830140414000130890012000003280414090004224388161134912397df29"),
+ Position.KEY_IGNITION, false);
+
+ verifyAttribute(decoder, binary(
+ "2830140414000130890012010003280414090004224388161134912397df29"),
+ Position.KEY_IGNITION, true);
+
}
}