From 5f2fc476b549fa8555d6d764dbd8279fa754fc49 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 13 Jul 2019 17:07:00 -0700 Subject: Improve GoSafe decoder --- .../traccar/protocol/GoSafeProtocolDecoder.java | 59 ++++++++-------------- .../protocol/GoSafeProtocolDecoderTest.java | 3 ++ 2 files changed, 25 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/traccar/protocol/GoSafeProtocolDecoder.java b/src/main/java/org/traccar/protocol/GoSafeProtocolDecoder.java index 95ef18f20..8164a016d 100644 --- a/src/main/java/org/traccar/protocol/GoSafeProtocolDecoder.java +++ b/src/main/java/org/traccar/protocol/GoSafeProtocolDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2015 - 2018 Anton Tananaev (anton@traccar.org) + * Copyright 2015 - 2019 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. @@ -30,7 +30,8 @@ import org.traccar.model.Network; import org.traccar.model.Position; import java.net.SocketAddress; -import java.util.Date; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.LinkedList; import java.util.List; import java.util.regex.Pattern; @@ -45,8 +46,6 @@ public class GoSafeProtocolDecoder extends BaseProtocolDecoder { .text("*GS") // header .number("d+,") // protocol version .number("(d+),") // imei - .number("(dd)(dd)(dd)") // time (hhmmss) - .number("(dd)(dd)(dd),") // date (ddmmyy) .expression("([^#]*)#?") // data .compile(); @@ -68,6 +67,7 @@ public class GoSafeProtocolDecoder extends BaseProtocolDecoder { .compile(); private void decodeFragment(Position position, String fragment) { + int dataIndex = fragment.indexOf(':'); int index = 0; String[] values; @@ -76,6 +76,7 @@ public class GoSafeProtocolDecoder extends BaseProtocolDecoder { } else { values = fragment.substring(dataIndex + 1).split(";"); } + switch (fragment.substring(0, dataIndex)) { case "GPS": position.setValid(values[index++].equals("A")); @@ -171,42 +172,27 @@ public class GoSafeProtocolDecoder extends BaseProtocolDecoder { } } - private Object decodeData(DeviceSession deviceSession, Date time, String data) { - - List positions = new LinkedList<>(); - Position position = null; - int index = 0; - String[] fragments = data.split(","); + private Position decodePosition(DeviceSession deviceSession, String sentence) throws ParseException { - while (index < fragments.length) { + Position position = new Position(getProtocolName()); + position.setDeviceId(deviceSession.getDeviceId()); - if (fragments[index].isEmpty() || Character.isDigit(fragments[index].charAt(0))) { - - if (position != null) { - positions.add(position); - } + int index = 0; + String[] fragments = sentence.split(","); - position = new Position(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - position.setTime(time); + position.setTime(new SimpleDateFormat("HHmmssddMMyy").parse(fragments[index++])); - if (!fragments[index++].isEmpty()) { - position.set(Position.KEY_EVENT, Integer.parseInt(fragments[index - 1])); + for (; index < fragments.length; index += 1) { + if (!fragments[index].isEmpty()) { + if (Character.isDigit(fragments[index].charAt(0))) { + position.set(Position.KEY_EVENT, Integer.parseInt(fragments[index])); + } else { + decodeFragment(position, fragments[index]); } - - } else { - - decodeFragment(position, fragments[index++]); - } - } - if (position != null) { - positions.add(position); - } - - return positions; + return position; } @Override @@ -256,12 +242,11 @@ public class GoSafeProtocolDecoder extends BaseProtocolDecoder { } else { - Date time = new Date(); - if (parser.hasNext(6)) { - time = parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY); + List positions = new LinkedList<>(); + for (String item : parser.next().split("$")) { + positions.add(decodePosition(deviceSession, item)); } - - return decodeData(deviceSession, time, parser.next()); + return positions; } } diff --git a/src/test/java/org/traccar/protocol/GoSafeProtocolDecoderTest.java b/src/test/java/org/traccar/protocol/GoSafeProtocolDecoderTest.java index 70c86bb23..4fbfa6fc1 100644 --- a/src/test/java/org/traccar/protocol/GoSafeProtocolDecoderTest.java +++ b/src/test/java/org/traccar/protocol/GoSafeProtocolDecoderTest.java @@ -10,6 +10,9 @@ public class GoSafeProtocolDecoderTest extends ProtocolTest { GoSafeProtocolDecoder decoder = new GoSafeProtocolDecoder(null); + verifyPositions(decoder, text( + "*GS06,860078024206844,075029250619,,SYS:G3SC;V3.37;V1.1.8,GPS:A;10;N3.009522;E101.512320;5;137;31;0.69,COT:27376703,ADC:25.81;4.28;2.60,DTT:5004;E1;0;0;0;3$075031250619,,SYS:G3SC;V3.37;V1.1.8,GPS:A;9;N3.009488;E101.512344;6;145;31;0.76,COT:27376703,ADC:25.58;4.25;2.28,DTT:5004;E1;0;0;0;3$075033250619,,SYS:G3SC;V3.37;V1.1.8,GPS:A;10;N3.009459;E101.512360;5;152;31;0.69,COT:27376722,ADC:25.78;4.29;2.30,DTT:5004;E1;0;0;0;3#")); + verifyPositions(decoder, text( "*GS06,860078024226974,101437211218,,SYS:G3SC;V3.36;V1.1.8,GPS:A;7;N3.052302;E101.787216;16;137;48;1.58,COT:4261733103,ADC:22.86;0.58;0.01,DTT:4004;E1;0;0;0;3$101439211218,,SYS:G3SC;V3.36;V1.1.8,GPS:A;8;N3.052265;E101.787200;12;152;46;1.31,COT:4261733103,ADC:22.98;0.58;0.01,DTT:4004;E1;0;0;0;3$101441211218,,SYS:G3SC;V3.36;V1.1.8,GPS:A;8;N3.052247;E101.787232;8;131;46;1.34,COT:4261733103,ADC:23.13;0.58;0.01,DTT:4004;E1;0;0;0;3$101510211218,,SYS:G3SC;V3.36;V1.1.8,GPS:A;8;N3.052150;E101.787152;0;131;40;0.97,COT:4261733160,ADC:22.88;0.58;0.01,DTT:4000;E1;0;0;0;1$101540211218,,SYS:G3SC;V3.36;V1.1.8,GPS:A;7;N3.052150;E101.787152;0;131;40;0.97,COT:4261733160,ADC:22.91;0.58;0.00,DTT:4000;E1;0;0;0;1#")); -- cgit v1.2.3