diff options
Diffstat (limited to 'src/main/java/org/traccar/protocol/StartekProtocolDecoder.java')
-rw-r--r-- | src/main/java/org/traccar/protocol/StartekProtocolDecoder.java | 61 |
1 files changed, 52 insertions, 9 deletions
diff --git a/src/main/java/org/traccar/protocol/StartekProtocolDecoder.java b/src/main/java/org/traccar/protocol/StartekProtocolDecoder.java index 1cc69c6e6..042518cb2 100644 --- a/src/main/java/org/traccar/protocol/StartekProtocolDecoder.java +++ b/src/main/java/org/traccar/protocol/StartekProtocolDecoder.java @@ -41,6 +41,11 @@ public class StartekProtocolDecoder extends BaseProtocolDecoder { .expression(".") // index .number("d+,") // length .number("(d+),") // imei + .expression("(.+)") // content + .number("xx") // checksum + .compile(); + + private static final Pattern PATTERN_POSITION = new PatternBuilder() .number("xxx,") // command .number("(d+),") // event .expression("([^,]+)?,") // event data @@ -64,12 +69,18 @@ public class StartekProtocolDecoder extends BaseProtocolDecoder { .number("(x+),") // inputs .number("(x+),") // outputs .number("(x+)|") // power - .number("(x+)|") // battery - .expression("([^,]+),") // adc + .number("(x+)") // battery + .groupBegin() + .text("|") + .expression("([^,]+)").optional() // adc + .groupBegin() + .text(",") .number("d,") // extended .expression("([^,]+)?,") // fuel - .expression("([^,]+)?") // temperature - .number("xx") // checksum + .expression("([^,]+)?,?") // temperature + .groupEnd("?") + .groupEnd("?") + .any() .compile(); private String decodeAlarm(int value) { @@ -102,6 +113,32 @@ public class StartekProtocolDecoder extends BaseProtocolDecoder { return null; } + String content = parser.next(); + if (content.length() < 100) { + + Position position = new Position(getProtocolName()); + position.setDeviceId(deviceSession.getDeviceId()); + + getLastLocation(position, null); + + position.set(Position.KEY_RESULT, content); + + return position; + + } else { + + return decodePosition(deviceSession, content); + + } + } + + protected Object decodePosition(DeviceSession deviceSession, String content) throws Exception { + + Parser parser = new Parser(PATTERN_POSITION, content); + if (!parser.matches()) { + return null; + } + Position position = new Position(getProtocolName()); position.setDeviceId(deviceSession.getDeviceId()); @@ -132,15 +169,21 @@ public class StartekProtocolDecoder extends BaseProtocolDecoder { parser.nextInt(), parser.nextInt(), parser.nextHexInt(), parser.nextHexInt(), parser.nextInt()))); position.set(Position.KEY_STATUS, parser.nextHexInt()); - position.set(Position.KEY_INPUT, parser.nextHexInt()); - position.set(Position.KEY_OUTPUT, parser.nextHexInt()); + + int input = parser.nextHexInt(); + int output = parser.nextHexInt(); + position.set(Position.KEY_IGNITION, BitUtil.check(input, 1)); + position.set(Position.KEY_INPUT, input); + position.set(Position.KEY_OUTPUT, output); position.set(Position.KEY_POWER, parser.nextHexInt() * 0.01); position.set(Position.KEY_BATTERY, parser.nextHexInt() * 0.01); - String[] adc = parser.next().split("\\|"); - for (int i = 0; i < adc.length; i++) { - position.set(Position.PREFIX_ADC + (i + 1), Integer.parseInt(adc[i], 16) * 0.01); + if (parser.hasNext()) { + String[] adc = parser.next().split("\\|"); + for (int i = 0; i < adc.length; i++) { + position.set(Position.PREFIX_ADC + (i + 1), Integer.parseInt(adc[i], 16) * 0.01); + } } if (parser.hasNext()) { |