From 05c7db487f3744f6abe348426c44fc708b252428 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 19 May 2013 00:37:00 +1200 Subject: Improve V680 decoder --- src/org/traccar/ServerManager.java | 2 +- src/org/traccar/protocol/V680ProtocolDecoder.java | 168 ++++++++++++---------- 2 files changed, 95 insertions(+), 75 deletions(-) (limited to 'src') diff --git a/src/org/traccar/ServerManager.java b/src/org/traccar/ServerManager.java index 971859099..62de6bf0b 100644 --- a/src/org/traccar/ServerManager.java +++ b/src/org/traccar/ServerManager.java @@ -488,7 +488,7 @@ public class ServerManager { serverList.add(new TrackerServer(this, new ServerBootstrap(), protocol) { @Override protected void addSpecificHandlers(ChannelPipeline pipeline) { - byte delimiter[] = { (byte) '#', (byte) '#', (byte) '#' }; + byte delimiter[] = { (byte) '#', (byte) '#' }; pipeline.addLast("frameDecoder", new DelimiterBasedFrameDecoder(1024, ChannelBuffers.wrappedBuffer(delimiter))); pipeline.addLast("stringDecoder", new StringDecoder()); diff --git a/src/org/traccar/protocol/V680ProtocolDecoder.java b/src/org/traccar/protocol/V680ProtocolDecoder.java index 205036ebb..e3388576e 100644 --- a/src/org/traccar/protocol/V680ProtocolDecoder.java +++ b/src/org/traccar/protocol/V680ProtocolDecoder.java @@ -29,14 +29,15 @@ import org.traccar.model.Position; public class V680ProtocolDecoder extends BaseProtocolDecoder { + private Long deviceId; + public V680ProtocolDecoder(ServerManager serverManager) { super(serverManager); } static private Pattern pattern = Pattern.compile( - "#?" + - "(\\d+)#" + // IMEI - "([^#]*)#" + // User + "(?:#(\\d+)#" + // IMEI + "([^#]*)#)?" + // User "([01])#" + // Fix "([^#]+)#" + // Password "[^#]+#" + @@ -59,78 +60,97 @@ public class V680ProtocolDecoder extends BaseProtocolDecoder { throws Exception { String sentence = (String) msg; - - // Parse message - Matcher parser = pattern.matcher(sentence); - if (!parser.matches()) { - return null; + + // Detect device ID + if (sentence.length() == 16) { + String imei = sentence.substring(1, sentence.length()); + try { + deviceId = getDataManager().getDeviceByImei(imei).getId(); + } catch(Exception error) { + Log.warning("Unknown device - " + imei); + } + } else { + + // Parse message + Matcher parser = pattern.matcher(sentence); + if (!parser.matches()) { + return null; + } + + // Create new position + Position position = new Position(); + ExtendedInfoFormatter extendedInfo = new ExtendedInfoFormatter("v680"); + Integer index = 1; + + // Get device by IMEI + String imei = parser.group(index++); + if (imei != null) { + try { + deviceId = getDataManager().getDeviceByImei(imei).getId(); + } catch(Exception error) { + Log.warning("Unknown device - " + imei); + return null; + } + } + if (deviceId == null) { + return null; + } + position.setDeviceId(deviceId); + + // User + extendedInfo.set("user", parser.group(index++)); + + // Validity + position.setValid(parser.group(index++).compareTo("1") == 0 ? true : false); + + // Password + extendedInfo.set("password", parser.group(index++)); + + // Packet number + extendedInfo.set("packet", parser.group(index++)); + + // GSM base station + extendedInfo.set("gsm", parser.group(index++)); + + // Longitude + Double lonlitude = Double.valueOf(parser.group(index++)); + lonlitude += Double.valueOf(parser.group(index++)) / 60; + if (parser.group(index++).compareTo("W") == 0) lonlitude = -lonlitude; + position.setLongitude(lonlitude); + + // Latitude + Double latitude = Double.valueOf(parser.group(index++)); + latitude += Double.valueOf(parser.group(index++)) / 60; + if (parser.group(index++).compareTo("S") == 0) latitude = -latitude; + position.setLatitude(latitude); + + // Altitude + position.setAltitude(0.0); + + // Speed and Course + position.setSpeed(Double.valueOf(parser.group(index++))); + position.setCourse(Double.valueOf(parser.group(index++))); + + // Date + Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + time.clear(); + time.set(Calendar.DAY_OF_MONTH, Integer.valueOf(parser.group(index++))); + time.set(Calendar.MONTH, Integer.valueOf(parser.group(index++)) - 1); + time.set(Calendar.YEAR, 2000 + Integer.valueOf(parser.group(index++))); + + // Time + time.set(Calendar.HOUR, Integer.valueOf(parser.group(index++))); + time.set(Calendar.MINUTE, Integer.valueOf(parser.group(index++))); + time.set(Calendar.SECOND, Integer.valueOf(parser.group(index++))); + position.setTime(time.getTime()); + + // Extended info + position.setExtendedInfo(extendedInfo.toString()); + + return position; } - - // Create new position - Position position = new Position(); - ExtendedInfoFormatter extendedInfo = new ExtendedInfoFormatter("v680"); - Integer index = 1; - - // Get device by IMEI - String imei = parser.group(index++); - try { - position.setDeviceId(getDataManager().getDeviceByImei(imei).getId()); - } catch(Exception error) { - Log.warning("Unknown device - " + imei); - return null; - } - - // User - extendedInfo.set("user", parser.group(index++)); - - // Validity - position.setValid(parser.group(index++).compareTo("1") == 0 ? true : false); - - // Password - extendedInfo.set("password", parser.group(index++)); - - // Packet number - extendedInfo.set("packet", parser.group(index++)); - - // GSM base station - extendedInfo.set("gsm", parser.group(index++)); - - // Longitude - Double lonlitude = Double.valueOf(parser.group(index++)); - lonlitude += Double.valueOf(parser.group(index++)) / 60; - if (parser.group(index++).compareTo("W") == 0) lonlitude = -lonlitude; - position.setLongitude(lonlitude); - - // Latitude - Double latitude = Double.valueOf(parser.group(index++)); - latitude += Double.valueOf(parser.group(index++)) / 60; - if (parser.group(index++).compareTo("S") == 0) latitude = -latitude; - position.setLatitude(latitude); - - // Altitude - position.setAltitude(0.0); - - // Speed and Course - position.setSpeed(Double.valueOf(parser.group(index++))); - position.setCourse(Double.valueOf(parser.group(index++))); - - // Date - Calendar time = Calendar.getInstance(TimeZone.getTimeZone("UTC")); - time.clear(); - time.set(Calendar.DAY_OF_MONTH, Integer.valueOf(parser.group(index++))); - time.set(Calendar.MONTH, Integer.valueOf(parser.group(index++)) - 1); - time.set(Calendar.YEAR, 2000 + Integer.valueOf(parser.group(index++))); - - // Time - time.set(Calendar.HOUR, Integer.valueOf(parser.group(index++))); - time.set(Calendar.MINUTE, Integer.valueOf(parser.group(index++))); - time.set(Calendar.SECOND, Integer.valueOf(parser.group(index++))); - position.setTime(time.getTime()); - - // Extended info - position.setExtendedInfo(extendedInfo.toString()); - - return position; + + return null; } } -- cgit v1.2.3