diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2018-06-08 14:05:41 +1200 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2018-06-08 14:05:41 +1200 |
commit | acf93dbe1b5c03df4f8f82ffb7fb0cace767a416 (patch) | |
tree | 9751732b537a86285c49eb41b568289260e8afb9 | |
parent | 6c68a7531289c4166b7e8ea58fc1ffdbe4893ed4 (diff) | |
download | trackermap-server-acf93dbe1b5c03df4f8f82ffb7fb0cace767a416.tar.gz trackermap-server-acf93dbe1b5c03df4f8f82ffb7fb0cace767a416.tar.bz2 trackermap-server-acf93dbe1b5c03df4f8f82ffb7fb0cace767a416.zip |
Clean up Svias decoder
-rw-r--r-- | setup/default.xml | 1 | ||||
-rw-r--r-- | src/org/traccar/protocol/SviasProtocol.java | 4 | ||||
-rw-r--r-- | src/org/traccar/protocol/SviasProtocolDecoder.java | 125 | ||||
-rw-r--r-- | src/org/traccar/protocol/SviasProtocolEncoder.java | 5 | ||||
-rw-r--r-- | test/org/traccar/protocol/SviasProtocolDecoderTest.java | 8 |
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")); } |