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 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