diff options
Diffstat (limited to 'src/org/traccar/protocol/SviasProtocolDecoder.java')
-rw-r--r-- | src/org/traccar/protocol/SviasProtocolDecoder.java | 125 |
1 files changed, 47 insertions, 78 deletions
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;
}
}
|