From 997ea52de4da2ac0ebbd332982dba70cba30a069 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 28 Oct 2015 14:04:53 +1300 Subject: Refactor Carscop protocol decoder --- .../traccar/protocol/CarscopProtocolDecoder.java | 100 ++++++++------------- .../protocol/CarscopProtocolDecoderTest.java | 3 +- 2 files changed, 39 insertions(+), 64 deletions(-) diff --git a/src/org/traccar/protocol/CarscopProtocolDecoder.java b/src/org/traccar/protocol/CarscopProtocolDecoder.java index 6a23d381d..db38cb4f0 100644 --- a/src/org/traccar/protocol/CarscopProtocolDecoder.java +++ b/src/org/traccar/protocol/CarscopProtocolDecoder.java @@ -16,12 +16,12 @@ package org.traccar.protocol; import java.net.SocketAddress; -import java.util.Calendar; -import java.util.TimeZone; -import java.util.regex.Matcher; import java.util.regex.Pattern; import org.jboss.netty.channel.Channel; import org.traccar.BaseProtocolDecoder; +import org.traccar.helper.DateBuilder; +import org.traccar.helper.Parser; +import org.traccar.helper.PatternBuilder; import org.traccar.model.Event; import org.traccar.model.Position; @@ -31,28 +31,28 @@ public class CarscopProtocolDecoder extends BaseProtocolDecoder { super(protocol); } - private static final Pattern PATTERN = Pattern.compile( - "\\*.*" + - "(\\d{2})(\\d{2})(\\d{2})" + // Time (HHMMSS) - "([AV])" + // Validity - "(\\d{2})(\\d{2}\\.\\d{4})" + // Latitude (DDMM.MMMM) - "([NS])" + - "(\\d{3})(\\d{2}\\.\\d{4})" + // Longitude (DDDMM.MMMM) - "([EW])" + - "(\\d{3}\\.\\d)" + // Speed - "(\\d{2})(\\d{2})(\\d{2})" + // Date (YYMMDD) - "(\\d{3}\\.\\d{2})" + // Course - "(\\d{8})" + // State - "L(\\d{6})"); // Odometer + private static final Pattern PATTERN = new PatternBuilder() + .text("*") + .any() + .number("(dd)(dd)(dd)") // time + .expression("([AV])") // validity + .number("(dd)(dd.dddd)") // latitude + .expression("([NS])") + .number("(ddd)(dd.dddd)") // longitude + .expression("([EW])") + .number("(ddd.d)") // speed + .number("(dd)(dd)(dd)") // date (yymmdd) + .number("(ddd.dd)") // course + .number("(d{8})") // state + .number("L(d{6})") // odometer + .compile(); @Override protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) - throws Exception { + Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { String sentence = (String) msg; - // Device identification int index = sentence.indexOf("UB05"); if (index != -1) { String imei = sentence.substring(index + 4, index + 4 + 15); @@ -62,57 +62,31 @@ public class CarscopProtocolDecoder extends BaseProtocolDecoder { return null; } - // Parse message - Matcher parser = PATTERN.matcher(sentence); + Parser parser = new Parser(PATTERN, sentence); if (!parser.matches()) { return null; } - // Create new position Position position = new Position(); position.setDeviceId(getDeviceId()); position.setProtocol(getProtocolName()); - index = 1; - - // Time - Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - time.clear(); - time.set(Calendar.HOUR_OF_DAY, Integer.parseInt(parser.group(index++))); - time.set(Calendar.MINUTE, Integer.parseInt(parser.group(index++))); - time.set(Calendar.SECOND, Integer.parseInt(parser.group(index++))); - - // Validity - position.setValid(parser.group(index++).compareTo("A") == 0); - - // Latitude - double latitude = Double.parseDouble(parser.group(index++)); - latitude += Double.parseDouble(parser.group(index++)) / 60; - if (parser.group(index++).compareTo("S") == 0) latitude = -latitude; - position.setLatitude(latitude); - - // Longitude - double longitude = Double.parseDouble(parser.group(index++)); - longitude += Double.parseDouble(parser.group(index++)) / 60; - if (parser.group(index++).compareTo("W") == 0) longitude = -longitude; - position.setLongitude(longitude); - - // Speed - position.setSpeed(Double.parseDouble(parser.group(index++))); - - // Date - time.set(Calendar.YEAR, 2000 + Integer.parseInt(parser.group(index++))); - time.set(Calendar.MONTH, Integer.parseInt(parser.group(index++)) - 1); - time.set(Calendar.DAY_OF_MONTH, Integer.parseInt(parser.group(index++))); - position.setTime(time.getTime()); - - // Course - position.setCourse(Double.parseDouble(parser.group(index++))); - - // State - position.set(Event.KEY_STATUS, parser.group(index++)); - - // Odometer - position.set(Event.KEY_ODOMETER, Integer.parseInt(parser.group(index++))); + + DateBuilder dateBuilder = new DateBuilder() + .setTime(parser.nextInt(), parser.nextInt(), parser.nextInt()); + + position.setValid(parser.next().equals("A")); + position.setLatitude(parser.nextCoordinate()); + position.setLongitude(parser.nextCoordinate()); + position.setSpeed(parser.nextDouble()); + + dateBuilder.setDate(parser.nextInt(), parser.nextInt(), parser.nextInt()); + position.setTime(dateBuilder.getDate()); + + position.setCourse(parser.nextDouble()); + + position.set(Event.KEY_STATUS, parser.next()); + position.set(Event.KEY_ODOMETER, parser.nextInt()); + return position; } diff --git a/test/org/traccar/protocol/CarscopProtocolDecoderTest.java b/test/org/traccar/protocol/CarscopProtocolDecoderTest.java index eff28224f..5723ca843 100644 --- a/test/org/traccar/protocol/CarscopProtocolDecoderTest.java +++ b/test/org/traccar/protocol/CarscopProtocolDecoderTest.java @@ -11,7 +11,8 @@ public class CarscopProtocolDecoderTest extends ProtocolDecoderTest { CarscopProtocolDecoder decoder = new CarscopProtocolDecoder(new CarscopProtocol()); verifyPosition(decoder, text( - "*040331141830UB05123456789012345061825A2934.0133N10627.2544E000.0040331309.6200000000L000000")); + "*040331141830UB05123456789012345061825A2934.0133N10627.2544E000.0040331309.6200000000L000000"), + position("2004-03-31 06:18:25.000", true, 29.56689, 106.45424)); verifyPosition(decoder, text( "*040331141830UB04999999984061825A2934.0133N10627.2544E000.0040331309.6200000000L000000")); -- cgit v1.2.3