From 015116991389643865bcdc35ea6e247eb6cb3ba1 Mon Sep 17 00:00:00 2001 From: michaelloliveira Date: Wed, 30 May 2018 19:48:33 -0300 Subject: Svias Protocol Encode e Decoder --- src/org/traccar/protocol/SviasProtocol.java | 66 +++++++ src/org/traccar/protocol/SviasProtocolDecoder.java | 205 +++++++++++++++++++++ src/org/traccar/protocol/SviasProtocolEncoder.java | 50 +++++ 3 files changed, 321 insertions(+) create mode 100644 src/org/traccar/protocol/SviasProtocol.java create mode 100644 src/org/traccar/protocol/SviasProtocolDecoder.java create mode 100644 src/org/traccar/protocol/SviasProtocolEncoder.java (limited to 'src/org/traccar/protocol') diff --git a/src/org/traccar/protocol/SviasProtocol.java b/src/org/traccar/protocol/SviasProtocol.java new file mode 100644 index 000000000..b58872baf --- /dev/null +++ b/src/org/traccar/protocol/SviasProtocol.java @@ -0,0 +1,66 @@ +/* + * Copyright 2015 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 org.jboss.netty.bootstrap.ServerBootstrap; +import org.jboss.netty.channel.ChannelPipeline; +import org.jboss.netty.handler.codec.string.StringDecoder; +import org.jboss.netty.handler.codec.string.StringEncoder; +import org.traccar.BaseProtocol; +import org.traccar.TrackerServer; +import org.traccar.model.Command; + +import java.util.List; +import org.jboss.netty.bootstrap.ConnectionlessBootstrap; + +public class SviasProtocol extends BaseProtocol { + + public SviasProtocol() { + super("svias"); + setSupportedDataCommands( + Command.TYPE_CUSTOM, + Command.TYPE_POSITION_SINGLE, + Command.TYPE_SET_ODOMETER, + Command.TYPE_ENGINE_STOP, + Command.TYPE_ENGINE_RESUME, + Command.TYPE_ALARM_ARM, + Command.TYPE_ALARM_DISARM, + Command.TYPE_ALARM_REMOVE); + } + + @Override + public void initTrackerServers(List serverList) { + serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("objectEncoder", new SviasProtocolEncoder()); + pipeline.addLast("objectDecoder", new SviasProtocolDecoder(SviasProtocol.this)); + } + }); + serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { + @Override + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("stringEncoder", new StringEncoder()); + pipeline.addLast("stringDecoder", new StringDecoder()); + pipeline.addLast("objectEncoder", new SviasProtocolEncoder()); + pipeline.addLast("objectDecoder", new SviasProtocolDecoder(SviasProtocol.this)); + } + }); + } + +} diff --git a/src/org/traccar/protocol/SviasProtocolDecoder.java b/src/org/traccar/protocol/SviasProtocolDecoder.java new file mode 100644 index 000000000..4ec758eb0 --- /dev/null +++ b/src/org/traccar/protocol/SviasProtocolDecoder.java @@ -0,0 +1,205 @@ +/* + * Copyright 2013 - 2017 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 org.jboss.netty.channel.Channel; +import org.traccar.BaseProtocolDecoder; +import org.traccar.DeviceSession; +import org.traccar.model.Position; +import java.text.ParseException; + +import java.net.SocketAddress; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.TimeZone; +import org.traccar.helper.Log; +import org.traccar.helper.UnitsConverter; + +public class SviasProtocolDecoder extends BaseProtocolDecoder { + + public SviasProtocolDecoder(SviasProtocol protocol) { + super(protocol); + } + + private void sendResponse(Channel channel, String prefix) { + if (channel != null) { + channel.write(prefix); + } + } + + private String zeros(String texto, Integer valor) { + String aux = ""; + for (int i = 0; i < valor; i++) { + aux += '0'; + } + return aux + texto; + } + + public String decimalToBinary(int valor) { + + String bin = Integer.toString(valor, 2); + return bin; + } + + private double convert2decimal(long v) { + float a = (float) v / 1.0E7F; + int b = (int) (v / 10000000L); + float c = a - b; + float d = (float) (c * 1.6666666666666667D); + int e = (int) (v / 10000000L); + float f = d + e; + + return Double.valueOf(f); + + } + + private Position decodePosition(Channel channel, SocketAddress remoteAddress, String substring) + throws ParseException { + int index = 0; + + String[] values = substring.split(","); + + DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, values[3]); + if (deviceSession == null) { + return null; + } + + Position position = new Position(); + position.setProtocol(getProtocolName()); + position.setDeviceId(deviceSession.getDeviceId()); + + position.set(Position.KEY_VERSION_HW, values[index++].replace("[", "")); + + String swOrAlt = values[index++]; + position.set(Position.KEY_VERSION_HW, swOrAlt); + position.setAltitude(Double.parseDouble(swOrAlt)); + + position.set(Position.KEY_INDEX, Integer.valueOf(values[index++])); + + String imei = values[index++]; + position.set(Position.KEY_TYPE, values[index++]); + + DateFormat dateFormat = new SimpleDateFormat("ddMMyyHHmmss"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + String date = values[index++]; + String time = values[index++]; + + position.setTime(dateFormat.parse(zeros(date, 6 - date.trim().length()) + + zeros(time, 6 - time.trim().length()))); + + position.setLatitude(convert2decimal(Long.valueOf(values[index++]))); + position.setLongitude(convert2decimal(Long.valueOf(values[index++]))); + + position.setSpeed(UnitsConverter.knotsFromKph(Integer.valueOf(values[index++]) / 100)); + position.setCourse(Integer.valueOf(values[index++]) / 100); + + position.set(Position.KEY_ODOMETER, Integer.valueOf(values[index++])); + + String input = decimalToBinary(Integer.valueOf(values[index++])); + String output = decimalToBinary(Integer.valueOf(values[index++])); + + /** inputs */ + String in = new StringBuilder(zeros(input, 8 - input.length())).reverse().toString(); + + /** outputs */ + String out = new StringBuilder(zeros(output, 8 - output.length())).reverse().toString(); + + if (in.substring(0, 1).equals("1")) { + position.set(Position.KEY_ALARM, Position.ALARM_SOS); + } + + position.set(Position.PREFIX_IN + 1, in.substring(1, 2).equals("1")); + position.set(Position.PREFIX_IN + 2, in.substring(2, 3).equals("1")); + position.set(Position.PREFIX_IN + 3, in.substring(3, 4).equals("1")); + position.set(Position.KEY_IGNITION, in.substring(4, 5).equals("1")); + + if (in.substring(7, 8).equals("1")) { + position.set(Position.KEY_ALARM, Position.ALARM_POWER_CUT); + } + + position.setValid(out.substring(0, 1).equals("1")); + + if (out.substring(1, 2).equals("1")) { + position.set(Position.KEY_ALARM, Position.ALARM_JAMMING); + } + + position.set(Position.PREFIX_OUT + 1, out.substring(2, 3).equals("1")); + position.set(Position.PREFIX_OUT + 2, out.substring(3, 4).equals("1")); + position.set(Position.PREFIX_OUT + 3, out.substring(4, 5).equals("1")); + + position.set(Position.KEY_POWER, Integer.valueOf(values[index++]) / 100); + + position.set(Position.KEY_BATTERY_LEVEL, Double.parseDouble(values[index++])); + + position.set(Position.KEY_RSSI, Integer.valueOf(values[index++])); + + if (values.length == 22) { + String driverUniqueId = values[index++]; + if (!driverUniqueId.isEmpty()) { + position.set(Position.KEY_DRIVER_UNIQUE_ID, driverUniqueId); + } + } + + String status = decimalToBinary(Integer.parseInt(values[index++])); + String st = new StringBuilder(zeros(status, 8 - status.length())).reverse().toString(); + + position.set(Position.ALARM_CORNERING, st.substring(0, 1).equals("1")); + position.set(Position.ALARM_GEOFENCE_ENTER, st.substring(1, 2).equals("1")); + position.set(Position.ALARM_FALL_DOWN, st.substring(3, 4).equals("1")); + position.set(Position.ALARM_OVERSPEED, st.substring(4, 5).equals("1")); + position.set("connectedPrimaryServer", st.substring(5, 6).equals("1")); + position.set("connectedSecundaryServer", st.substring(6, 7).equals("1")); + + return position; + } + + @Override + protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) + throws Exception { + + String sentence = (String) msg; + + if (sentence.contains(":")) { + + Log.info(sentence); + + String[] values = sentence.substring(1).split(":"); + + String imei = values[1]; + + DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); + + if (deviceSession != null) { + sendResponse(channel, "@"); + } + + } else { + + Position position = decodePosition(channel, remoteAddress, + sentence.substring(sentence.indexOf('[', 1) + 1)); + + if (position != null) { + sendResponse(channel, "@"); + return position; + } + } + + return null; + + } + +} diff --git a/src/org/traccar/protocol/SviasProtocolEncoder.java b/src/org/traccar/protocol/SviasProtocolEncoder.java new file mode 100644 index 000000000..518268cab --- /dev/null +++ b/src/org/traccar/protocol/SviasProtocolEncoder.java @@ -0,0 +1,50 @@ +/* + * Copyright 2016 Anton Tananaev (anton@traccar.org) + * Copyright 2016 Andrey Kunitsyn (andrey@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 org.traccar.StringProtocolEncoder; +import org.traccar.helper.Log; +import org.traccar.model.Command; + +public class SviasProtocolEncoder extends StringProtocolEncoder { + + @Override + protected Object encodeCommand(Command command) { + switch (command.getType()) { + case Command.TYPE_CUSTOM: + return formatCommand(command, "{%s}", Command.KEY_DATA); + case Command.TYPE_POSITION_SINGLE: + return formatCommand(command, "AT+STR=1*"); + case Command.TYPE_SET_ODOMETER: + return formatCommand(command, "AT+ODT={%s}*", Command.KEY_DATA); + case Command.TYPE_ENGINE_STOP: + return formatCommand(command, "AT+OUT=1,1*"); + case Command.TYPE_ENGINE_RESUME: + return formatCommand(command, "AT+OUT=1,0*"); + case Command.TYPE_ALARM_ARM: + return formatCommand(command, "AT+OUT=2,1*"); + case Command.TYPE_ALARM_DISARM: + return formatCommand(command, "AT+OUT=2,0*"); + case Command.TYPE_ALARM_REMOVE: + return formatCommand(command, "AT+PNC=600*"); + default: + Log.warning(new UnsupportedOperationException(command.getType())); + break; + } + return null; + } +} -- cgit v1.2.3 From 453be4c44ddbc8cd1db3a2cfd7b1fd37cee7a8fc Mon Sep 17 00:00:00 2001 From: michaelloliveira Date: Wed, 30 May 2018 20:54:22 -0300 Subject: Update SviasProtocolDecoder.java As required by the developer. --- src/org/traccar/protocol/SviasProtocolDecoder.java | 87 +++++----------------- 1 file changed, 17 insertions(+), 70 deletions(-) (limited to 'src/org/traccar/protocol') diff --git a/src/org/traccar/protocol/SviasProtocolDecoder.java b/src/org/traccar/protocol/SviasProtocolDecoder.java index 4ec758eb0..caff6339e 100644 --- a/src/org/traccar/protocol/SviasProtocolDecoder.java +++ b/src/org/traccar/protocol/SviasProtocolDecoder.java @@ -25,7 +25,6 @@ import java.net.SocketAddress; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.TimeZone; -import org.traccar.helper.Log; import org.traccar.helper.UnitsConverter; public class SviasProtocolDecoder extends BaseProtocolDecoder { @@ -40,21 +39,7 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { } } - private String zeros(String texto, Integer valor) { - String aux = ""; - for (int i = 0; i < valor; i++) { - aux += '0'; - } - return aux + texto; - } - - public String decimalToBinary(int valor) { - - String bin = Integer.toString(valor, 2); - return bin; - } - - private double convert2decimal(long v) { + private double convertCoordinates(long v) { float a = (float) v / 1.0E7F; int b = (int) (v / 10000000L); float c = a - b; @@ -81,11 +66,8 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { position.setProtocol(getProtocolName()); position.setDeviceId(deviceSession.getDeviceId()); - position.set(Position.KEY_VERSION_HW, values[index++].replace("[", "")); - - String swOrAlt = values[index++]; - position.set(Position.KEY_VERSION_HW, swOrAlt); - position.setAltitude(Double.parseDouble(swOrAlt)); + String versionHw = values[index++].replaceAll("[^0-9]", ""); + String versionSw = values[index++]; position.set(Position.KEY_INDEX, Integer.valueOf(values[index++])); @@ -95,51 +77,31 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { DateFormat dateFormat = new SimpleDateFormat("ddMMyyHHmmss"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - String date = values[index++]; - String time = values[index++]; + String date = String.format("%06d", Integer.parseInt(values[index++])); + String time = String.format("%06d", Integer.parseInt(values[index++])); - position.setTime(dateFormat.parse(zeros(date, 6 - date.trim().length()) - + zeros(time, 6 - time.trim().length()))); + position.setTime(dateFormat.parse(date + time)); - position.setLatitude(convert2decimal(Long.valueOf(values[index++]))); - position.setLongitude(convert2decimal(Long.valueOf(values[index++]))); + position.setLatitude(convertCoordinates(Long.valueOf(values[index++]))); + position.setLongitude(convertCoordinates(Long.valueOf(values[index++]))); position.setSpeed(UnitsConverter.knotsFromKph(Integer.valueOf(values[index++]) / 100)); position.setCourse(Integer.valueOf(values[index++]) / 100); position.set(Position.KEY_ODOMETER, Integer.valueOf(values[index++])); - String input = decimalToBinary(Integer.valueOf(values[index++])); - String output = decimalToBinary(Integer.valueOf(values[index++])); + String input = new StringBuilder(String.format("%08d", + Integer.parseInt(values[index++]))).reverse().toString(); - /** inputs */ - String in = new StringBuilder(zeros(input, 8 - input.length())).reverse().toString(); + String output = new StringBuilder(String.format("%08d", + Integer.parseInt(values[index++]))).reverse().toString(); - /** outputs */ - String out = new StringBuilder(zeros(output, 8 - output.length())).reverse().toString(); - - if (in.substring(0, 1).equals("1")) { + if (input.substring(0).equals("1")) { position.set(Position.KEY_ALARM, Position.ALARM_SOS); } + position.set(Position.KEY_IGNITION, input.substring(4).equals("1")); - position.set(Position.PREFIX_IN + 1, in.substring(1, 2).equals("1")); - position.set(Position.PREFIX_IN + 2, in.substring(2, 3).equals("1")); - position.set(Position.PREFIX_IN + 3, in.substring(3, 4).equals("1")); - position.set(Position.KEY_IGNITION, in.substring(4, 5).equals("1")); - - if (in.substring(7, 8).equals("1")) { - position.set(Position.KEY_ALARM, Position.ALARM_POWER_CUT); - } - - position.setValid(out.substring(0, 1).equals("1")); - - if (out.substring(1, 2).equals("1")) { - position.set(Position.KEY_ALARM, Position.ALARM_JAMMING); - } - - position.set(Position.PREFIX_OUT + 1, out.substring(2, 3).equals("1")); - position.set(Position.PREFIX_OUT + 2, out.substring(3, 4).equals("1")); - position.set(Position.PREFIX_OUT + 3, out.substring(4, 5).equals("1")); + position.setValid(output.substring(0).equals("1")); position.set(Position.KEY_POWER, Integer.valueOf(values[index++]) / 100); @@ -154,16 +116,6 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { } } - String status = decimalToBinary(Integer.parseInt(values[index++])); - String st = new StringBuilder(zeros(status, 8 - status.length())).reverse().toString(); - - position.set(Position.ALARM_CORNERING, st.substring(0, 1).equals("1")); - position.set(Position.ALARM_GEOFENCE_ENTER, st.substring(1, 2).equals("1")); - position.set(Position.ALARM_FALL_DOWN, st.substring(3, 4).equals("1")); - position.set(Position.ALARM_OVERSPEED, st.substring(4, 5).equals("1")); - position.set("connectedPrimaryServer", st.substring(5, 6).equals("1")); - position.set("connectedSecundaryServer", st.substring(6, 7).equals("1")); - return position; } @@ -175,13 +127,9 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { if (sentence.contains(":")) { - Log.info(sentence); - String[] values = sentence.substring(1).split(":"); - String imei = values[1]; - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); + DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, values[1]); if (deviceSession != null) { sendResponse(channel, "@"); @@ -189,8 +137,7 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { } else { - Position position = decodePosition(channel, remoteAddress, - sentence.substring(sentence.indexOf('[', 1) + 1)); + Position position = decodePosition(channel, remoteAddress, sentence.substring(1)); if (position != null) { sendResponse(channel, "@"); -- cgit v1.2.3 From 111f5bb7a70d3d75b7ddc5cab673bcfdf09c1f67 Mon Sep 17 00:00:00 2001 From: michaelloliveira Date: Sun, 3 Jun 2018 12:54:13 -0300 Subject: Reformatter Code Svias --- src/org/traccar/protocol/SviasProtocolDecoder.java | 86 +++++++--------------- 1 file changed, 27 insertions(+), 59 deletions(-) (limited to 'src/org/traccar/protocol') diff --git a/src/org/traccar/protocol/SviasProtocolDecoder.java b/src/org/traccar/protocol/SviasProtocolDecoder.java index caff6339e..cca21467a 100644 --- a/src/org/traccar/protocol/SviasProtocolDecoder.java +++ b/src/org/traccar/protocol/SviasProtocolDecoder.java @@ -29,31 +29,23 @@ import org.traccar.helper.UnitsConverter; public class SviasProtocolDecoder extends BaseProtocolDecoder { + public static final String MSG_KEEPALIVE = "@"; + public SviasProtocolDecoder(SviasProtocol protocol) { super(protocol); } - private void sendResponse(Channel channel, String prefix) { - if (channel != null) { - channel.write(prefix); - } - } - private double convertCoordinates(long v) { - float a = (float) v / 1.0E7F; - int b = (int) (v / 10000000L); - float c = a - b; - float d = (float) (c * 1.6666666666666667D); - int e = (int) (v / 10000000L); - float f = d + e; - - return Double.valueOf(f); + return Double.valueOf(((float) ((((float) v / 1.0E7F) + - ((int) (v / 10000000L))) * 1.6666666666666667D)) + ((int) (v / 10000000L))); + } + private String toBin(String v) { + return Integer.toString(Integer.parseInt(v), 2); } private Position decodePosition(Channel channel, SocketAddress remoteAddress, String substring) throws ParseException { - int index = 0; String[] values = substring.split(","); @@ -66,57 +58,40 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { position.setProtocol(getProtocolName()); position.setDeviceId(deviceSession.getDeviceId()); - String versionHw = values[index++].replaceAll("[^0-9]", ""); - String versionSw = values[index++]; - - position.set(Position.KEY_INDEX, Integer.valueOf(values[index++])); + position.set(Position.KEY_INDEX, Integer.valueOf(values[2])); - String imei = values[index++]; - position.set(Position.KEY_TYPE, values[index++]); + position.set(Position.KEY_TYPE, values[4]); DateFormat dateFormat = new SimpleDateFormat("ddMMyyHHmmss"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - String date = String.format("%06d", Integer.parseInt(values[index++])); - String time = String.format("%06d", Integer.parseInt(values[index++])); + String date = String.format("%06d", Integer.parseInt(values[5])); + String time = String.format("%06d", Integer.parseInt(values[6])); position.setTime(dateFormat.parse(date + time)); - position.setLatitude(convertCoordinates(Long.valueOf(values[index++]))); - position.setLongitude(convertCoordinates(Long.valueOf(values[index++]))); + position.setLatitude(convertCoordinates(Long.valueOf(values[7]))); + position.setLongitude(convertCoordinates(Long.valueOf(values[8]))); - position.setSpeed(UnitsConverter.knotsFromKph(Integer.valueOf(values[index++]) / 100)); - position.setCourse(Integer.valueOf(values[index++]) / 100); + position.setSpeed(UnitsConverter.knotsFromKph(Integer.valueOf(values[9]) / 100)); + position.setCourse(Integer.valueOf(values[10]) / 100); - position.set(Position.KEY_ODOMETER, Integer.valueOf(values[index++])); + position.set(Position.KEY_ODOMETER, Integer.valueOf(values[11])); String input = new StringBuilder(String.format("%08d", - Integer.parseInt(values[index++]))).reverse().toString(); + Integer.parseInt(toBin(values[12])))).reverse().toString(); String output = new StringBuilder(String.format("%08d", - Integer.parseInt(values[index++]))).reverse().toString(); - - if (input.substring(0).equals("1")) { - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - } - position.set(Position.KEY_IGNITION, input.substring(4).equals("1")); - - position.setValid(output.substring(0).equals("1")); + Integer.parseInt(toBin(values[13])))).reverse().toString(); - position.set(Position.KEY_POWER, Integer.valueOf(values[index++]) / 100); + position.set(Position.KEY_ALARM, (input.substring(0, 1).equals("1") ? Position.ALARM_SOS : null)); - position.set(Position.KEY_BATTERY_LEVEL, Double.parseDouble(values[index++])); + position.set(Position.KEY_IGNITION, input.substring(4, 5).equals("1")); - position.set(Position.KEY_RSSI, Integer.valueOf(values[index++])); - - if (values.length == 22) { - String driverUniqueId = values[index++]; - if (!driverUniqueId.isEmpty()) { - position.set(Position.KEY_DRIVER_UNIQUE_ID, driverUniqueId); - } - } + position.setValid(output.substring(0, 1).equals("1")); return position; + } @Override @@ -125,26 +100,19 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { String sentence = (String) msg; - if (sentence.contains(":")) { - - String[] values = sentence.substring(1).split(":"); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, values[1]); - - if (deviceSession != null) { - sendResponse(channel, "@"); - } - - } else { + if (!sentence.contains(":")) { Position position = decodePosition(channel, remoteAddress, sentence.substring(1)); if (position != null) { - sendResponse(channel, "@"); return position; } } + if (channel != null) { + channel.write(MSG_KEEPALIVE); + } + return null; } -- cgit v1.2.3 From 733e620bea7d6e14d43c8472a32d7db9594494e5 Mon Sep 17 00:00:00 2001 From: michaelloliveira Date: Mon, 4 Jun 2018 11:26:52 -0300 Subject: Modified structure for using Patterns. --- src/org/traccar/protocol/SviasProtocolDecoder.java | 134 +++++++++++++-------- 1 file changed, 82 insertions(+), 52 deletions(-) (limited to 'src/org/traccar/protocol') diff --git a/src/org/traccar/protocol/SviasProtocolDecoder.java b/src/org/traccar/protocol/SviasProtocolDecoder.java index cca21467a..ef631bf64 100644 --- a/src/org/traccar/protocol/SviasProtocolDecoder.java +++ b/src/org/traccar/protocol/SviasProtocolDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright 2013 - 2017 Anton Tananaev (anton@traccar.org) + * Copyright 2015 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. @@ -17,104 +17,134 @@ package org.traccar.protocol; import org.jboss.netty.channel.Channel; import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.model.Position; -import java.text.ParseException; +import org.traccar.helper.PatternBuilder; import java.net.SocketAddress; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.TimeZone; +import java.util.regex.Pattern; +import org.traccar.DeviceSession; +import org.traccar.helper.Parser; import org.traccar.helper.UnitsConverter; +import org.traccar.model.Position; public class SviasProtocolDecoder extends BaseProtocolDecoder { - public static final String MSG_KEEPALIVE = "@"; + private static final String MSG_KEEPALIVE = "@"; public SviasProtocolDecoder(SviasProtocol protocol) { super(protocol); } + private static final Pattern PATTERN = new PatternBuilder() + .text("[") // delimiter init + .number("(dddd),") // version hardware + .number("(dddd),") // version software + .number("(d+),") // counter + .number("(d+),") // imei + .any() // model or hourmeter + .number("(d+),") // date (yyyymmdd) + .number("(d+),") // time (hhmmss) + .number("(-?d+),") // longitude + .number("(-?d+),") // latitude + .number("(d+),") // speed + .number("(d+),") // course + .number("(d+),") // odometer + .number("(d+),") // input + .number("(d+),") // output / status + .number("(d+),") // flag pack input 1 + .number("(d+),") // flag pack input 2 + .number("(d+),") // main power voltage + .number("(d+),") // percentual power internal battery + .number("(d+),") // RSSID + .any() + .compile(); + private double convertCoordinates(long v) { return Double.valueOf(((float) ((((float) v / 1.0E7F) - ((int) (v / 10000000L))) * 1.6666666666666667D)) + ((int) (v / 10000000L))); } - private String toBin(String v) { - return Integer.toString(Integer.parseInt(v), 2); - } + @Override + protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) + throws Exception { - private Position decodePosition(Channel channel, SocketAddress remoteAddress, String substring) - throws ParseException { + String sentence = (String) msg; - String[] values = substring.split(","); + if (!sentence.contains(":")) { - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, values[3]); - if (deviceSession == null) { - return null; - } + Parser parser = new Parser(PATTERN, (String) sentence); + if (!parser.matches()) { + return null; + } - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); + Position position = new Position(getProtocolName()); - position.set(Position.KEY_INDEX, Integer.valueOf(values[2])); + String versionHard = parser.next(); + String versionSoft = parser.next(); + String counterInternal = parser.next(); - position.set(Position.KEY_TYPE, values[4]); + DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); + if (deviceSession == null) { + return null; + } - DateFormat dateFormat = new SimpleDateFormat("ddMMyyHHmmss"); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + position.setDeviceId(deviceSession.getDeviceId()); - String date = String.format("%06d", Integer.parseInt(values[5])); - String time = String.format("%06d", Integer.parseInt(values[6])); + DateFormat dateFormat = new SimpleDateFormat("ddMMyyHHmmss"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - position.setTime(dateFormat.parse(date + time)); + String date = String.format("%06d", parser.nextInt()); + String time = String.format("%06d", parser.nextInt()); - position.setLatitude(convertCoordinates(Long.valueOf(values[7]))); - position.setLongitude(convertCoordinates(Long.valueOf(values[8]))); + position.setTime(dateFormat.parse(date + time)); - position.setSpeed(UnitsConverter.knotsFromKph(Integer.valueOf(values[9]) / 100)); - position.setCourse(Integer.valueOf(values[10]) / 100); + position.setLatitude(convertCoordinates(parser.nextLong())); + position.setLongitude(convertCoordinates(parser.nextLong())); + position.setSpeed(UnitsConverter.knotsFromKph(parser.nextInt() / 100)); + position.setCourse(parser.nextInt() / 100); + position.setAltitude(0); - position.set(Position.KEY_ODOMETER, Integer.valueOf(values[11])); + position.set(Position.KEY_ODOMETER, parser.nextInt()); - String input = new StringBuilder(String.format("%08d", - Integer.parseInt(toBin(values[12])))).reverse().toString(); + String input = new StringBuilder(String.format("%08d", + Integer.parseInt(Integer.toString(parser.nextInt(), 2)))).reverse().toString(); - String output = new StringBuilder(String.format("%08d", - Integer.parseInt(toBin(values[13])))).reverse().toString(); + String output = new StringBuilder(String.format("%08d", + Integer.parseInt(Integer.toString(parser.nextInt(), 2)))).reverse().toString(); - position.set(Position.KEY_ALARM, (input.substring(0, 1).equals("1") ? Position.ALARM_SOS : null)); + position.set(Position.KEY_ALARM, (input.substring(0, 1).equals("1") + ? Position.ALARM_SOS : null)); - position.set(Position.KEY_IGNITION, input.substring(4, 5).equals("1")); + position.set(Position.KEY_IGNITION, input.substring(4, 5).equals("1")); - position.setValid(output.substring(0, 1).equals("1")); + position.setValid(output.substring(0, 1).equals("1")); - return position; + String pck1 = parser.next(); + String pck2 = parser.next(); - } + position.set(Position.KEY_POWER, parser.nextInt() / 1000); - @Override - protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) - throws Exception { + position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt()); - String sentence = (String) msg; + position.set(Position.KEY_RSSI, parser.nextInt()); - if (!sentence.contains(":")) { + if (channel != null) { + channel.write(MSG_KEEPALIVE); + } - Position position = decodePosition(channel, remoteAddress, sentence.substring(1)); + return position; - if (position != null) { - return position; + } else { + //send keepalive for message check + if (channel != null) { + channel.write(MSG_KEEPALIVE); } - } - if (channel != null) { - channel.write(MSG_KEEPALIVE); + return null; } - return null; - } } -- cgit v1.2.3 From 504277e7a77bdf27b1bed31f585ef01dace1a3a5 Mon Sep 17 00:00:00 2001 From: michaelloliveira Date: Mon, 4 Jun 2018 11:29:20 -0300 Subject: Modified structure for using Patterns. --- src/org/traccar/protocol/SviasProtocol.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) (limited to 'src/org/traccar/protocol') diff --git a/src/org/traccar/protocol/SviasProtocol.java b/src/org/traccar/protocol/SviasProtocol.java index b58872baf..8a45f43cb 100644 --- a/src/org/traccar/protocol/SviasProtocol.java +++ b/src/org/traccar/protocol/SviasProtocol.java @@ -21,10 +21,9 @@ import org.jboss.netty.handler.codec.string.StringDecoder; import org.jboss.netty.handler.codec.string.StringEncoder; import org.traccar.BaseProtocol; import org.traccar.TrackerServer; -import org.traccar.model.Command; import java.util.List; -import org.jboss.netty.bootstrap.ConnectionlessBootstrap; +import org.traccar.model.Command; public class SviasProtocol extends BaseProtocol { @@ -41,7 +40,7 @@ public class SviasProtocol extends BaseProtocol { Command.TYPE_ALARM_REMOVE); } - @Override + @Override public void initTrackerServers(List serverList) { serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { @Override @@ -52,15 +51,6 @@ public class SviasProtocol extends BaseProtocol { pipeline.addLast("objectDecoder", new SviasProtocolDecoder(SviasProtocol.this)); } }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectEncoder", new SviasProtocolEncoder()); - pipeline.addLast("objectDecoder", new SviasProtocolDecoder(SviasProtocol.this)); - } - }); } } -- cgit v1.2.3 From 7d83f65d3b2f9f57f3c1a4fc1288272571662f55 Mon Sep 17 00:00:00 2001 From: michaelloliveira Date: Tue, 5 Jun 2018 15:46:23 -0300 Subject: Optimized! --- src/org/traccar/protocol/SviasProtocolDecoder.java | 48 ++++++++-------------- 1 file changed, 16 insertions(+), 32 deletions(-) (limited to 'src/org/traccar/protocol') diff --git a/src/org/traccar/protocol/SviasProtocolDecoder.java b/src/org/traccar/protocol/SviasProtocolDecoder.java index ef631bf64..bc459de25 100644 --- a/src/org/traccar/protocol/SviasProtocolDecoder.java +++ b/src/org/traccar/protocol/SviasProtocolDecoder.java @@ -31,19 +31,15 @@ import org.traccar.model.Position; public class SviasProtocolDecoder extends BaseProtocolDecoder { - private static final String MSG_KEEPALIVE = "@"; - public SviasProtocolDecoder(SviasProtocol protocol) { super(protocol); } private static final Pattern PATTERN = new PatternBuilder() - .text("[") // delimiter init - .number("(dddd),") // version hardware - .number("(dddd),") // version software - .number("(d+),") // counter - .number("(d+),") // imei - .any() // model or hourmeter + .text("[") // delimiter init + .any() + .number("(dddddddd),") // imei + .any() .number("(d+),") // date (yyyymmdd) .number("(d+),") // time (hhmmss) .number("(-?d+),") // longitude @@ -53,9 +49,8 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { .number("(d+),") // odometer .number("(d+),") // input .number("(d+),") // output / status - .number("(d+),") // flag pack input 1 - .number("(d+),") // flag pack input 2 - .number("(d+),") // main power voltage + .any() + .number("(ddddd),") // main power voltage .number("(d+),") // percentual power internal battery .number("(d+),") // RSSID .any() @@ -71,6 +66,7 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { throws Exception { String sentence = (String) msg; + Object result = null; if (!sentence.contains(":")) { @@ -81,10 +77,6 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { Position position = new Position(getProtocolName()); - String versionHard = parser.next(); - String versionSoft = parser.next(); - String counterInternal = parser.next(); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); if (deviceSession == null) { return null; @@ -102,8 +94,8 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { position.setLatitude(convertCoordinates(parser.nextLong())); position.setLongitude(convertCoordinates(parser.nextLong())); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextInt() / 100)); - position.setCourse(parser.nextInt() / 100); + position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0) / 100)); + position.setCourse(parser.nextDouble(0) / 100); position.setAltitude(0); position.set(Position.KEY_ODOMETER, parser.nextInt()); @@ -121,30 +113,22 @@ public class SviasProtocolDecoder extends BaseProtocolDecoder { position.setValid(output.substring(0, 1).equals("1")); - String pck1 = parser.next(); - String pck2 = parser.next(); - - position.set(Position.KEY_POWER, parser.nextInt() / 1000); + position.set(Position.KEY_POWER, parser.nextDouble(0) / 1000); position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt()); position.set(Position.KEY_RSSI, parser.nextInt()); - if (channel != null) { - channel.write(MSG_KEEPALIVE); - } - - return position; + result = position; - } else { - //send keepalive for message check - if (channel != null) { - channel.write(MSG_KEEPALIVE); - } + } - return null; + if (channel != null) { + channel.write("@"); } + return result; + } } -- cgit v1.2.3