From 0fdd72c382cd23e963270e032aab5cdf42d6116f Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 13 Dec 2015 10:02:56 +1300 Subject: Add new format to Totem protocol decoder --- src/org/traccar/protocol/TotemProtocolDecoder.java | 64 +++++++++++++++++++++- .../traccar/protocol/TotemProtocolDecoderTest.java | 4 +- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/org/traccar/protocol/TotemProtocolDecoder.java b/src/org/traccar/protocol/TotemProtocolDecoder.java index ccb6fcb01..bb72c2d64 100644 --- a/src/org/traccar/protocol/TotemProtocolDecoder.java +++ b/src/org/traccar/protocol/TotemProtocolDecoder.java @@ -22,6 +22,7 @@ import org.traccar.BaseProtocolDecoder; import org.traccar.helper.DateBuilder; import org.traccar.helper.Parser; import org.traccar.helper.PatternBuilder; +import org.traccar.helper.UnitsConverter; import org.traccar.model.Event; import org.traccar.model.Position; @@ -124,6 +125,32 @@ public class TotemProtocolDecoder extends BaseProtocolDecoder { .any() .compile(); + private static final Pattern PATTERN4 = new PatternBuilder() + .text("$$") // header + .number("dddd") // length + .text("AA") // type + .number("(d+)|") // imei + .number("(x{8})") // status + .number("(dd)(dd)(dd)") // date (yymmdd) + .number("(dd)(dd)(dd)") // time + .number("(dd)") // battery + .number("(dd)") // external power + .number("(dddd)") // adc 1 + .number("(xxxx)") // lac + .number("(xxxx)") // cid + .number("(dd)") // satellites + .number("(dd)") // gsm + .number("(ddd)") // course + .number("(ddd)") // speed + .number("(dd.d)") // hdop + .number("(d{7})") // odometer + .number("(dd)(dd.dddd)([NS])") // latitude + .number("(ddd)(dd.dddd)([EW])") // longitude + .number("dddd") // serial number + .number("xx") // checksum + .any() + .compile(); + @Override protected Object decode( Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { @@ -132,7 +159,9 @@ public class TotemProtocolDecoder extends BaseProtocolDecoder { // Determine format Pattern pattern = PATTERN3; - if (sentence.contains("$GPRMC")) { + if (sentence.indexOf("AA") == 6) { + pattern = PATTERN4; + } else if (sentence.contains("$GPRMC")) { pattern = PATTERN1; } else { int index = sentence.indexOf('|'); @@ -154,10 +183,10 @@ public class TotemProtocolDecoder extends BaseProtocolDecoder { } position.setDeviceId(getDeviceId()); - position.set(Event.KEY_ALARM, parser.next()); - if (pattern == PATTERN1 || pattern == PATTERN2) { + position.set(Event.KEY_ALARM, parser.next()); + DateBuilder dateBuilder = new DateBuilder(); int year = 0; if (pattern == PATTERN2) { @@ -201,6 +230,8 @@ public class TotemProtocolDecoder extends BaseProtocolDecoder { } else if (pattern == PATTERN3) { + position.set(Event.KEY_ALARM, parser.next()); + DateBuilder dateBuilder = new DateBuilder() .setDateReverse(parser.nextInt(), parser.nextInt(), parser.nextInt()) .setTime(parser.nextInt(), parser.nextInt(), parser.nextInt()); @@ -229,6 +260,33 @@ public class TotemProtocolDecoder extends BaseProtocolDecoder { position.setLatitude(parser.nextCoordinate()); position.setLongitude(parser.nextCoordinate()); + } else if (pattern == PATTERN4) { + + position.set(Event.KEY_STATUS, parser.next()); + + DateBuilder dateBuilder = new DateBuilder() + .setDate(parser.nextInt(), parser.nextInt(), parser.nextInt()) + .setTime(parser.nextInt(), parser.nextInt(), parser.nextInt()); + position.setTime(dateBuilder.getDate()); + + position.set(Event.KEY_BATTERY, parser.nextDouble() / 10); + position.set(Event.KEY_POWER, parser.nextDouble()); + position.set(Event.PREFIX_ADC + 1, parser.next()); + position.set(Event.KEY_LAC, parser.nextInt(16)); + position.set(Event.KEY_CID, parser.nextInt(16)); + position.set(Event.KEY_SATELLITES, parser.nextInt()); + position.set(Event.KEY_GSM, parser.nextInt()); + + position.setCourse(parser.nextDouble()); + position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble())); + + position.set(Event.KEY_HDOP, parser.nextDouble()); + position.set(Event.KEY_ODOMETER, parser.nextInt()); + + position.setValid(true); + position.setLatitude(parser.nextCoordinate()); + position.setLongitude(parser.nextCoordinate()); + } if (channel != null) { diff --git a/test/org/traccar/protocol/TotemProtocolDecoderTest.java b/test/org/traccar/protocol/TotemProtocolDecoderTest.java index 9fb014b87..de554b7bc 100644 --- a/test/org/traccar/protocol/TotemProtocolDecoderTest.java +++ b/test/org/traccar/protocol/TotemProtocolDecoderTest.java @@ -11,7 +11,9 @@ public class TotemProtocolDecoderTest extends ProtocolTest { TotemProtocolDecoder decoder = new TotemProtocolDecoder(new TotemProtocol()); // $$0128AA867521029231005|1880100015101802314842140000000000000000000000001AB48366093127600000.900000000806.1947N09818.4795E080355 - // $$0108AA864244026063437|1A0000001401010101014111000027BA0E57003100000000.000000000000.0000N00000.0000E048156 + + verifyPosition(decoder, text( + "$$0108AA864244026063437|1A0000001401010101014111000027BA0E57003100000000.000000000000.0000N00000.0000E048156")); verifyPosition(decoder, text( "$$BE863771024392112|AA$GPRMC,044704.000,A,1439.3334,N,12059.1417,E,0.00,0.00,200815,,,A*67|01.7|00.8|01.4|000000000000|20150820044704|14291265|00000000|4EECBF8B31|0000|0.0000|0002|00000|56E7"), -- cgit v1.2.3