From bf0bf92ddadee86fc92841fe6087e5a7910bc0a2 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Fri, 7 Oct 2016 05:35:45 +1300 Subject: Support short Fifotrack format --- .../traccar/protocol/FifotrackProtocolDecoder.java | 26 +++++++++++++--------- .../protocol/FifotrackProtocolDecoderTest.java | 6 +++++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/org/traccar/protocol/FifotrackProtocolDecoder.java b/src/org/traccar/protocol/FifotrackProtocolDecoder.java index 9e8d01117..9c0f6be5a 100644 --- a/src/org/traccar/protocol/FifotrackProtocolDecoder.java +++ b/src/org/traccar/protocol/FifotrackProtocolDecoder.java @@ -51,15 +51,15 @@ public class FifotrackProtocolDecoder extends BaseProtocolDecoder { .number("(d+),") // odometer .number("d+,") // runtime .number("(xxxx),") // status - .number("(x+),") // input - .number("(x+),") // output + .number("(x+)?,") // input + .number("(x+)?,") // output .number("(d+)|") // mcc .number("(d+)|") // mnc .number("(x+)|") // lac .number("(x+),") // cid - .number("([x|]+),") // adc - .expression("([^,]+),") // rfid - .expression("([^*]+)") // sensors + .number("([x|]+)") // adc + .expression(",([^,]+)") // rfid + .expression(",([^*]+)").optional(2) // sensors .any() .compile(); @@ -97,8 +97,12 @@ public class FifotrackProtocolDecoder extends BaseProtocolDecoder { position.set(Position.KEY_ODOMETER, parser.nextLong()); position.set(Position.KEY_STATUS, parser.nextInt(16)); - position.set(Position.KEY_INPUT, parser.nextInt(16)); - position.set(Position.KEY_OUTPUT, parser.nextInt(16)); + if (parser.hasNext()) { + position.set(Position.KEY_INPUT, parser.nextInt(16)); + } + if (parser.hasNext()) { + position.set(Position.KEY_OUTPUT, parser.nextInt(16)); + } position.set(Position.KEY_MCC, parser.nextInt()); position.set(Position.KEY_MNC, parser.nextInt()); @@ -112,9 +116,11 @@ public class FifotrackProtocolDecoder extends BaseProtocolDecoder { position.set(Position.KEY_RFID, parser.next()); - String[] sensors = parser.next().split("\\|"); - for (int i = 0; i < sensors.length; i++) { - position.set(Position.PREFIX_IO + (i + 1), sensors[i]); + if (parser.hasNext()) { + String[] sensors = parser.next().split("\\|"); + for (int i = 0; i < sensors.length; i++) { + position.set(Position.PREFIX_IO + (i + 1), sensors[i]); + } } return position; diff --git a/test/org/traccar/protocol/FifotrackProtocolDecoderTest.java b/test/org/traccar/protocol/FifotrackProtocolDecoderTest.java index 60f22a91a..fa45516a2 100644 --- a/test/org/traccar/protocol/FifotrackProtocolDecoderTest.java +++ b/test/org/traccar/protocol/FifotrackProtocolDecoderTest.java @@ -10,6 +10,12 @@ public class FifotrackProtocolDecoderTest extends ProtocolTest { FifotrackProtocolDecoder decoder = new FifotrackProtocolDecoder(new FifotrackProtocol()); + verifyPosition(decoder, text( + "$$103,866104023179743,5,A00,,161006192841,A,54.738791,25.271918,0,342,200,0,4265,0000,0,,246|1|65|96DB,9C4|0*75")); + + verifyPosition(decoder, text( + "$$103,866104023179743,4,A00,,161006192810,V,54.738791,25.271918,0,158,122,0,4235,0000,0,,246|1|65|96DB,9C5|0*69")); + verifyPosition(decoder, text( "$$135,866104023192332,29,A01,,160606093046,A,22.546430,114.079730,0,186,181,0,415322,0000,02,2,460|0|27B3|EA7,A2F|3B9|3|0,940C7E,31.76|30.98*46")); -- cgit v1.2.3