aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/traccar/protocol/Tk103ProtocolDecoder.java30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/main/java/org/traccar/protocol/Tk103ProtocolDecoder.java b/src/main/java/org/traccar/protocol/Tk103ProtocolDecoder.java
index 325d2ebeb..1a45fbf75 100644
--- a/src/main/java/org/traccar/protocol/Tk103ProtocolDecoder.java
+++ b/src/main/java/org/traccar/protocol/Tk103ProtocolDecoder.java
@@ -131,6 +131,14 @@ public class Tk103ProtocolDecoder extends BaseProtocolDecoder {
.any()
.compile();
+ private static final Pattern PATTERN_VIN = new PatternBuilder()
+ .text("(")
+ .number("(d+)") // device id
+ .expression("BV00") // command
+ .expression("(.{17})") // vin
+ .text(")")
+ .compile();
+
private String decodeAlarm(int value) {
switch (value) {
case 1:
@@ -370,7 +378,27 @@ public class Tk103ProtocolDecoder extends BaseProtocolDecoder {
position.set(Position.KEY_RESULT, parser.next());
return position;
+ }
+
+ private Position decodeVin(Channel channel, SocketAddress remoteAddress, String sentence) {
+ Parser parser = new Parser(PATTERN_VIN, sentence);
+ if (!parser.matches()) {
+ return null;
+ }
+ DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next());
+ if (deviceSession == null) {
+ return null;
+ }
+
+ Position position = new Position(getProtocolName());
+ position.setDeviceId(deviceSession.getDeviceId());
+
+ getLastLocation(position, null);
+
+ position.set(Position.KEY_VIN, parser.next());
+
+ return position;
}
@Override
@@ -398,6 +426,8 @@ public class Tk103ProtocolDecoder extends BaseProtocolDecoder {
return decodeCommandResult(channel, remoteAddress, sentence);
} else if (sentence.contains("DW5")) {
return decodeLbsWifi(channel, remoteAddress, sentence);
+ } else if (sentence.contains("BV00")) {
+ return decodeVin(channel, remoteAddress, sentence);
}
Parser parser = new Parser(PATTERN, sentence);