aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2018-06-08 14:05:41 +1200
committerAnton Tananaev <anton.tananaev@gmail.com>2018-06-08 14:05:41 +1200
commitacf93dbe1b5c03df4f8f82ffb7fb0cace767a416 (patch)
tree9751732b537a86285c49eb41b568289260e8afb9
parent6c68a7531289c4166b7e8ea58fc1ffdbe4893ed4 (diff)
downloadtrackermap-server-acf93dbe1b5c03df4f8f82ffb7fb0cace767a416.tar.gz
trackermap-server-acf93dbe1b5c03df4f8f82ffb7fb0cace767a416.tar.bz2
trackermap-server-acf93dbe1b5c03df4f8f82ffb7fb0cace767a416.zip
Clean up Svias decoder
-rw-r--r--setup/default.xml1
-rw-r--r--src/org/traccar/protocol/SviasProtocol.java4
-rw-r--r--src/org/traccar/protocol/SviasProtocolDecoder.java125
-rw-r--r--src/org/traccar/protocol/SviasProtocolEncoder.java5
-rw-r--r--test/org/traccar/protocol/SviasProtocolDecoderTest.java8
5 files changed, 61 insertions, 82 deletions
diff --git a/setup/default.xml b/setup/default.xml
index 66c72a877..ee80fb4df 100644
--- a/setup/default.xml
+++ b/setup/default.xml
@@ -243,5 +243,6 @@
<entry key='telemax.port'>5165</entry>
<entry key='sabertek.port'>5166</entry>
<entry key='retranslator.port'>5167</entry>
+ <entry key='svias.port'>5168</entry>
</properties>
diff --git a/src/org/traccar/protocol/SviasProtocol.java b/src/org/traccar/protocol/SviasProtocol.java
index 8a45f43cb..badf3d091 100644
--- a/src/org/traccar/protocol/SviasProtocol.java
+++ b/src/org/traccar/protocol/SviasProtocol.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@ import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.jboss.netty.handler.codec.string.StringEncoder;
import org.traccar.BaseProtocol;
+import org.traccar.CharacterDelimiterFrameDecoder;
import org.traccar.TrackerServer;
import java.util.List;
@@ -45,6 +46,7 @@ public class SviasProtocol extends BaseProtocol {
serverList.add(new TrackerServer(new ServerBootstrap(), getName()) {
@Override
protected void addSpecificHandlers(ChannelPipeline pipeline) {
+ pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "]"));
pipeline.addLast("stringEncoder", new StringEncoder());
pipeline.addLast("stringDecoder", new StringDecoder());
pipeline.addLast("objectEncoder", new SviasProtocolEncoder());
diff --git a/src/org/traccar/protocol/SviasProtocolDecoder.java b/src/org/traccar/protocol/SviasProtocolDecoder.java
index bc459de25..9375038ed 100644
--- a/src/org/traccar/protocol/SviasProtocolDecoder.java
+++ b/src/org/traccar/protocol/SviasProtocolDecoder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,12 +17,10 @@ package org.traccar.protocol;
import org.jboss.netty.channel.Channel;
import org.traccar.BaseProtocolDecoder;
+import org.traccar.helper.BitUtil;
import org.traccar.helper.PatternBuilder;
import java.net.SocketAddress;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.TimeZone;
import java.util.regex.Pattern;
import org.traccar.DeviceSession;
import org.traccar.helper.Parser;
@@ -36,99 +34,70 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder {
}
private static final Pattern PATTERN = new PatternBuilder()
- .text("[") // delimiter init
- .any()
- .number("(dddddddd),") // imei
- .any()
- .number("(d+),") // date (yyyymmdd)
- .number("(d+),") // time (hhmmss)
- .number("(-?d+),") // longitude
- .number("(-?d+),") // latitude
- .number("(d+),") // speed
- .number("(d+),") // course
- .number("(d+),") // odometer
- .number("(d+),") // input
- .number("(d+),") // output / status
- .any()
- .number("(ddddd),") // main power voltage
- .number("(d+),") // percentual power internal battery
- .number("(d+),") // RSSID
+ .text("[") // delimiter
+ .number("d{4},") // hardware version
+ .number("d{4},") // software version
+ .number("d+,") // index
+ .number("(d+),") // imei
+ .number("d+,") // hour meter
+ .number("(d+)(dd)(dd),") // date (dmmyy)
+ .number("(d+)(dd)(dd),") // time (hmmss)
+ .number("(-?)(d+)(dd)(d{5}),") // latitude
+ .number("(-?)(d+)(dd)(d{5}),") // longitude
+ .number("(d+),") // speed
+ .number("(d+),") // course
+ .number("(d+),") // odometer
+ .number("(d+),") // input
+ .number("(d+),") // output / status
+ .number("(d),")
+ .number("(d),")
+ .number("(d+),") // power
+ .number("(d+),") // battery level
+ .number("(d+),") // rssi
.any()
.compile();
- private double convertCoordinates(long v) {
- return Double.valueOf(((float) ((((float) v / 1.0E7F)
- - ((int) (v / 10000000L))) * 1.6666666666666667D)) + ((int) (v / 10000000L)));
- }
-
@Override
protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg)
throws Exception {
- String sentence = (String) msg;
- Object result = null;
-
- if (!sentence.contains(":")) {
-
- Parser parser = new Parser(PATTERN, (String) sentence);
- if (!parser.matches()) {
- return null;
- }
-
- Position position = new Position(getProtocolName());
-
- DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next());
- if (deviceSession == null) {
- return null;
- }
-
- position.setDeviceId(deviceSession.getDeviceId());
-
- DateFormat dateFormat = new SimpleDateFormat("ddMMyyHHmmss");
- dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
-
- String date = String.format("%06d", parser.nextInt());
- String time = String.format("%06d", parser.nextInt());
-
- position.setTime(dateFormat.parse(date + time));
-
- position.setLatitude(convertCoordinates(parser.nextLong()));
- position.setLongitude(convertCoordinates(parser.nextLong()));
- position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0) / 100));
- position.setCourse(parser.nextDouble(0) / 100);
- position.setAltitude(0);
-
- position.set(Position.KEY_ODOMETER, parser.nextInt());
-
- String input = new StringBuilder(String.format("%08d",
- Integer.parseInt(Integer.toString(parser.nextInt(), 2)))).reverse().toString();
-
- String output = new StringBuilder(String.format("%08d",
- Integer.parseInt(Integer.toString(parser.nextInt(), 2)))).reverse().toString();
+ Parser parser = new Parser(PATTERN, (String) msg);
+ if (!parser.matches()) {
+ return null;
+ }
- position.set(Position.KEY_ALARM, (input.substring(0, 1).equals("1")
- ? Position.ALARM_SOS : null));
+ DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next());
+ if (deviceSession == null) {
+ return null;
+ }
- position.set(Position.KEY_IGNITION, input.substring(4, 5).equals("1"));
+ Position position = new Position(getProtocolName());
+ position.setDeviceId(deviceSession.getDeviceId());
- position.setValid(output.substring(0, 1).equals("1"));
+ position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS));
+ position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN_MIN));
+ position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN_MIN));
+ position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble() * 0.01));
+ position.setCourse(parser.nextDouble() * 0.01);
- position.set(Position.KEY_POWER, parser.nextDouble(0) / 1000);
+ position.set(Position.KEY_ODOMETER, parser.nextInt() * 100);
- position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt());
+ int input = parser.nextInt();
+ int output = parser.nextInt();
- position.set(Position.KEY_RSSI, parser.nextInt());
+ position.set(Position.KEY_ALARM, BitUtil.check(input, 0) ? Position.ALARM_SOS : null);
+ position.set(Position.KEY_IGNITION, BitUtil.check(input, 4));
+ position.setValid(BitUtil.check(output, 0));
- result = position;
-
- }
+ position.set(Position.KEY_POWER, parser.nextInt() * 0.001);
+ position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt());
+ position.set(Position.KEY_RSSI, parser.nextInt());
if (channel != null) {
channel.write("@");
}
- return result;
-
+ return position;
}
}
diff --git a/src/org/traccar/protocol/SviasProtocolEncoder.java b/src/org/traccar/protocol/SviasProtocolEncoder.java
index 518268cab..c26ee2032 100644
--- a/src/org/traccar/protocol/SviasProtocolEncoder.java
+++ b/src/org/traccar/protocol/SviasProtocolEncoder.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2016 Anton Tananaev (anton@traccar.org)
- * Copyright 2016 Andrey Kunitsyn (andrey@traccar.org)
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ * Copyright 2018 Andrey Kunitsyn (andrey@traccar.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -47,4 +47,5 @@ public class SviasProtocolEncoder extends StringProtocolEncoder {
}
return null;
}
+
}
diff --git a/test/org/traccar/protocol/SviasProtocolDecoderTest.java b/test/org/traccar/protocol/SviasProtocolDecoderTest.java
index 064ab16f1..3bf355a15 100644
--- a/test/org/traccar/protocol/SviasProtocolDecoderTest.java
+++ b/test/org/traccar/protocol/SviasProtocolDecoderTest.java
@@ -11,7 +11,13 @@ public class SviasProtocolDecoderTest extends ProtocolTest {
SviasProtocolDecoder decoder = new SviasProtocolDecoder(new SviasProtocol());
verifyPosition(decoder, text(
- "[7061,3041,57,20324277,710,40618,141342,-93155840,-371754060,0,20469,0,16,1,0,0,11323,100,9,,32,4695]"));
+ "[7061,3041,57,20324277,710,40618,141342,-93155840,-371754060,0,20469,0,16,1,0,0,11323,100,9,,32,4695"));
+
+ verifyPosition(decoder, text(
+ "[7041,3041,8629,20856286,710,60618,201027,-92268040,-371346250,7994,31844,38271,16,1,0,0,13416,100,0,0,5089"));
+
+ verifyPosition(decoder, text(
+ "[7051,3041,15270,30179873,710,70618,40335,-94679080,-360604930,0,35454,23148,0,1,0,0,12542,100,13,32,4971"));
}