From acf93dbe1b5c03df4f8f82ffb7fb0cace767a416 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 8 Jun 2018 14:05:41 +1200 Subject: Clean up Svias decoder --- setup/default.xml | 1 + src/org/traccar/protocol/SviasProtocol.java | 4 +- src/org/traccar/protocol/SviasProtocolDecoder.java | 125 ++++++++------------- src/org/traccar/protocol/SviasProtocolEncoder.java | 5 +- .../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 @@ 5165 5166 5167 + 5168 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")); } -- cgit v1.2.3