diff options
Diffstat (limited to 'src/org/traccar/protocol/XirgoProtocolDecoder.java')
-rw-r--r-- | src/org/traccar/protocol/XirgoProtocolDecoder.java | 355 |
1 files changed, 0 insertions, 355 deletions
diff --git a/src/org/traccar/protocol/XirgoProtocolDecoder.java b/src/org/traccar/protocol/XirgoProtocolDecoder.java deleted file mode 100644 index 6d215e672..000000000 --- a/src/org/traccar/protocol/XirgoProtocolDecoder.java +++ /dev/null @@ -1,355 +0,0 @@ -/* - * 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.traccar.protocol; - -import io.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.Protocol; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class XirgoProtocolDecoder extends BaseProtocolDecoder { - - private Boolean newFormat; - private String form; - - public XirgoProtocolDecoder(Protocol protocol) { - super(protocol); - form = Context.getConfig().getString(getProtocolName() + ".form"); - } - - public void setForm(String form) { - this.form = form; - } - - private static final Pattern PATTERN_OLD = new PatternBuilder() - .text("$$") - .number("(d+),") // imei - .number("(d+),") // event - .number("(dddd)/(dd)/(dd),") // date (yyyy/mm/dd) - .number("(dd):(dd):(dd),") // time (hh:mm:ss) - .number("(-?d+.?d*),") // latitude - .number("(-?d+.?d*),") // longitude - .number("(-?d+.?d*),") // altitude - .number("(d+.?d*),") // speed - .number("(d+.?d*),") // course - .number("(d+),") // satellites - .number("(d+.?d*),") // hdop - .number("(d+.d+),") // battery - .number("(d+),") // gsm - .number("(d+.?d*),") // odometer - .number("(d+),") // gps - .any() - .compile(); - - private static final Pattern PATTERN_NEW = new PatternBuilder() - .text("$$") - .number("(d+),") // imei - .number("(d+),") // event - .number("(dddd)/(dd)/(dd),") // date (yyyy/mm/dd) - .number("(dd):(dd):(dd),") // time (hh:mm:ss) - .number("(-?d+.?d*),") // latitude - .number("(-?d+.?d*),") // longitude - .number("(-?d+.?d*),") // altitude - .number("(d+.?d*),") // speed - .number("d+.?d*,") // acceleration - .number("d+.?d*,") // deceleration - .number("d+,") - .number("(d+.?d*),") // course - .number("(d+),") // satellites - .number("(d+.?d*),") // hdop - .number("(d+.?d*),") // odometer - .number("(d+.?d*),") // fuel consumption - .number("(d+.d+),") // battery - .number("(d+),") // gsm - .number("(d+),") // gps - .groupBegin() - .number("d,") // reset mode - .expression("([01])") // input 1 - .expression("([01])") // input 1 - .expression("([01])") // input 1 - .expression("([01]),") // output 1 - .number("(d+.?d*),") // adc 1 - .number("(d+.?d*),") // fuel level - .number("d+,") // engine load - .number("(d+),") // engine hours - .number("(d+),") // oil pressure - .number("(d+),") // oil level - .number("(-?d+),") // oil temperature - .number("(d+),") // coolant pressure - .number("(d+),") // coolant level - .number("(-?d+)") // coolant temperature - .groupEnd("?") - .any() - .compile(); - - private void decodeEvent(Position position, int event) { - - position.set(Position.KEY_EVENT, event); - - switch (event) { - case 4001: - case 4003: - case 6011: - case 6013: - position.set(Position.KEY_IGNITION, true); - break; - case 4002: - case 4004: - case 6012: - case 6014: - position.set(Position.KEY_IGNITION, false); - break; - case 4005: - position.set(Position.KEY_CHARGE, false); - break; - case 6002: - position.set(Position.KEY_ALARM, Position.ALARM_OVERSPEED); - break; - case 6006: - position.set(Position.KEY_ALARM, Position.ALARM_ACCELERATION); - break; - case 6007: - position.set(Position.KEY_ALARM, Position.ALARM_BRAKING); - break; - case 6008: - position.set(Position.KEY_ALARM, Position.ALARM_LOW_POWER); - break; - case 6009: - position.set(Position.KEY_ALARM, Position.ALARM_POWER_CUT); - break; - case 6010: - position.set(Position.KEY_ALARM, Position.ALARM_POWER_RESTORED); - break; - case 6016: - position.set(Position.KEY_ALARM, Position.ALARM_IDLE); - break; - case 6017: - position.set(Position.KEY_ALARM, Position.ALARM_TOW); - break; - case 6030: - case 6071: - position.set(Position.KEY_MOTION, true); - break; - case 6031: - position.set(Position.KEY_MOTION, false); - break; - case 6032: - position.set(Position.KEY_ALARM, Position.ALARM_PARKING); - break; - case 6090: - position.set(Position.KEY_ALARM, Position.ALARM_REMOVING); - break; - case 6091: - position.set(Position.KEY_ALARM, Position.ALARM_LOW_BATTERY); - break; - default: - break; - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - if (form != null) { - return decodeCustom(channel, remoteAddress, sentence); - } else { - return decodeFixed(channel, remoteAddress, sentence); - } - } - - - private Object decodeCustom( - Channel channel, SocketAddress remoteAddress, String sentence) { - - String[] keys = form.split(","); - String[] values = sentence.replace("$$", "").replace("##", "").split(","); - - Position position = new Position(getProtocolName()); - DateBuilder dateBuilder = new DateBuilder(); - - for (int i = 0; i < Math.min(keys.length, values.length); i++) { - switch (keys[i]) { - case "UID": - case "IM": - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, values[i]); - if (deviceSession != null) { - position.setDeviceId(deviceSession.getDeviceId()); - } - break; - case "EV": - decodeEvent(position, Integer.parseInt(values[i])); - break; - case "D": - String[] date = values[i].split("/"); - dateBuilder.setMonth(Integer.parseInt(date[0])); - dateBuilder.setDay(Integer.parseInt(date[1])); - dateBuilder.setYear(Integer.parseInt(date[2])); - break; - case "T": - String[] time = values[i].split(":"); - dateBuilder.setHour(Integer.parseInt(time[0])); - dateBuilder.setMinute(Integer.parseInt(time[1])); - dateBuilder.setSecond(Integer.parseInt(time[2])); - break; - case "LT": - position.setLatitude(Double.parseDouble(values[i])); - break; - case "LN": - position.setLongitude(Double.parseDouble(values[i])); - break; - case "AL": - position.setAltitude(Integer.parseInt(values[i])); - break; - case "GSPT": - position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble(values[i]))); - break; - case "HD": - if (values[i].contains(".")) { - position.setCourse(Double.parseDouble(values[i])); - } else { - position.setCourse(Integer.parseInt(values[i]) * 0.1); - } - break; - case "SV": - position.set(Position.KEY_SATELLITES, Integer.parseInt(values[i])); - break; - case "BV": - position.set(Position.KEY_BATTERY, Double.parseDouble(values[i])); - break; - case "CQ": - position.set(Position.KEY_RSSI, Integer.parseInt(values[i])); - break; - case "MI": - position.set(Position.KEY_ODOMETER, Integer.parseInt(values[i])); - break; - case "GS": - position.setValid(Integer.parseInt(values[i]) == 3); - break; - case "SI": - position.set("iccid", values[i]); - break; - case "IG": - int ignition = Integer.parseInt(values[i]); - if (ignition > 0) { - position.set(Position.KEY_IGNITION, ignition == 1); - } - break; - case "OT": - position.set(Position.KEY_OUTPUT, Integer.parseInt(values[i])); - break; - default: - break; - } - } - - position.setTime(dateBuilder.getDate()); - - return position.getDeviceId() > 0 ? position : null; - } - - private Object decodeFixed( - Channel channel, SocketAddress remoteAddress, String sentence) { - - Parser parser; - if (newFormat == null) { - parser = new Parser(PATTERN_NEW, sentence); - if (parser.matches()) { - newFormat = true; - } else { - parser = new Parser(PATTERN_OLD, sentence); - if (parser.matches()) { - newFormat = false; - } else { - return null; - } - } - } else { - if (newFormat) { - parser = new Parser(PATTERN_NEW, sentence); - } else { - parser = new Parser(PATTERN_OLD, sentence); - } - if (!parser.matches()) { - return null; - } - } - - Position position = new Position(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - decodeEvent(position, parser.nextInt()); - - position.setTime(parser.nextDateTime()); - - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - position.setSpeed(UnitsConverter.knotsFromMph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_SATELLITES, parser.nextInt()); - position.set(Position.KEY_HDOP, parser.nextDouble()); - - if (newFormat) { - position.set(Position.KEY_ODOMETER, UnitsConverter.metersFromMiles(parser.nextDouble(0))); - position.set(Position.KEY_FUEL_CONSUMPTION, parser.next()); - } - - position.set(Position.KEY_BATTERY, parser.nextDouble(0)); - position.set(Position.KEY_RSSI, parser.nextDouble()); - - if (!newFormat) { - position.set(Position.KEY_ODOMETER, UnitsConverter.metersFromMiles(parser.nextDouble(0))); - } - - position.setValid(parser.nextInt(0) == 1); - - if (newFormat && parser.hasNext(13)) { - position.set(Position.PREFIX_IN + 1, parser.nextInt()); - position.set(Position.PREFIX_IN + 2, parser.nextInt()); - position.set(Position.PREFIX_IN + 3, parser.nextInt()); - position.set(Position.PREFIX_OUT + 1, parser.nextInt()); - position.set(Position.PREFIX_ADC + 1, parser.nextDouble()); - position.set(Position.KEY_FUEL_LEVEL, parser.nextDouble()); - position.set(Position.KEY_HOURS, UnitsConverter.msFromHours(parser.nextInt())); - position.set("oilPressure", parser.nextInt()); - position.set("oilLevel", parser.nextInt()); - position.set("oilTemp", parser.nextInt()); - position.set("coolantPressure", parser.nextInt()); - position.set("coolantLevel", parser.nextInt()); - position.set("coolantTemp", parser.nextInt()); - } - - return position; - } - -} |