aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/protocol/Tk103ProtocolDecoder.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/traccar/protocol/Tk103ProtocolDecoder.java')
-rw-r--r--src/org/traccar/protocol/Tk103ProtocolDecoder.java44
1 files changed, 42 insertions, 2 deletions
diff --git a/src/org/traccar/protocol/Tk103ProtocolDecoder.java b/src/org/traccar/protocol/Tk103ProtocolDecoder.java
index 73ab08b59..95728c447 100644
--- a/src/org/traccar/protocol/Tk103ProtocolDecoder.java
+++ b/src/org/traccar/protocol/Tk103ProtocolDecoder.java
@@ -38,7 +38,7 @@ public class Tk103ProtocolDecoder extends BaseProtocolDecoder {
.number("(d+)(,)?") // device id
.expression(".{4},?") // command
.number("d*") // imei?
- .number("(dd)(dd)(dd),?") // date (yymmdd)
+ .number("(dd)(dd)(dd),?") // date
.expression("([AV]),?") // validity
.number("(dd)(dd.d+)") // latitude
.expression("([NS]),?")
@@ -53,6 +53,17 @@ public class Tk103ProtocolDecoder extends BaseProtocolDecoder {
.text(")").optional()
.compile();
+ private static final Pattern PATTERN_BATTERY = new PatternBuilder()
+ .number("(d+),") // device id
+ .text("ZC20,")
+ .number("(dd)(dd)(dd),") // date (ddmmyy)
+ .number("(dd)(dd)(dd),") // time
+ .number("d+,") // battery level
+ .number("(d+),") // battery voltage
+ .number("(d+),") // power voltage
+ .number("d+") // installed
+ .compile();
+
@Override
protected Object decode(
Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
@@ -77,7 +88,36 @@ public class Tk103ProtocolDecoder extends BaseProtocolDecoder {
}
}
- Parser parser = new Parser(PATTERN, sentence);
+ Parser parser = new Parser(PATTERN_BATTERY, sentence);
+ if (parser.matches()) {
+ Position position = new Position();
+ position.setProtocol(getProtocolName());
+
+ if (!identify(parser.next(), channel)) {
+ return null;
+ }
+ position.setDeviceId(getDeviceId());
+
+ DateBuilder dateBuilder = new DateBuilder()
+ .setDateReverse(parser.nextInt(), parser.nextInt(), parser.nextInt())
+ .setTime(parser.nextInt(), parser.nextInt(), parser.nextInt());
+
+ getLastLocation(position, dateBuilder.getDate());
+
+ int battery = parser.nextInt();
+ if (battery != 65535) {
+ position.set(Event.KEY_BATTERY, battery);
+ }
+
+ int power = parser.nextInt();
+ if (power != 65535) {
+ position.set(Event.KEY_POWER, battery);
+ }
+
+ return position;
+ }
+
+ parser = new Parser(PATTERN, sentence);
if (!parser.matches()) {
return null;
}