diff options
Diffstat (limited to 'src/org/traccar/protocol')
378 files changed, 0 insertions, 39324 deletions
diff --git a/src/org/traccar/protocol/AdmProtocol.java b/src/org/traccar/protocol/AdmProtocol.java deleted file mode 100644 index 4d2cbe7b3..000000000 --- a/src/org/traccar/protocol/AdmProtocol.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2015 - 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; -import org.jboss.netty.handler.codec.string.StringEncoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.nio.ByteOrder; -import java.util.List; - -public class AdmProtocol extends BaseProtocol { - - public AdmProtocol() { - super("adm"); - setSupportedDataCommands( - Command.TYPE_GET_DEVICE_STATUS, - Command.TYPE_CUSTOM); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2, 1, -3, 0)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new AdmProtocolEncoder()); - pipeline.addLast("objectDecoder", new AdmProtocolDecoder(AdmProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/AdmProtocolDecoder.java b/src/org/traccar/protocol/AdmProtocolDecoder.java deleted file mode 100644 index f93c55e18..000000000 --- a/src/org/traccar/protocol/AdmProtocolDecoder.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright 2012 - 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; - -public class AdmProtocolDecoder extends BaseProtocolDecoder { - - public AdmProtocolDecoder(AdmProtocol protocol) { - super(protocol); - } - - public static final int CMD_RESPONSE_SIZE = 0x84; - public static final int MSG_IMEI = 0x03; - public static final int MSG_PHOTO = 0x0A; - public static final int MSG_ADM5 = 0x01; - - private Position decodeData(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf, int type) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - if (BitUtil.to(type, 2) == 0) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_VERSION_FW, buf.readUnsignedByte()); - position.set(Position.KEY_INDEX, buf.readUnsignedShort()); - - int status = buf.readUnsignedShort(); - position.set(Position.KEY_STATUS, status); - position.setValid(!BitUtil.check(status, 5)); - position.setLatitude(buf.readFloat()); - position.setLongitude(buf.readFloat()); - position.setCourse(buf.readUnsignedShort() * 0.1); - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort() * 0.1)); - - position.set(Position.KEY_ACCELERATION, buf.readUnsignedByte() * 0.1); - position.setAltitude(buf.readUnsignedShort()); - position.set(Position.KEY_HDOP, buf.readUnsignedByte() * 0.1); - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte() & 0x0f); - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - - position.set(Position.KEY_POWER, buf.readUnsignedShort() * 0.001); - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - - if (BitUtil.check(type, 2)) { - buf.readUnsignedByte(); // vib - buf.readUnsignedByte(); // vib_count - - int out = buf.readUnsignedByte(); - for (int i = 0; i <= 3; i++) { - position.set(Position.PREFIX_OUT + (i + 1), BitUtil.check(out, i) ? 1 : 0); - } - - buf.readUnsignedByte(); // in_alarm - } - - if (BitUtil.check(type, 3)) { - for (int i = 1; i <= 6; i++) { - position.set(Position.PREFIX_ADC + i, buf.readUnsignedShort() * 0.001); - } - } - - if (BitUtil.check(type, 4)) { - for (int i = 1; i <= 2; i++) { - position.set(Position.PREFIX_COUNT + i, buf.readUnsignedInt()); - } - } - - if (BitUtil.check(type, 5)) { - for (int i = 1; i <= 3; i++) { - buf.readUnsignedShort(); // fuel level - } - for (int i = 1; i <= 3; i++) { - position.set(Position.PREFIX_TEMP + i, buf.readUnsignedByte()); - } - } - - if (BitUtil.check(type, 6)) { - buf.skipBytes(buf.getUnsignedByte(buf.readerIndex())); - } - - if (BitUtil.check(type, 7)) { - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - } - - return position; - } - - return null; - } - - private Position parseCommandResponse(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, null); - - int responseTextLength = buf.bytesBefore((byte) 0); - if (responseTextLength < 0) { - responseTextLength = CMD_RESPONSE_SIZE - 3; - } - position.set(Position.KEY_RESULT, buf.readBytes(responseTextLength).toString(StandardCharsets.UTF_8)); - - return position; - } - - @Override - protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.readUnsignedShort(); // device id - - int size = buf.readUnsignedByte(); - if (size != CMD_RESPONSE_SIZE) { - int type = buf.readUnsignedByte(); - if (type == MSG_IMEI) { - getDeviceSession(channel, remoteAddress, buf.readBytes(15).toString(StandardCharsets.UTF_8)); - } else { - return decodeData(channel, remoteAddress, buf, type); - } - } else { - return parseCommandResponse(channel, remoteAddress, buf); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/AdmProtocolEncoder.java b/src/org/traccar/protocol/AdmProtocolEncoder.java deleted file mode 100644 index 8cbd8618d..000000000 --- a/src/org/traccar/protocol/AdmProtocolEncoder.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2017 Anton Tananaev (anton@traccar.org) - * Copyright 2017 Anatoliy Golubev (darth.naihil@gmail.com) - * - * 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 AdmProtocolEncoder extends StringProtocolEncoder { - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_GET_DEVICE_STATUS: - return formatCommand(command, "STATUS\r\n"); - - case Command.TYPE_CUSTOM: - return formatCommand(command, "{%s}\r\n", Command.KEY_DATA); - - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } -} diff --git a/src/org/traccar/protocol/AisProtocol.java b/src/org/traccar/protocol/AisProtocol.java deleted file mode 100644 index 4b2e1719e..000000000 --- a/src/org/traccar/protocol/AisProtocol.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2016 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.ConnectionlessBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.string.StringDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class AisProtocol extends BaseProtocol { - - public AisProtocol() { - super("ais"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new AisProtocolDecoder(AisProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/AisProtocolDecoder.java b/src/org/traccar/protocol/AisProtocolDecoder.java deleted file mode 100644 index 1f7a12595..000000000 --- a/src/org/traccar/protocol/AisProtocolDecoder.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2016 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.helper.BitBuffer; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -public class AisProtocolDecoder extends BaseProtocolDecoder { - - public AisProtocolDecoder(AisProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("!AIVDM,") - .number("(d+),") // count - .number("(d+),") // index - .number("(d+)?,") // id - .expression(".,") // radio channel - .expression("([^,]+),") // payload - .any() - .compile(); - - private Position decodePayload(Channel channel, SocketAddress remoteAddress, BitBuffer buf) { - - int type = buf.readUnsigned(6); - if (type == 1 || type == 2 || type == 3 || type == 18) { - - buf.readUnsigned(2); - int mmsi = buf.readUnsigned(30); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, String.valueOf(mmsi)); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(new Date()); - - if (type == 18) { - buf.readUnsigned(8); // reserved - } else { - position.set(Position.KEY_STATUS, buf.readUnsigned(4)); - position.set("turn", buf.readSigned(8)); - } - - position.setSpeed(buf.readUnsigned(10) * 0.1); - position.setValid(buf.readUnsigned(1) != 0); - position.setLongitude(buf.readSigned(28) * 0.0001 / 60.0); - position.setLatitude(buf.readSigned(27) * 0.0001 / 60.0); - position.setCourse(buf.readUnsigned(12) * 0.1); - - position.set("heading", buf.readUnsigned(9)); - - return position; - - } - - return null; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String[] sentences = ((String) msg).split("\\r\\n"); - - List<Position> positions = new ArrayList<>(); - Map<Integer, BitBuffer> buffers = new HashMap<>(); - - for (String sentence : sentences) { - if (!sentence.isEmpty()) { - Parser parser = new Parser(PATTERN, sentence); - if (parser.matches()) { - - int count = parser.nextInt(0); - int index = parser.nextInt(0); - int id = parser.nextInt(0); - - Position position = null; - - if (count == 1) { - BitBuffer bits = new BitBuffer(); - bits.writeEncoded(parser.next().getBytes(StandardCharsets.US_ASCII)); - position = decodePayload(channel, remoteAddress, bits); - } else { - BitBuffer bits = buffers.get(id); - if (bits == null) { - bits = new BitBuffer(); - buffers.put(id, bits); - } - bits.writeEncoded(parser.next().getBytes(StandardCharsets.US_ASCII)); - if (count == index) { - position = decodePayload(channel, remoteAddress, bits); - buffers.remove(id); - } - } - - if (position != null) { - positions.add(position); - } - - } - } - } - - return positions; - } - -} diff --git a/src/org/traccar/protocol/AlematicsFrameDecoder.java b/src/org/traccar/protocol/AlematicsFrameDecoder.java deleted file mode 100644 index b8b3e3403..000000000 --- a/src/org/traccar/protocol/AlematicsFrameDecoder.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; - -public class AlematicsFrameDecoder extends LineBasedFrameDecoder { - - private static final int MESSAGE_MINIMUM_LENGTH = 2; - - public AlematicsFrameDecoder(int maxFrameLength) { - super(maxFrameLength); - } - - // example of heartbeat: FA F8 00 07 00 03 15 AD 4E 78 3A D2 - - @Override - protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < MESSAGE_MINIMUM_LENGTH) { - return null; - } - - if (buf.getUnsignedShort(buf.readerIndex()) == 0xFAF8) { - ChannelBuffer heartbeat = buf.readBytes(12); - if (channel != null) { - channel.write(heartbeat); - } - } - - return super.decode(ctx, channel, buf); - } - -} diff --git a/src/org/traccar/protocol/AlematicsProtocol.java b/src/org/traccar/protocol/AlematicsProtocol.java deleted file mode 100644 index 241ce8bf9..000000000 --- a/src/org/traccar/protocol/AlematicsProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 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.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 java.util.List; - -public class AlematicsProtocol extends BaseProtocol { - - public AlematicsProtocol() { - super("alematics"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new AlematicsFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new AlematicsProtocolDecoder(AlematicsProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/AlematicsProtocolDecoder.java b/src/org/traccar/protocol/AlematicsProtocolDecoder.java deleted file mode 100644 index da0704242..000000000 --- a/src/org/traccar/protocol/AlematicsProtocolDecoder.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 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.helper.BitUtil; -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 AlematicsProtocolDecoder extends BaseProtocolDecoder { - - public AlematicsProtocolDecoder(AlematicsProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$T,") - .number("(d+),") // type - .number("(d+),") // index - .number("(d+),") // id - .number("(dddd)(dd)(dd)") // gps date - .number("(dd)(dd)(dd),") // gps time - .number("(dddd)(dd)(dd)") // device date - .number("(dd)(dd)(dd),") // device time - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(d+),") // speed - .number("(d+),") // course - .number("(-?d+),") // altitude - .number("(d+.d),") // hdop - .number("(d+),") // satellites - .number("(d+),") // input - .number("(d+),") // output - .number("(d+.d+),") // adc - .number("(d+.d+),") // power - .number("(d+),") // odometer - .groupBegin() - .text("0,$S,") - .expression("(.*)") // text message - .or() - .number("(d+),") // extra mask - .expression("(.*)") // extra data - .groupEnd() - .compile(); - - private void decodeExtras(Position position, Parser parser) { - - int mask = parser.nextInt(); - String[] data = parser.next().split(","); - - int index = 0; - - if (BitUtil.check(mask, 0)) { - index++; // pulse counter 3 - } - - if (BitUtil.check(mask, 1)) { - position.set(Position.KEY_POWER, Integer.parseInt(data[index++])); - } - - if (BitUtil.check(mask, 2)) { - position.set(Position.KEY_BATTERY, Integer.parseInt(data[index++])); - } - - if (BitUtil.check(mask, 3)) { - position.set(Position.KEY_OBD_SPEED, Integer.parseInt(data[index++])); - } - - if (BitUtil.check(mask, 4)) { - position.set(Position.KEY_RPM, Integer.parseInt(data[index++])); - } - - if (BitUtil.check(mask, 5)) { - position.set(Position.KEY_RSSI, Integer.parseInt(data[index++])); - } - - if (BitUtil.check(mask, 6)) { - index++; // pulse counter 2 - } - - if (BitUtil.check(mask, 7)) { - index++; // magnetic rotation sensor rpm - } - - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.set(Position.KEY_TYPE, parser.nextInt()); - position.set(Position.KEY_INDEX, parser.nextInt()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setFixTime(parser.nextDateTime()); - position.setDeviceTime(parser.nextDateTime()); - - position.setValid(true); - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextInt(0))); - position.setCourse(parser.nextInt(0)); - position.setAltitude(parser.nextInt(0)); - - position.set(Position.KEY_HDOP, parser.nextDouble()); - position.set(Position.KEY_SATELLITES, parser.nextInt()); - position.set(Position.KEY_INPUT, parser.nextInt()); - position.set(Position.KEY_OUTPUT, parser.nextInt()); - position.set(Position.PREFIX_ADC + 1, parser.nextDouble()); - position.set(Position.KEY_POWER, parser.nextDouble()); - position.set(Position.KEY_ODOMETER, parser.nextInt()); - - if (parser.hasNext()) { - position.set("text", parser.next()); - } else { - decodeExtras(position, parser); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/ApelProtocol.java b/src/org/traccar/protocol/ApelProtocol.java deleted file mode 100644 index 690b5ed99..000000000 --- a/src/org/traccar/protocol/ApelProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class ApelProtocol extends BaseProtocol { - - public ApelProtocol() { - super("apel"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2, 2, 4, 0)); - pipeline.addLast("objectDecoder", new ApelProtocolDecoder(ApelProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/ApelProtocolDecoder.java b/src/org/traccar/protocol/ApelProtocolDecoder.java deleted file mode 100644 index 6e16e02be..000000000 --- a/src/org/traccar/protocol/ApelProtocolDecoder.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright 2013 - 2014 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Checksum; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class ApelProtocolDecoder extends BaseProtocolDecoder { - - private long lastIndex; - private long newIndex; - - public ApelProtocolDecoder(ApelProtocol protocol) { - super(protocol); - } - - public static final short MSG_NULL = 0; - public static final short MSG_REQUEST_TRACKER_ID = 10; - public static final short MSG_TRACKER_ID = 11; - public static final short MSG_TRACKER_ID_EXT = 12; - public static final short MSG_DISCONNECT = 20; - public static final short MSG_REQUEST_PASSWORD = 30; - public static final short MSG_PASSWORD = 31; - public static final short MSG_REQUEST_STATE_FULL_INFO = 90; - public static final short MSG_STATE_FULL_INFO_T104 = 92; - public static final short MSG_REQUEST_CURRENT_GPS_DATA = 100; - public static final short MSG_CURRENT_GPS_DATA = 101; - public static final short MSG_REQUEST_SENSORS_STATE = 110; - public static final short MSG_SENSORS_STATE = 111; - public static final short MSG_SENSORS_STATE_T100 = 112; - public static final short MSG_SENSORS_STATE_T100_4 = 113; - public static final short MSG_REQUEST_LAST_LOG_INDEX = 120; - public static final short MSG_LAST_LOG_INDEX = 121; - public static final short MSG_REQUEST_LOG_RECORDS = 130; - public static final short MSG_LOG_RECORDS = 131; - public static final short MSG_EVENT = 141; - public static final short MSG_TEXT = 150; - public static final short MSG_ACK_ALARM = 160; - public static final short MSG_SET_TRACKER_MODE = 170; - public static final short MSG_GPRS_COMMAND = 180; - - private void sendSimpleMessage(Channel channel, short type) { - ChannelBuffer request = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, 8); - request.writeShort(type); - request.writeShort(0); - request.writeInt(Checksum.crc32(request.toByteBuffer(0, 4))); - channel.write(request); - } - - private void requestArchive(Channel channel) { - if (lastIndex == 0) { - lastIndex = newIndex; - } else if (newIndex > lastIndex) { - ChannelBuffer request = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, 14); - request.writeShort(MSG_REQUEST_LOG_RECORDS); - request.writeShort(6); - request.writeInt((int) lastIndex); - request.writeShort(512); - request.writeInt(Checksum.crc32(request.toByteBuffer(0, 10))); - channel.write(request); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - int type = buf.readUnsignedShort(); - boolean alarm = (type & 0x8000) != 0; - type = type & 0x7FFF; - buf.readUnsignedShort(); // length - - if (alarm) { - sendSimpleMessage(channel, MSG_ACK_ALARM); - } - - if (type == MSG_TRACKER_ID) { - return null; // unsupported authentication type - } - - if (type == MSG_TRACKER_ID_EXT) { - - buf.readUnsignedInt(); // id - int length = buf.readUnsignedShort(); - buf.skipBytes(length); - length = buf.readUnsignedShort(); - getDeviceSession(channel, remoteAddress, buf.readBytes(length).toString(StandardCharsets.US_ASCII)); - - } else if (type == MSG_LAST_LOG_INDEX) { - - long index = buf.readUnsignedInt(); - if (index > 0) { - newIndex = index; - requestArchive(channel); - } - - } else if (type == MSG_CURRENT_GPS_DATA || type == MSG_STATE_FULL_INFO_T104 || type == MSG_LOG_RECORDS) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - List<Position> positions = new LinkedList<>(); - - int recordCount = 1; - if (type == MSG_LOG_RECORDS) { - recordCount = buf.readUnsignedShort(); - } - - for (int j = 0; j < recordCount; j++) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - int subtype = type; - if (type == MSG_LOG_RECORDS) { - position.set(Position.KEY_ARCHIVE, true); - lastIndex = buf.readUnsignedInt() + 1; - position.set(Position.KEY_INDEX, lastIndex); - - subtype = buf.readUnsignedShort(); - if (subtype != MSG_CURRENT_GPS_DATA && subtype != MSG_STATE_FULL_INFO_T104) { - buf.skipBytes(buf.readUnsignedShort()); - continue; - } - buf.readUnsignedShort(); // length - } - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - position.setLatitude(buf.readInt() * 180.0 / 0x7FFFFFFF); - position.setLongitude(buf.readInt() * 180.0 / 0x7FFFFFFF); - - if (subtype == MSG_STATE_FULL_INFO_T104) { - int speed = buf.readUnsignedByte(); - position.setValid(speed != 255); - position.setSpeed(UnitsConverter.knotsFromKph(speed)); - position.set(Position.KEY_HDOP, buf.readByte()); - } else { - int speed = buf.readShort(); - position.setValid(speed != -1); - position.setSpeed(UnitsConverter.knotsFromKph(speed * 0.01)); - } - - position.setCourse(buf.readShort() * 0.01); - position.setAltitude(buf.readShort()); - - if (subtype == MSG_STATE_FULL_INFO_T104) { - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - position.set(Position.KEY_EVENT, buf.readUnsignedShort()); - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - position.set(Position.KEY_INPUT, buf.readUnsignedByte()); - position.set(Position.KEY_OUTPUT, buf.readUnsignedByte()); - - for (int i = 1; i <= 8; i++) { - position.set(Position.PREFIX_ADC + i, buf.readUnsignedShort()); - } - - position.set(Position.PREFIX_COUNT + 1, buf.readUnsignedInt()); - position.set(Position.PREFIX_COUNT + 2, buf.readUnsignedInt()); - position.set(Position.PREFIX_COUNT + 3, buf.readUnsignedInt()); - } - - positions.add(position); - } - - buf.readUnsignedInt(); // crc - - if (type == MSG_LOG_RECORDS) { - requestArchive(channel); - } else { - sendSimpleMessage(channel, MSG_REQUEST_LAST_LOG_INDEX); - } - - return positions; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/AplicomFrameDecoder.java b/src/org/traccar/protocol/AplicomFrameDecoder.java deleted file mode 100644 index 24d55f1cf..000000000 --- a/src/org/traccar/protocol/AplicomFrameDecoder.java +++ /dev/null @@ -1,62 +0,0 @@ -/*
- * Copyright 2013 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.buffer.ChannelBuffer;
-import org.jboss.netty.channel.Channel;
-import org.jboss.netty.channel.ChannelHandlerContext;
-import org.jboss.netty.handler.codec.frame.FrameDecoder;
-
-public class AplicomFrameDecoder extends FrameDecoder {
-
- @Override
- protected Object decode(
- ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception {
-
- // Skip Alive message
- while (buf.readable() && Character.isDigit(buf.getByte(buf.readerIndex()))) {
- buf.readByte();
- }
-
- // Check minimum length
- if (buf.readableBytes() < 11) {
- return null;
- }
-
- // Read flags
- int version = buf.getUnsignedByte(buf.readerIndex() + 1);
- int offset = 1 + 1 + 3;
- if ((version & 0x80) != 0) {
- offset += 4;
- }
-
- // Get data length
- int length = buf.getUnsignedShort(buf.readerIndex() + offset);
- offset += 2;
- if ((version & 0x40) != 0) {
- offset += 3;
- }
- length += offset; // add header
-
- // Return buffer
- if (buf.readableBytes() >= length) {
- return buf.readBytes(length);
- }
-
- return null;
- }
-
-}
diff --git a/src/org/traccar/protocol/AplicomProtocol.java b/src/org/traccar/protocol/AplicomProtocol.java deleted file mode 100644 index 80f6f528f..000000000 --- a/src/org/traccar/protocol/AplicomProtocol.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class AplicomProtocol extends BaseProtocol { - - public AplicomProtocol() { - super("aplicom"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new AplicomFrameDecoder()); - pipeline.addLast("objectDecoder", new AplicomProtocolDecoder(AplicomProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/AplicomProtocolDecoder.java b/src/org/traccar/protocol/AplicomProtocolDecoder.java deleted file mode 100644 index 154451b5b..000000000 --- a/src/org/traccar/protocol/AplicomProtocolDecoder.java +++ /dev/null @@ -1,638 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.Checksum; -import org.traccar.helper.Log; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Date; - -public class AplicomProtocolDecoder extends BaseProtocolDecoder { - - public AplicomProtocolDecoder(AplicomProtocol protocol) { - super(protocol); - } - - private static final long IMEI_BASE_TC65_V20 = 0x1437207000000L; - private static final long IMEI_BASE_TC65_V28 = 358244010000000L; - private static final long IMEI_BASE_TC65I_V11 = 0x14143B4000000L; - - private static boolean validateImei(long imei) { - return Checksum.luhn(imei / 10) == imei % 10; - } - - private static long imeiFromUnitId(long unitId) { - - if (unitId == 0) { - - return 0; - - } else { - - // Try TC65i - long imei = IMEI_BASE_TC65I_V11 + unitId; - if (validateImei(imei)) { - return imei; - } - - // Try TC65 v2.8 - imei = IMEI_BASE_TC65_V28 + ((unitId + 0xA8180) & 0xFFFFFF); - if (validateImei(imei)) { - return imei; - } - - // Try TC65 v2.0 - imei = IMEI_BASE_TC65_V20 + unitId; - if (validateImei(imei)) { - return imei; - } - - } - - return unitId; - } - - private static final int DEFAULT_SELECTOR_D = 0x0002fC; - private static final int DEFAULT_SELECTOR_E = 0x007ffc; - private static final int DEFAULT_SELECTOR_F = 0x0007fd; - - private static final int EVENT_DATA = 119; - - private void decodeEventData(Position position, ChannelBuffer buf, int event) { - switch (event) { - case 2: - case 40: - buf.readUnsignedByte(); - break; - case 9: - buf.readUnsignedMedium(); - break; - case 31: - case 32: - buf.readUnsignedShort(); - break; - case 38: - buf.skipBytes(4 * 9); - break; - case 113: - buf.readUnsignedInt(); - buf.readUnsignedByte(); - break; - case 121: - case 142: - buf.readLong(); - break; - case 130: - buf.readUnsignedInt(); // incorrect - break; - case 188: - decodeEB(position, buf); - break; - default: - break; - } - } - - private void decodeCanData(ChannelBuffer buf, Position position) { - - buf.readUnsignedMedium(); // packet identifier - position.set(Position.KEY_VERSION_FW, buf.readUnsignedByte()); - int count = buf.readUnsignedByte(); - buf.readUnsignedByte(); // batch count - buf.readUnsignedShort(); // selector bit - buf.readUnsignedInt(); // timestamp - - buf.skipBytes(8); - - ArrayList<ChannelBuffer> values = new ArrayList<>(count); - - for (int i = 0; i < count; i++) { - values.add(buf.readBytes(8)); - } - - for (int i = 0; i < count; i++) { - ChannelBuffer value = values.get(i); - switch (buf.readInt()) { - case 0x20D: - position.set(Position.KEY_RPM, ChannelBuffers.swapShort(value.readShort())); - position.set("dieselTemperature", ChannelBuffers.swapShort(value.readShort()) * 0.1); - position.set("batteryVoltage", ChannelBuffers.swapShort(value.readShort()) * 0.01); - position.set("supplyAirTempDep1", ChannelBuffers.swapShort(value.readShort()) * 0.1); - break; - case 0x30D: - position.set("activeAlarm", ChannelBuffers.hexDump(value)); - break; - case 0x40C: - position.set("airTempDep1", ChannelBuffers.swapShort(value.readShort()) * 0.1); - position.set("airTempDep2", ChannelBuffers.swapShort(value.readShort()) * 0.1); - break; - case 0x40D: - position.set("coldUnitState", ChannelBuffers.hexDump(value)); - break; - case 0x50C: - position.set("defrostTempDep1", ChannelBuffers.swapShort(value.readShort()) * 0.1); - position.set("defrostTempDep2", ChannelBuffers.swapShort(value.readShort()) * 0.1); - break; - case 0x50D: - position.set("condenserPressure", ChannelBuffers.swapShort(value.readShort()) * 0.1); - position.set("suctionPressure", ChannelBuffers.swapShort(value.readShort()) * 0.1); - break; - case 0x58C: - value.readByte(); - value.readShort(); // index - switch (value.readByte()) { - case 0x01: - position.set("setpointZone1", ChannelBuffers.swapInt(value.readInt()) * 0.1); - break; - case 0x02: - position.set("setpointZone2", ChannelBuffers.swapInt(value.readInt()) * 0.1); - break; - case 0x05: - position.set("unitType", ChannelBuffers.swapInt(value.readInt())); - break; - case 0x13: - position.set("dieselHours", ChannelBuffers.swapInt(value.readInt()) / 60 / 60); - break; - case 0x14: - position.set("electricHours", ChannelBuffers.swapInt(value.readInt()) / 60 / 60); - break; - case 0x17: - position.set("serviceIndicator", ChannelBuffers.swapInt(value.readInt())); - break; - case 0x18: - position.set("softwareVersion", ChannelBuffers.swapInt(value.readInt()) * 0.01); - break; - default: - break; - } - break; - default: - Log.warning(new UnsupportedOperationException()); - break; - } - } - } - - private void decodeD(Position position, ChannelBuffer buf, int selector, int event) { - - if ((selector & 0x0008) != 0) { - position.setValid((buf.readUnsignedByte() & 0x40) != 0); - } else { - getLastLocation(position, null); - } - - if ((selector & 0x0004) != 0) { - buf.skipBytes(4); // snapshot time - } - - if ((selector & 0x0008) != 0) { - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - position.setLatitude(buf.readInt() / 1000000.0); - position.setLongitude(buf.readInt() / 1000000.0); - position.set(Position.KEY_SATELLITES_VISIBLE, buf.readUnsignedByte()); - } - - if ((selector & 0x0010) != 0) { - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - position.set("maximumSpeed", buf.readUnsignedByte()); - position.setCourse(buf.readUnsignedByte() * 2.0); - } - - if ((selector & 0x0040) != 0) { - position.set(Position.KEY_INPUT, buf.readUnsignedByte()); - } - - if ((selector & 0x0020) != 0) { - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 2, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 3, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 4, buf.readUnsignedShort()); - } - - if ((selector & 0x8000) != 0) { - position.set(Position.KEY_POWER, buf.readUnsignedShort() * 0.001); - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - } - - // Pulse rate 1 - if ((selector & 0x10000) != 0) { - buf.readUnsignedShort(); - buf.readUnsignedInt(); - } - - // Pulse rate 2 - if ((selector & 0x20000) != 0) { - buf.readUnsignedShort(); - buf.readUnsignedInt(); - } - - if ((selector & 0x0080) != 0) { - position.set("trip1", buf.readUnsignedInt()); - } - - if ((selector & 0x0100) != 0) { - position.set("trip2", buf.readUnsignedInt()); - } - - if ((selector & 0x0040) != 0) { - position.set(Position.KEY_OUTPUT, buf.readUnsignedByte()); - } - - if ((selector & 0x0200) != 0) { - position.set(Position.KEY_DRIVER_UNIQUE_ID, - String.valueOf(((long) buf.readUnsignedShort()) << 32) + buf.readUnsignedInt()); - } - - if ((selector & 0x0400) != 0) { - buf.readUnsignedByte(); // Keypad - } - - if ((selector & 0x0800) != 0) { - position.setAltitude(buf.readShort()); - } - - if ((selector & 0x2000) != 0) { - buf.readUnsignedShort(); // snapshot counter - } - - if ((selector & 0x4000) != 0) { - buf.skipBytes(8); // state flags - } - - if ((selector & 0x80000) != 0) { - buf.skipBytes(11); // cell info - } - - if ((selector & 0x1000) != 0) { - decodeEventData(position, buf, event); - } - - if (Context.getConfig().getBoolean(getProtocolName() + ".can") - && buf.readable() && (selector & 0x1000) != 0 && event == EVENT_DATA) { - decodeCanData(buf, position); - } - } - - private void decodeE(Position position, ChannelBuffer buf, int selector) { - - if ((selector & 0x0008) != 0) { - position.set("tachographEvent", buf.readUnsignedShort()); - } - - if ((selector & 0x0004) != 0) { - getLastLocation(position, new Date(buf.readUnsignedInt() * 1000)); - } else { - getLastLocation(position, null); - } - - if ((selector & 0x0010) != 0) { - String time = buf.readUnsignedByte() + "s " + buf.readUnsignedByte() + "m " + buf.readUnsignedByte() + "h " - + buf.readUnsignedByte() + "M " + buf.readUnsignedByte() + "D " + buf.readUnsignedByte() + "Y " - + buf.readByte() + "m " + buf.readByte() + "h"; - position.set("tachographTime", time); - } - - position.set("workState", buf.readUnsignedByte()); - position.set("driver1State", buf.readUnsignedByte()); - position.set("driver2State", buf.readUnsignedByte()); - - if ((selector & 0x0020) != 0) { - position.set("tachographStatus", buf.readUnsignedByte()); - } - - if ((selector & 0x0040) != 0) { - position.set(Position.KEY_OBD_SPEED, buf.readUnsignedShort() / 256.0); - } - - if ((selector & 0x0080) != 0) { - position.set(Position.KEY_OBD_ODOMETER, buf.readUnsignedInt() * 5); - } - - if ((selector & 0x0100) != 0) { - position.set(Position.KEY_ODOMETER_TRIP, buf.readUnsignedInt() * 5); - } - - if ((selector & 0x8000) != 0) { - position.set("kFactor", buf.readUnsignedShort() * 0.001 + " pulses/m"); - } - - if ((selector & 0x0200) != 0) { - position.set(Position.KEY_RPM, buf.readUnsignedShort() * 0.125); - } - - if ((selector & 0x0400) != 0) { - position.set("extraInfo", buf.readUnsignedShort()); - } - - if ((selector & 0x0800) != 0) { - position.set(Position.KEY_VIN, buf.readBytes(18).toString(StandardCharsets.US_ASCII).trim()); - } - - if ((selector & 0x2000) != 0) { - buf.readUnsignedByte(); // card 1 type - buf.readUnsignedByte(); // card 1 country code - String card = buf.readBytes(20).toString(StandardCharsets.US_ASCII).trim(); - if (!card.isEmpty()) { - position.set("card1", card); - } - } - - if ((selector & 0x4000) != 0) { - buf.readUnsignedByte(); // card 2 type - buf.readUnsignedByte(); // card 2 country code - String card = buf.readBytes(20).toString(StandardCharsets.US_ASCII).trim(); - if (!card.isEmpty()) { - position.set("card2", card); - } - } - - if ((selector & 0x10000) != 0) { - int count = buf.readUnsignedByte(); - for (int i = 1; i <= count; i++) { - position.set("driver" + i, buf.readBytes(22).toString(StandardCharsets.US_ASCII).trim()); - position.set("driverTime" + i, buf.readUnsignedInt()); - } - } - } - - private void decodeH(Position position, ChannelBuffer buf, int selector) { - - if ((selector & 0x0004) != 0) { - getLastLocation(position, new Date(buf.readUnsignedInt() * 1000)); - } else { - getLastLocation(position, null); - } - - if ((selector & 0x0040) != 0) { - buf.readUnsignedInt(); // reset time - } - - if ((selector & 0x2000) != 0) { - buf.readUnsignedShort(); // snapshot counter - } - - int index = 1; - while (buf.readableBytes() > 0) { - - position.set("h" + index + "Index", buf.readUnsignedByte()); - - buf.readUnsignedShort(); // length - - int n = buf.readUnsignedByte(); - int m = buf.readUnsignedByte(); - - position.set("h" + index + "XLength", n); - position.set("h" + index + "YLength", m); - - if ((selector & 0x0008) != 0) { - position.set("h" + index + "XType", buf.readUnsignedByte()); - position.set("h" + index + "YType", buf.readUnsignedByte()); - position.set("h" + index + "Parameters", buf.readUnsignedByte()); - } - - boolean percentageFormat = (selector & 0x0020) != 0; - - StringBuilder data = new StringBuilder(); - for (int i = 0; i < n * m; i++) { - if (percentageFormat) { - data.append(buf.readUnsignedByte() * 0.5).append("%").append(" "); - } else { - data.append(buf.readUnsignedShort()).append(" "); - } - } - - position.set("h" + index + "Data", data.toString().trim()); - - position.set("h" + index + "Total", buf.readUnsignedInt()); - - if ((selector & 0x0010) != 0) { - int k = buf.readUnsignedByte(); - - data = new StringBuilder(); - for (int i = 1; i < n; i++) { - if (k == 1) { - data.append(buf.readByte()).append(" "); - } else if (k == 2) { - data.append(buf.readShort()).append(" "); - } - } - position.set("h" + index + "XLimits", data.toString().trim()); - - data = new StringBuilder(); - for (int i = 1; i < m; i++) { - if (k == 1) { - data.append(buf.readByte()).append(" "); - } else if (k == 2) { - data.append(buf.readShort()).append(" "); - } - } - position.set("h" + index + "YLimits", data.toString().trim()); - } - - index += 1; - } - } - - private void decodeEB(Position position, ChannelBuffer buf) { - - if (buf.readByte() != (byte) 'E' || buf.readByte() != (byte) 'B') { - return; - } - - position.set(Position.KEY_VERSION_FW, buf.readUnsignedByte()); - position.set(Position.KEY_EVENT, buf.readUnsignedShort()); - position.set("dataValidity", buf.readUnsignedByte()); - position.set("towed", buf.readUnsignedByte()); - buf.readUnsignedShort(); // length - - while (buf.readableBytes() > 0) { - buf.readUnsignedByte(); // towed position - int type = buf.readUnsignedByte(); - int length = buf.readUnsignedByte(); - int end = buf.readerIndex() + length; - - switch (type) { - case 0x01: - position.set("brakeFlags", ChannelBuffers.hexDump(buf.readBytes(length))); - break; - case 0x02: - position.set("wheelSpeed", buf.readUnsignedShort() / 256.0); - position.set("wheelSpeedDifference", buf.readUnsignedShort() / 256.0 - 125.0); - position.set("lateralAcceleration", buf.readUnsignedByte() / 10.0 - 12.5); - position.set("vehicleSpeed", buf.readUnsignedShort() / 256.0); - break; - case 0x03: - position.set("axleLoadSum", buf.readUnsignedShort() * 2); - break; - case 0x04: - position.set("tyrePressure", buf.readUnsignedByte() * 10); - position.set("pneumaticPressure", buf.readUnsignedByte() * 5); - break; - case 0x05: - position.set("brakeLining", buf.readUnsignedByte() * 0.4); - position.set("brakeTemperature", buf.readUnsignedByte() * 10); - break; - case 0x06: - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt() * 5L); - position.set(Position.KEY_ODOMETER_TRIP, buf.readUnsignedInt() * 5L); - position.set(Position.KEY_ODOMETER_SERVICE, (buf.readUnsignedInt() - 2105540607) * 5L); - break; - case 0x0A: - position.set("absStatusCounter", buf.readUnsignedShort()); - position.set("atvbStatusCounter", buf.readUnsignedShort()); - position.set("vdcActiveCounter", buf.readUnsignedShort()); - break; - case 0x0B: - position.set("brakeMinMaxData", ChannelBuffers.hexDump(buf.readBytes(length))); - break; - case 0x0C: - position.set("missingPgn", ChannelBuffers.hexDump(buf.readBytes(length))); - break; - case 0x0D: - buf.readUnsignedByte(); - position.set("towedDetectionStatus", buf.readUnsignedInt()); - buf.skipBytes(17); // vin - break; - case 0x0E: - default: - break; - } - - buf.readerIndex(end); - } - } - - private void decodeF(Position position, ChannelBuffer buf, int selector) { - - getLastLocation(position, null); - - if ((selector & 0x0004) != 0) { - buf.skipBytes(4); // snapshot time - } - - buf.readUnsignedByte(); // data validity - - if ((selector & 0x0008) != 0) { - position.set(Position.KEY_RPM, buf.readUnsignedShort()); - position.set("rpmMax", buf.readUnsignedShort()); - position.set("rpmMin", buf.readUnsignedShort()); - } - - if ((selector & 0x0010) != 0) { - position.set("engineTemp", buf.readShort()); - position.set("engineTempMax", buf.readShort()); - position.set("engineTempMin", buf.readShort()); - } - - if ((selector & 0x0020) != 0) { - position.set(Position.KEY_HOURS, buf.readUnsignedInt()); - position.set("serviceDistance", buf.readInt()); - position.set("driverActivity", buf.readUnsignedByte()); - position.set(Position.KEY_THROTTLE, buf.readUnsignedByte()); - position.set(Position.KEY_FUEL_LEVEL, buf.readUnsignedByte()); - } - - if ((selector & 0x0040) != 0) { - position.set("totalFuelUsed", buf.readUnsignedInt()); - } - - if ((selector & 0x0080) != 0) { - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - } - - if ((selector & 0x0100) != 0) { - position.set(Position.KEY_OBD_SPEED, buf.readUnsignedByte()); - position.set("speedMax", buf.readUnsignedByte()); - position.set("speedMin", buf.readUnsignedByte()); - position.set("hardBraking", buf.readUnsignedByte()); - } - - if ((selector & 0x0200) != 0) { - position.set("tachographSpeed", buf.readUnsignedByte()); - position.set("driver1State", buf.readUnsignedByte()); - position.set("driver2State", buf.readUnsignedByte()); - position.set("tachographStatus", buf.readUnsignedByte()); - position.set("overspeedCount", buf.readUnsignedByte()); - } - - } - - @Override - protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - char protocol = (char) buf.readByte(); - int version = buf.readUnsignedByte(); - - String imei; - if ((version & 0x80) != 0) { - imei = String.valueOf((buf.readUnsignedInt() << (3 * 8)) | buf.readUnsignedMedium()); - } else { - imei = String.valueOf(imeiFromUnitId(buf.readUnsignedMedium())); - } - - buf.readUnsignedShort(); // length - - int selector = DEFAULT_SELECTOR_D; - if (protocol == 'E') { - selector = DEFAULT_SELECTOR_E; - } else if (protocol == 'F') { - selector = DEFAULT_SELECTOR_F; - } - if ((version & 0x40) != 0) { - selector = buf.readUnsignedMedium(); - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - int event = buf.readUnsignedByte(); - position.set(Position.KEY_EVENT, event); - position.set("eventInfo", buf.readUnsignedByte()); - - if (protocol == 'D') { - decodeD(position, buf, selector, event); - } else if (protocol == 'E') { - decodeE(position, buf, selector); - } else if (protocol == 'H') { - decodeH(position, buf, selector); - } else if (protocol == 'F') { - decodeF(position, buf, selector); - } else { - return null; - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/AppelloProtocol.java b/src/org/traccar/protocol/AppelloProtocol.java deleted file mode 100644 index 8581850a1..000000000 --- a/src/org/traccar/protocol/AppelloProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class AppelloProtocol extends BaseProtocol { - - public AppelloProtocol() { - super("appello"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new AppelloProtocolDecoder(AppelloProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/AppelloProtocolDecoder.java b/src/org/traccar/protocol/AppelloProtocolDecoder.java deleted file mode 100644 index 30dec3941..000000000 --- a/src/org/traccar/protocol/AppelloProtocolDecoder.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2016 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class AppelloProtocolDecoder extends BaseProtocolDecoder { - - public AppelloProtocolDecoder(AppelloProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("FOLLOWIT,") // brand - .number("(d+),") // imei - .groupBegin() - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd).?d*,") // time (hhmmss) - .or() - .text("UTCTIME,") - .groupEnd() - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(d+),") // speed - .number("(d+),") // course - .number("(d+),") // satellites - .number("(-?d+),") // altitude - .expression("([FL]),") // gps state - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - String imei = parser.next(); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - if (parser.hasNext(6)) { - position.setTime(parser.nextDateTime()); - } else { - getLastLocation(position, null); - } - - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - - position.setAltitude(parser.nextDouble(0)); - - position.setValid(parser.next().equals("F")); - - return position; - } - -} diff --git a/src/org/traccar/protocol/AquilaProtocol.java b/src/org/traccar/protocol/AquilaProtocol.java deleted file mode 100644 index c1de71cd3..000000000 --- a/src/org/traccar/protocol/AquilaProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class AquilaProtocol extends BaseProtocol { - - public AquilaProtocol() { - super("aquila"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new AquilaProtocolDecoder(AquilaProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/AquilaProtocolDecoder.java b/src/org/traccar/protocol/AquilaProtocolDecoder.java deleted file mode 100644 index 773210b04..000000000 --- a/src/org/traccar/protocol/AquilaProtocolDecoder.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright 2015 - 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.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 AquilaProtocolDecoder extends BaseProtocolDecoder { - - public AquilaProtocolDecoder(AquilaProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$$") - .expression("[^,]*,") // client - .number("(d+),") // device serial number - .number("(d+),") // event - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .expression("([AV]),") // validity - .number("(d+),") // gsm - .number("(d+),") // speed - .number("(d+),") // distance - .groupBegin() - .number("d+,") // driver code - .number("(d+),") // fuel - .number("([01]),") // io 1 - .number("[01],") // case open switch - .number("[01],") // over speed start - .number("[01],") // over speed end - .number("(?:d+,){3}") // reserved - .number("([01]),") // power status - .number("([01]),") // io 2 - .number("d+,") // reserved - .number("([01]),") // ignition - .number("[01],") // ignition off event - .number("(?:d+,){7}") // reserved - .number("[01],") // corner packet - .number("(?:d+,){8}") // reserved - .number("([01]),") // course bit 0 - .number("([01]),") // course bit 1 - .number("([01]),") // course bit 2 - .number("([01]),") // course bit 3 - .or() - .number("(d+),") // course - .number("(?:d+,){3}") // reserved - .number("[01],") // over speed start - .number("[01],") // over speed end - .number("(?:d+,){3}") // reserved - .number("([01]),") // power status - .number("(?:d+,){2}") // reserved - .number("[01],") // ignition on event - .number("([01]),") // ignition - .number("[01],") // ignition off event - .number("(?:d+,){5}") // reserved - .number("[01],") // low battery - .number("[01],") // corner packet - .number("(?:d+,){6}") // reserved - .number("[01],") // hard acceleration - .number("[01],") // hard braking - .number("[01],[01],[01],[01],") // course bits - .number("(d+),") // external voltage - .number("(d+),") // internal voltage - .number("(?:d+,){6}") // reserved - .expression("P([^,]+),") // obd - .expression("D([^,]+),") // dtcs - .number("-?d+,") // accelerometer x - .number("-?d+,") // accelerometer y - .number("-?d+,") // accelerometer z - .number("d+,") // delta distance - .or() - .number("(d+),") // course - .number("(d+),") // satellites - .number("(d+.d+),") // hdop - .number("(?:d+,){2}") // reserved - .number("(d+),") // adc 1 - .number("([01]),") // di 1 - .number("[01],") // case open - .number("[01],") // over speed start - .number("[01],") // over speed end - .number("(?:[01],){2}") // reserved - .number("[01],") // immobilizer - .number("([01]),") // power status - .number("([01]),") // di 2 - .number("(?:[01],){2}") // reserved - .number("([01]),") // ignition - .number("(?:[01],){6}") // reserved - .number("[01],") // low battery - .number("[01],") // corner packet - .number("(?:[01],){4}") // reserved - .number("[01],") // do 1 - .number("[01],") // reserved - .number("[01],") // hard acceleration - .number("[01],") // hard braking - .number("(?:[01],){4}") // reserved - .number("(d+),") // external voltage - .number("(d+),") // internal voltage - .groupEnd() - .text("*") - .number("xx") // checksum - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_EVENT, parser.nextInt(0)); - - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - - position.setTime(parser.nextDateTime()); - - position.setValid(parser.next().equals("A")); - - position.set(Position.KEY_RSSI, parser.nextInt(0)); - - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - - position.set(Position.KEY_ODOMETER, parser.nextInt(0)); - - if (parser.hasNext(9)) { - - position.set(Position.KEY_FUEL_LEVEL, parser.nextInt()); - position.set(Position.PREFIX_IN + 1, parser.next()); - position.set(Position.KEY_CHARGE, parser.next().equals("1")); - position.set(Position.PREFIX_IN + 2, parser.next()); - - position.set(Position.KEY_IGNITION, parser.nextInt(0) == 1); - - int course = (parser.nextInt(0) << 3) + (parser.nextInt(0) << 2) - + (parser.nextInt(0) << 1) + parser.nextInt(0); - if (course > 0 && course <= 8) { - position.setCourse((course - 1) * 45); - } - - } else if (parser.hasNext(7)) { - - position.setCourse(parser.nextInt(0)); - - position.set(Position.KEY_CHARGE, parser.next().equals("1")); - position.set(Position.KEY_IGNITION, parser.nextInt(0) == 1); - position.set(Position.KEY_POWER, parser.nextInt(0)); - position.set(Position.KEY_BATTERY, parser.nextInt(0)); - - String obd = parser.next(); - position.set("obd", obd.substring(1, obd.length() - 1)); - - String dtcs = parser.next(); - position.set(Position.KEY_DTCS, dtcs.substring(1, dtcs.length() - 1).replace('|', ' ')); - - } else { - - position.setCourse(parser.nextInt(0)); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - position.set(Position.KEY_HDOP, parser.nextDouble(0)); - position.set(Position.PREFIX_ADC + 1, parser.nextInt(0)); - position.set(Position.PREFIX_IN + 1, parser.nextInt(0)); - position.set(Position.KEY_CHARGE, parser.next().equals("1")); - position.set(Position.PREFIX_IN + 2, parser.nextInt(0)); - position.set(Position.KEY_IGNITION, parser.nextInt(0) == 1); - position.set(Position.KEY_POWER, parser.nextInt(0)); - position.set(Position.KEY_BATTERY, parser.nextInt(0)); - - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/Ardi01Protocol.java b/src/org/traccar/protocol/Ardi01Protocol.java deleted file mode 100644 index 446592bd0..000000000 --- a/src/org/traccar/protocol/Ardi01Protocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class Ardi01Protocol extends BaseProtocol { - - public Ardi01Protocol() { - super("ardi01"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new Ardi01ProtocolDecoder(Ardi01Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Ardi01ProtocolDecoder.java b/src/org/traccar/protocol/Ardi01ProtocolDecoder.java deleted file mode 100644 index 7a5bd217c..000000000 --- a/src/org/traccar/protocol/Ardi01ProtocolDecoder.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -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 Ardi01ProtocolDecoder extends BaseProtocolDecoder { - - public Ardi01ProtocolDecoder(Ardi01Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("(d+),") // imei - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(-?d+.d+),") // longitude - .number("(-?d+.d+),") // latitude - .number("(d+.?d*),") // speed - .number("(d+.?d*),") // course - .number("(-?d+.?d*),") // altitude - .number("(d+),") // satellites - .number("(d+),") // event - .number("(d+),") // battery - .number("(-?d+)") // temperature - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime()); - - position.setLongitude(parser.nextDouble(0)); - position.setLatitude(parser.nextDouble(0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - int satellites = parser.nextInt(0); - position.setValid(satellites >= 3); - position.set(Position.KEY_SATELLITES, satellites); - - position.set(Position.KEY_EVENT, parser.next()); - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt(0)); - position.set(Position.PREFIX_TEMP + 1, parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/ArknavProtocol.java b/src/org/traccar/protocol/ArknavProtocol.java deleted file mode 100644 index c22e5f443..000000000 --- a/src/org/traccar/protocol/ArknavProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class ArknavProtocol extends BaseProtocol { - - public ArknavProtocol() { - super("arknav"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '\r')); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new ArknavProtocolDecoder(ArknavProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/ArknavProtocolDecoder.java b/src/org/traccar/protocol/ArknavProtocolDecoder.java deleted file mode 100644 index 927c50c29..000000000 --- a/src/org/traccar/protocol/ArknavProtocolDecoder.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2016 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class ArknavProtocolDecoder extends BaseProtocolDecoder { - - public ArknavProtocolDecoder(ArknavProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("(d+),") // imei - .expression(".{6},") // id code - .number("ddd,") // status - .number("Lddd,") // version - .expression("([AV]),") // validity - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*),") // speed - .number("(d+.?d*),") // course - .number("(d+.?d*),") // hdop - .number("(dd):(dd):(dd) ") // time (hh:mm:ss) - .number("(dd)-(dd)-(dd),") // date (dd-mm-yy) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_HDOP, parser.nextDouble(0)); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/ArknavX8Protocol.java b/src/org/traccar/protocol/ArknavX8Protocol.java deleted file mode 100644 index e759b5294..000000000 --- a/src/org/traccar/protocol/ArknavX8Protocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class ArknavX8Protocol extends BaseProtocol { - - public ArknavX8Protocol() { - super("arknavx8"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, ';')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new ArknavX8ProtocolDecoder(ArknavX8Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/ArknavX8ProtocolDecoder.java b/src/org/traccar/protocol/ArknavX8ProtocolDecoder.java deleted file mode 100644 index 8a80901b5..000000000 --- a/src/org/traccar/protocol/ArknavX8ProtocolDecoder.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2016 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class ArknavX8ProtocolDecoder extends BaseProtocolDecoder { - - public ArknavX8ProtocolDecoder(ArknavX8Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .expression("(..),") // type - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .expression("([AV]),") // validity - .number("(d+)(dd.d+)([NS]),") // latitude - .number("(d+)(dd.d+)([EW]),") // longitude - .number("(d+.d+),") // speed - .number("(d+),") // course - .number("(d+.d+),") // hdop - .number("(d+)") // status - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.charAt(2) != ',') { - getDeviceSession(channel, remoteAddress, sentence.substring(0, 15)); - return null; - } - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_TYPE, parser.next()); - - position.setTime(parser.nextDateTime()); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_HDOP, parser.nextDouble(0)); - position.set(Position.KEY_STATUS, parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/Arnavi4FrameDecoder.java b/src/org/traccar/protocol/Arnavi4FrameDecoder.java deleted file mode 100644 index b13f3fd7d..000000000 --- a/src/org/traccar/protocol/Arnavi4FrameDecoder.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2017 Ivan Muratov (binakot@gmail.com) - * - * 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class Arnavi4FrameDecoder extends FrameDecoder { - - private static final int MIN_LENGTH = 4; - private static final int HEADER_LENGTH = 10; - private static final int PACKET_WRAPPER_LENGTH = 8; - private static final int COMMAND_ANSWER_PACKET_LENGTH = 4; - private static final int COMMAND_ANSWER_PARCEL_NUMBER = 0xfd; - private static final byte PACKAGE_END_SIGN = 0x5d; - - private boolean firstPacket = true; - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < MIN_LENGTH) { - return null; - } - - int length; - if (firstPacket) { - firstPacket = false; - length = HEADER_LENGTH; - } else { - int index = buf.getUnsignedByte(1); // parcel number - if (index == COMMAND_ANSWER_PARCEL_NUMBER) { - length = COMMAND_ANSWER_PACKET_LENGTH; - } else { - int pos = 2; // start sign + parcel number - while (pos + PACKET_WRAPPER_LENGTH < buf.readableBytes() - && buf.getByte(pos) != PACKAGE_END_SIGN) { - - int dataLength = buf.getUnsignedShort(pos + 1); - pos += PACKET_WRAPPER_LENGTH + dataLength; // packet type + data length + unixtime + data + crc - } - - if (buf.getByte(pos) != PACKAGE_END_SIGN) { // end sign - return null; - } - - length = pos + 1; - } - } - - if (buf.readableBytes() >= length) { - return buf.readBytes(length); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Arnavi4Protocol.java b/src/org/traccar/protocol/Arnavi4Protocol.java deleted file mode 100644 index 381a9b457..000000000 --- a/src/org/traccar/protocol/Arnavi4Protocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2017 Ivan Muratov (binakot@gmail.com) - * - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class Arnavi4Protocol extends BaseProtocol { - - public Arnavi4Protocol() { - super("arnavi4"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new Arnavi4FrameDecoder()); - pipeline.addLast("objectDecoder", new Arnavi4ProtocolDecoder(Arnavi4Protocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/Arnavi4ProtocolDecoder.java b/src/org/traccar/protocol/Arnavi4ProtocolDecoder.java deleted file mode 100644 index 06abb563f..000000000 --- a/src/org/traccar/protocol/Arnavi4ProtocolDecoder.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2017 Ivan Muratov (binakot@gmail.com) - * - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Checksum; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class Arnavi4ProtocolDecoder extends BaseProtocolDecoder { - - private static final byte HEADER_START_SIGN = (byte) 0xff; - private static final byte HEADER_VERSION_1 = 0x22; - private static final byte HEADER_VERSION_2 = 0x23; - - private static final byte RECORD_PING = 0x00; - private static final byte RECORD_DATA = 0x01; - private static final byte RECORD_TEXT = 0x03; - private static final byte RECORD_FILE = 0x04; - private static final byte RECORD_BINARY = 0x06; - - private static final byte TAG_LATITUDE = 3; - private static final byte TAG_LONGITUDE = 4; - private static final byte TAG_COORD_PARAMS = 5; - - public Arnavi4ProtocolDecoder(Arnavi4Protocol protocol) { - super(protocol); - } - - private void sendResponse(Channel channel, byte version, int index) { - if (channel != null) { - final ChannelBuffer response; - if (version == HEADER_VERSION_1) { - response = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 4); - response.writeByte(0x7b); - response.writeByte(0x00); - response.writeByte((byte) index); - response.writeByte(0x7d); - } else if (version == HEADER_VERSION_2) { - response = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 9); - response.writeByte(0x7b); - response.writeByte(0x04); - response.writeByte(0x00); - byte[] timeBytes = ByteBuffer.allocate(4).putInt((int) (System.currentTimeMillis() / 1000)).array(); - response.writeByte(Checksum.modulo256(timeBytes)); - response.writeBytes(timeBytes); - response.writeByte(0x7d); - } else { - return; // Ignore unsupported header's versions - } - channel.write(response); - } - } - - private Position decodePosition(DeviceSession deviceSession, ChannelBuffer buf, int length, Date time) { - - final Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(time); - - int readBytes = 0; - while (readBytes < length) { - short tag = buf.readUnsignedByte(); - switch (tag) { - case TAG_LATITUDE: - position.setLatitude(buf.readFloat()); - position.setValid(true); - break; - - case TAG_LONGITUDE: - position.setLongitude(buf.readFloat()); - position.setValid(true); - break; - - case TAG_COORD_PARAMS: - position.setCourse(buf.readUnsignedByte() * 2); - position.setAltitude(buf.readUnsignedByte() * 10); - byte satellites = buf.readByte(); - position.set(Position.KEY_SATELLITES, satellites & 0x0F + (satellites >> 4) & 0x0F); // gps+glonass - position.setSpeed(buf.readUnsignedByte()); - break; - - default: - buf.readBytes(4); // Skip unsupported tags - break; - } - - readBytes += 5; // 1 byte tag + 4 bytes value - } - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - byte startSign = buf.readByte(); - - if (startSign == HEADER_START_SIGN) { - - byte version = buf.readByte(); - - String imei = String.valueOf(buf.readLong()); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - - if (deviceSession != null) { - sendResponse(channel, version, 0); - } - - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - List<Position> positions = new LinkedList<>(); - - int index = buf.readUnsignedByte(); - - byte recordType = buf.readByte(); - while (buf.readableBytes() > 0) { - switch (recordType) { - case RECORD_PING: - case RECORD_DATA: - case RECORD_TEXT: - case RECORD_FILE: - case RECORD_BINARY: - int length = buf.readUnsignedShort(); - Date time = new Date(buf.readUnsignedInt() * 1000); - - if (recordType == RECORD_DATA) { - positions.add(decodePosition(deviceSession, buf, length, time)); - } else { - buf.readBytes(length); // Skip other types of record - } - - buf.readUnsignedByte(); // crc - break; - - default: - return null; // Ignore unsupported types of record - } - - recordType = buf.readByte(); - } - - sendResponse(channel, HEADER_VERSION_1, index); - - return positions; - } - -} diff --git a/src/org/traccar/protocol/ArnaviProtocol.java b/src/org/traccar/protocol/ArnaviProtocol.java deleted file mode 100644 index 956f2329a..000000000 --- a/src/org/traccar/protocol/ArnaviProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class ArnaviProtocol extends BaseProtocol { - - public ArnaviProtocol() { - super("arnavi"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new ArnaviProtocolDecoder(ArnaviProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/ArnaviProtocolDecoder.java b/src/org/traccar/protocol/ArnaviProtocolDecoder.java deleted file mode 100644 index 9c4ab5d05..000000000 --- a/src/org/traccar/protocol/ArnaviProtocolDecoder.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class ArnaviProtocolDecoder extends BaseProtocolDecoder { - - public ArnaviProtocolDecoder(ArnaviProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$AV,") - .number("Vd,") // type - .number("(d+),") // device id - .number("(d+),") // index - .number("(d+),") // power - .number("(d+),") // battery - .number("-?d+,") - .expression("[01],") // movement - .expression("([01]),") // ignition - .number("(d+),") // input - .number("d+,d+,") // input 1 - .number("d+,d+,").optional() // input 2 - .expression("[01],") // fix type - .number("(d+),") // satellites - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(dd)(dd.d+)([NS]),") // latitude - .number("(ddd)(dd.d+)([EW]),") // longitude - .number("(d+.d+),") // speed - .number("(d+.d+),") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_INDEX, parser.nextInt(0)); - position.set(Position.KEY_POWER, parser.nextInt(0) * 0.01); - position.set(Position.KEY_BATTERY, parser.nextInt(0) * 0.01); - position.set(Position.KEY_IGNITION, parser.nextInt(0) == 1); - position.set(Position.KEY_INPUT, parser.nextInt(0)); - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(true); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/AstraProtocol.java b/src/org/traccar/protocol/AstraProtocol.java deleted file mode 100644 index 87c562a9d..000000000 --- a/src/org/traccar/protocol/AstraProtocol.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2016 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.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class AstraProtocol extends BaseProtocol { - - public AstraProtocol() { - super("astra"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 1, 2, -3, 0)); - pipeline.addLast("objectDecoder", new AstraProtocolDecoder(AstraProtocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectDecoder", new AstraProtocolDecoder(AstraProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/AstraProtocolDecoder.java b/src/org/traccar/protocol/AstraProtocolDecoder.java deleted file mode 100644 index 8d86cd2be..000000000 --- a/src/org/traccar/protocol/AstraProtocolDecoder.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Log; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.LinkedList; -import java.util.List; - -public class AstraProtocolDecoder extends BaseProtocolDecoder { - - public AstraProtocolDecoder(AstraProtocol protocol) { - super(protocol); - } - - public static final int MSG_HEARTBEAT = 0x1A; - public static final int MSG_DATA = 0x10; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - if (channel != null) { - channel.write(ChannelBuffers.wrappedBuffer(new byte[] {0x06}), remoteAddress); - } - - buf.readUnsignedByte(); // protocol - buf.readUnsignedShort(); // length - - String imei = String.format("%08d", buf.readUnsignedInt()) + String.format("%07d", buf.readUnsignedMedium()); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - - List<Position> positions = new LinkedList<>(); - - while (buf.readableBytes() > 2) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - buf.readUnsignedByte(); // index - - position.setValid(true); - position.setLatitude(buf.readInt() * 0.000001); - position.setLongitude(buf.readInt() * 0.000001); - - DateBuilder dateBuilder = new DateBuilder() - .setDate(1980, 1, 6).addMillis(buf.readUnsignedInt() * 1000L); - position.setTime(dateBuilder.getDate()); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte() * 2)); - position.setCourse(buf.readUnsignedByte() * 2); - - int reason = buf.readUnsignedMedium(); - position.set(Position.KEY_EVENT, reason); - - int status = buf.readUnsignedShort(); - position.set(Position.KEY_STATUS, status); - - position.set(Position.PREFIX_IO + 1, buf.readUnsignedByte()); - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedByte()); - position.set(Position.KEY_BATTERY, buf.readUnsignedByte()); - position.set(Position.KEY_POWER, buf.readUnsignedByte()); - - buf.readUnsignedByte(); // max journey speed - buf.skipBytes(6); // accelerometer - position.set(Position.KEY_ODOMETER_TRIP, buf.readUnsignedShort()); - buf.readUnsignedShort(); // journey idle time - - position.setAltitude(buf.readUnsignedByte() * 20); - - int quality = buf.readUnsignedByte(); - position.set(Position.KEY_SATELLITES, quality & 0xf); - position.set(Position.KEY_RSSI, quality >> 4); - - buf.readUnsignedByte(); // geofence events - - if (BitUtil.check(status, 8)) { - position.set(Position.KEY_DRIVER_UNIQUE_ID, buf.readBytes(7).toString(StandardCharsets.US_ASCII)); - position.set(Position.KEY_ODOMETER, buf.readUnsignedMedium() * 1000); - position.set(Position.KEY_HOURS, buf.readUnsignedShort()); - } - - if (BitUtil.check(status, 6)) { - Log.warning("Extension data is not supported"); - return position; - } - - positions.add(position); - - } - - return positions; - } - -} diff --git a/src/org/traccar/protocol/At2000FrameDecoder.java b/src/org/traccar/protocol/At2000FrameDecoder.java deleted file mode 100644 index af257d0fb..000000000 --- a/src/org/traccar/protocol/At2000FrameDecoder.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2016 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -import java.nio.ByteOrder; - -public class At2000FrameDecoder extends FrameDecoder { - - private static final int BLOCK_LENGTH = 16; - private static final int ACK_LENGTH = 496; - - private boolean firstPacket = true; - - private ChannelBuffer currentBuffer; - private int acknowledgedBytes; - - private void sendResponse(Channel channel) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, 2 * BLOCK_LENGTH); - response.writeByte(At2000ProtocolDecoder.MSG_ACKNOWLEDGEMENT); - response.writeMedium(ChannelBuffers.swapMedium(1)); - response.writeByte(0x00); // success - response.writerIndex(2 * BLOCK_LENGTH); - channel.write(response); - } - } - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 5) { - return null; - } - - int length; - if (firstPacket) { - firstPacket = false; - length = buf.getUnsignedMedium(buf.readerIndex() + 2); - } else { - length = buf.getUnsignedMedium(buf.readerIndex() + 1); - } - - length += BLOCK_LENGTH; - if (length % BLOCK_LENGTH != 0) { - length = (length / BLOCK_LENGTH + 1) * BLOCK_LENGTH; - } - - if ((buf.readableBytes() >= length || buf.readableBytes() % ACK_LENGTH == 0) - && (buf != currentBuffer || buf.readableBytes() > acknowledgedBytes)) { - sendResponse(channel); - currentBuffer = buf; - acknowledgedBytes = buf.readableBytes(); - } - - if (buf.readableBytes() >= length) { - return buf.readBytes(length); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/At2000Protocol.java b/src/org/traccar/protocol/At2000Protocol.java deleted file mode 100644 index 35aa0b469..000000000 --- a/src/org/traccar/protocol/At2000Protocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2016 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class At2000Protocol extends BaseProtocol { - - public At2000Protocol() { - super("at2000"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new At2000FrameDecoder()); - pipeline.addLast("objectDecoder", new At2000ProtocolDecoder(At2000Protocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/At2000ProtocolDecoder.java b/src/org/traccar/protocol/At2000ProtocolDecoder.java deleted file mode 100644 index 70840c37d..000000000 --- a/src/org/traccar/protocol/At2000ProtocolDecoder.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2016 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import javax.crypto.Cipher; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec; -import javax.xml.bind.DatatypeConverter; -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class At2000ProtocolDecoder extends BaseProtocolDecoder { - - private static final int BLOCK_LENGTH = 16; - - public At2000ProtocolDecoder(At2000Protocol protocol) { - super(protocol); - } - - public static final int MSG_ACKNOWLEDGEMENT = 0x00; - public static final int MSG_DEVICE_ID = 0x01; - public static final int MSG_TRACK_REQUEST = 0x88; - public static final int MSG_TRACK_RESPONSE = 0x89; - public static final int MSG_SESSION_END = 0x0c; - - private Cipher cipher; - - private static void sendRequest(Channel channel) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, BLOCK_LENGTH); - response.writeByte(MSG_TRACK_REQUEST); - response.writeMedium(ChannelBuffers.swapMedium(0)); - response.writerIndex(BLOCK_LENGTH); - channel.write(response); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - if (buf.getUnsignedByte(buf.readerIndex()) == 0x01) { - buf.readUnsignedByte(); // codec id - } - - int type = buf.readUnsignedByte(); - buf.readUnsignedMedium(); // length - buf.skipBytes(BLOCK_LENGTH - 1 - 3); - - if (type == MSG_DEVICE_ID) { - - String imei = buf.readBytes(15).toString(StandardCharsets.US_ASCII); - if (getDeviceSession(channel, remoteAddress, imei) != null) { - - byte[] iv = new byte[BLOCK_LENGTH]; - buf.readBytes(iv); - IvParameterSpec ivSpec = new IvParameterSpec(iv); - - SecretKeySpec keySpec = new SecretKeySpec( - DatatypeConverter.parseHexBinary("000102030405060708090a0b0c0d0e0f"), "AES"); - - cipher = Cipher.getInstance("AES/CBC/NoPadding"); - cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); - - byte[] data = new byte[BLOCK_LENGTH]; - buf.readBytes(data); - cipher.update(data); - - } - - } else if (type == MSG_TRACK_RESPONSE) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - if (buf.capacity() <= BLOCK_LENGTH) { - return null; // empty message - } - - byte[] data = new byte[buf.capacity() - BLOCK_LENGTH]; - buf.readBytes(data); - buf = ChannelBuffers.wrappedBuffer(ByteOrder.LITTLE_ENDIAN, cipher.update(data)); - - List<Position> positions = new LinkedList<>(); - - while (buf.readableBytes() >= 63) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - buf.readUnsignedShort(); // index - buf.readUnsignedShort(); // reserved - - position.setValid(true); - - position.setTime(new Date(buf.readLong() * 1000)); - - position.setLatitude(buf.readFloat()); - position.setLongitude(buf.readFloat()); - position.setAltitude(buf.readFloat()); - position.setSpeed(UnitsConverter.knotsFromKph(buf.readFloat())); - position.setCourse(buf.readFloat()); - - buf.readUnsignedInt(); // geozone event - buf.readUnsignedInt(); // io events - buf.readUnsignedInt(); // geozone value - buf.readUnsignedInt(); // io values - buf.readUnsignedShort(); // operator - - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort()); - - position.set(Position.KEY_POWER, buf.readUnsignedShort() * 0.001); - - buf.readUnsignedShort(); // cid - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - buf.readUnsignedByte(); // current profile - - position.set(Position.KEY_BATTERY, buf.readUnsignedByte()); - position.set(Position.PREFIX_TEMP + 1, buf.readUnsignedByte()); - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - - positions.add(position); - - } - - return positions; - - } - - if (type == MSG_DEVICE_ID) { - sendRequest(channel); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/AtrackFrameDecoder.java b/src/org/traccar/protocol/AtrackFrameDecoder.java deleted file mode 100644 index ce4a9a65f..000000000 --- a/src/org/traccar/protocol/AtrackFrameDecoder.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; -import org.traccar.helper.StringFinder; - -public class AtrackFrameDecoder extends FrameDecoder { - - private static final int KEEPALIVE_LENGTH = 12; - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() >= 2) { - - if (buf.getUnsignedShort(buf.readerIndex()) == 0xfe02) { - - if (buf.readableBytes() >= KEEPALIVE_LENGTH) { - return buf.readBytes(KEEPALIVE_LENGTH); - } - - } else if (buf.getUnsignedShort(buf.readerIndex()) == 0x4050) { - - if (buf.readableBytes() > 6) { - int length = buf.getUnsignedShort(buf.readerIndex() + 4) + 4 + 2; - if (buf.readableBytes() >= length) { - return buf.readBytes(length); - } - } - - } else { - - int endIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new StringFinder("\r\n")); - if (endIndex > 0) { - return buf.readBytes(endIndex - buf.readerIndex() + 2); - } - - } - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/AtrackProtocol.java b/src/org/traccar/protocol/AtrackProtocol.java deleted file mode 100644 index 5104e5587..000000000 --- a/src/org/traccar/protocol/AtrackProtocol.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class AtrackProtocol extends BaseProtocol { - - public AtrackProtocol() { - super("atrack"); - setSupportedDataCommands( - Command.TYPE_CUSTOM); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new AtrackFrameDecoder()); - pipeline.addLast("objectEncoder", new AtrackProtocolEncoder()); - pipeline.addLast("objectDecoder", new AtrackProtocolDecoder(AtrackProtocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectEncoder", new AtrackProtocolEncoder()); - pipeline.addLast("objectDecoder", new AtrackProtocolDecoder(AtrackProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/AtrackProtocolDecoder.java b/src/org/traccar/protocol/AtrackProtocolDecoder.java deleted file mode 100644 index 23cb67e15..000000000 --- a/src/org/traccar/protocol/AtrackProtocolDecoder.java +++ /dev/null @@ -1,352 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -public class AtrackProtocolDecoder extends BaseProtocolDecoder { - - private static final int MIN_DATA_LENGTH = 40; - - private boolean longDate; - private boolean custom; - private String form; - - private final Map<Integer, String> alarmMap = new HashMap<>(); - - public AtrackProtocolDecoder(AtrackProtocol protocol) { - super(protocol); - - longDate = Context.getConfig().getBoolean(getProtocolName() + ".longDate"); - - custom = Context.getConfig().getBoolean(getProtocolName() + ".custom"); - form = Context.getConfig().getString(getProtocolName() + ".form"); - if (form != null) { - custom = true; - } - - for (String pair : Context.getConfig().getString(getProtocolName() + ".alarmMap", "").split(",")) { - if (!pair.isEmpty()) { - alarmMap.put( - Integer.parseInt(pair.substring(0, pair.indexOf('='))), pair.substring(pair.indexOf('=') + 1)); - } - } - } - - public void setLongDate(boolean longDate) { - this.longDate = longDate; - } - - public void setCustom(boolean custom) { - this.custom = custom; - } - - private static void sendResponse(Channel channel, SocketAddress remoteAddress, long rawId, int index) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.directBuffer(12); - response.writeShort(0xfe02); - response.writeLong(rawId); - response.writeShort(index); - channel.write(response, remoteAddress); - } - } - - private static String readString(ChannelBuffer buf) { - String result = null; - int index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) 0); - if (index > buf.readerIndex()) { - result = buf.readBytes(index - buf.readerIndex()).toString(StandardCharsets.US_ASCII); - } - buf.readByte(); - return result; - } - - private void readCustomData(Position position, ChannelBuffer buf, String form) { - CellTower cellTower = new CellTower(); - String[] keys = form.substring(1).split("%"); - for (String key : keys) { - switch (key) { - case "SA": - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - break; - case "MV": - position.set(Position.KEY_POWER, buf.readUnsignedShort()); - break; - case "BV": - position.set(Position.KEY_BATTERY, buf.readUnsignedShort()); - break; - case "GQ": - cellTower.setSignalStrength((int) buf.readUnsignedByte()); - break; - case "CE": - cellTower.setCellId(buf.readUnsignedInt()); - break; - case "LC": - cellTower.setLocationAreaCode(buf.readUnsignedShort()); - break; - case "CN": - int combinedMobileCodes = (int) (buf.readUnsignedInt() % 100000); // cccnn - cellTower.setMobileCountryCode(combinedMobileCodes / 100); - cellTower.setMobileNetworkCode(combinedMobileCodes % 100); - break; - case "RL": - buf.readUnsignedByte(); // rxlev - break; - case "PC": - position.set(Position.PREFIX_COUNT + 1, buf.readUnsignedInt()); - break; - case "AT": - position.setAltitude(buf.readUnsignedInt()); - break; - case "RP": - position.set(Position.KEY_RPM, buf.readUnsignedShort()); - break; - case "GS": - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - break; - case "DT": - position.set(Position.KEY_ARCHIVE, buf.readUnsignedByte() == 1); - break; - case "VN": - position.set(Position.KEY_VIN, readString(buf)); - break; - case "MF": - buf.readUnsignedShort(); // mass air flow rate - break; - case "EL": - buf.readUnsignedByte(); // engine load - break; - case "TR": - position.set(Position.KEY_THROTTLE, buf.readUnsignedByte()); - break; - case "ET": - position.set(Position.PREFIX_TEMP + 1, buf.readUnsignedShort()); - break; - case "FL": - position.set(Position.KEY_FUEL_LEVEL, buf.readUnsignedByte()); - break; - case "ML": - buf.readUnsignedByte(); // mil status - break; - case "FC": - position.set(Position.KEY_FUEL_CONSUMPTION, buf.readUnsignedInt()); - break; - case "CI": - readString(buf); // format string - break; - case "AV1": - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort()); - break; - case "NC": - readString(buf); // gsm neighbor cell info - break; - case "SM": - buf.readUnsignedShort(); // max speed between reports - break; - case "GL": - readString(buf); // google link - break; - case "MA": - readString(buf); // mac address - break; - default: - break; - } - } - - if (cellTower.getMobileCountryCode() != null - && cellTower.getMobileNetworkCode() != null - && cellTower.getCellId() != null - && cellTower.getLocationAreaCode() != null) { - position.setNetwork(new Network(cellTower)); - } else if (cellTower.getSignalStrength() != null) { - position.set(Position.KEY_RSSI, cellTower.getSignalStrength()); - } - } - - private static final Pattern PATTERN_INFO = new PatternBuilder() - .text("$INFO=") - .number("(d+),") // unit id - .expression("([^,]+),") // model - .expression("([^,]+),") // firmware version - .number("d+,") // imei - .number("d+,") // imsi - .number("d+,") // sim card id - .number("(d+),") // power - .number("(d+),") // battery - .number("(d+),") // satellites - .number("d+,") // gsm status - .number("(d+),") // rssi - .number("d+,") // connection status - .number("d+") // antenna status - .any() - .compile(); - - private Position decodeString(Channel channel, SocketAddress remoteAddress, String sentence) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - - getLastLocation(position, null); - - DeviceSession deviceSession; - - if (sentence.startsWith("$INFO")) { - - Parser parser = new Parser(PATTERN_INFO, sentence); - if (!parser.matches()) { - return null; - } - - deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - - position.set("model", parser.next()); - position.set(Position.KEY_VERSION_FW, parser.next()); - position.set(Position.KEY_POWER, parser.nextInt() * 0.1); - position.set(Position.KEY_BATTERY, parser.nextInt() * 0.1); - position.set(Position.KEY_SATELLITES, parser.nextInt()); - position.set(Position.KEY_RSSI, parser.nextInt()); - - } else { - - deviceSession = getDeviceSession(channel, remoteAddress); - - position.set(Position.KEY_RESULT, sentence); - - } - - if (deviceSession == null) { - return null; - } else { - position.setDeviceId(deviceSession.getDeviceId()); - return position; - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - if (buf.getUnsignedShort(buf.readerIndex()) == 0xfe02) { - if (channel != null) { - channel.write(buf, remoteAddress); // keep-alive message - } - return null; - } else if (buf.getByte(buf.readerIndex()) == '$') { - return decodeString(channel, remoteAddress, buf.toString(StandardCharsets.US_ASCII).trim()); - } - - buf.skipBytes(2); // prefix - buf.readUnsignedShort(); // checksum - buf.readUnsignedShort(); // length - int index = buf.readUnsignedShort(); - - long id = buf.readLong(); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, String.valueOf(id)); - if (deviceSession == null) { - return null; - } - - sendResponse(channel, remoteAddress, id, index); - - List<Position> positions = new LinkedList<>(); - - while (buf.readableBytes() >= MIN_DATA_LENGTH) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - if (longDate) { - - DateBuilder dateBuilder = new DateBuilder() - .setDate(buf.readUnsignedShort(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - position.setTime(dateBuilder.getDate()); - - buf.skipBytes(7 + 7); - - - } else { - - position.setFixTime(new Date(buf.readUnsignedInt() * 1000)); - position.setDeviceTime(new Date(buf.readUnsignedInt() * 1000)); - buf.readUnsignedInt(); // send time - } - - position.setValid(true); - position.setLongitude(buf.readInt() * 0.000001); - position.setLatitude(buf.readInt() * 0.000001); - position.setCourse(buf.readUnsignedShort()); - - int type = buf.readUnsignedByte(); - position.set(Position.KEY_TYPE, type); - position.set(Position.KEY_ALARM, alarmMap.get(type)); - - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt() * 100); - position.set(Position.KEY_HDOP, buf.readUnsignedShort() * 0.1); - position.set(Position.KEY_INPUT, buf.readUnsignedByte()); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort())); - - position.set(Position.KEY_OUTPUT, buf.readUnsignedByte()); - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort() * 0.001); - - position.set(Position.KEY_DRIVER_UNIQUE_ID, readString(buf)); - - position.set(Position.PREFIX_TEMP + 1, buf.readShort() * 0.1); - position.set(Position.PREFIX_TEMP + 2, buf.readShort() * 0.1); - - position.set("message", readString(buf)); - - if (custom) { - String form = this.form; - if (form == null) { - form = readString(buf).substring("%CI".length()); - } - readCustomData(position, buf, form); - } - - positions.add(position); - - } - - return positions; - } - -} diff --git a/src/org/traccar/protocol/AtrackProtocolEncoder.java b/src/org/traccar/protocol/AtrackProtocolEncoder.java deleted file mode 100644 index 77f16527f..000000000 --- a/src/org/traccar/protocol/AtrackProtocolEncoder.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import java.nio.charset.StandardCharsets; - -public class AtrackProtocolEncoder extends BaseProtocolEncoder { - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_CUSTOM: - return ChannelBuffers.copiedBuffer( - command.getString(Command.KEY_DATA) + "\r\n", StandardCharsets.US_ASCII); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/AuroProtocol.java b/src/org/traccar/protocol/AuroProtocol.java deleted file mode 100644 index e1b23478f..000000000 --- a/src/org/traccar/protocol/AuroProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class AuroProtocol extends BaseProtocol { - - public AuroProtocol() { - super("auro"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new AuroProtocolDecoder(AuroProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/AuroProtocolDecoder.java b/src/org/traccar/protocol/AuroProtocolDecoder.java deleted file mode 100644 index a45d14709..000000000 --- a/src/org/traccar/protocol/AuroProtocolDecoder.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -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 AuroProtocolDecoder extends BaseProtocolDecoder { - - public AuroProtocolDecoder(AuroProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("M(dddd)") // index - .number("Td+") // phone - .number("I(d+)") // imei - .number("Ed+W") - .text("*****") - .number("d{8}d{4}") // local time - .expression(".{8}#.{8}") - .number("d{10}") // status - .number("([-+])(ddd)(dd)(dddd)") // longitude - .number("([-+])(ddd)(dd)(dddd)") // latitude - .number("(dd)(dd)(dddd)") // date (ddmmyyyy) - .number("(dd)(dd)(dd)") // time (hhmmss) - .number("(ddd)") // course - .number("d{6}") - .number("(ddd)") // speed - .number("d") - .number("(dd)") // battery - .expression("([01])") // charging - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.set(Position.KEY_INDEX, parser.nextInt(0)); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(true); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN_MIN)); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN_MIN)); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setCourse(parser.nextDouble(0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - - position.set(Position.KEY_BATTERY, parser.nextInt(0)); - position.set(Position.KEY_CHARGE, parser.nextInt(0) == 1); - - return position; - } - -} diff --git a/src/org/traccar/protocol/AutoFonFrameDecoder.java b/src/org/traccar/protocol/AutoFonFrameDecoder.java deleted file mode 100644 index 2fa1b4072..000000000 --- a/src/org/traccar/protocol/AutoFonFrameDecoder.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2015 - 2016 Anton Tananaev (anton@traccar.org) - * Copyright 2015 Vitaly Litvak (vitavaque@gmail.com) - * - * 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class AutoFonFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - // Check minimum length - if (buf.readableBytes() < 12) { - return null; - } - - int length; - switch (buf.getUnsignedByte(buf.readerIndex())) { - case AutoFonProtocolDecoder.MSG_LOGIN: - length = 12; - break; - case AutoFonProtocolDecoder.MSG_LOCATION: - length = 78; - break; - case AutoFonProtocolDecoder.MSG_HISTORY: - length = 257; - break; - case AutoFonProtocolDecoder.MSG_45_LOGIN: - length = 19; - break; - case AutoFonProtocolDecoder.MSG_45_LOCATION: - length = 34; - break; - default: - length = 0; - break; - } - - // Check length and return buffer - if (length != 0 && buf.readableBytes() >= length) { - return buf.readBytes(length); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/AutoFonProtocol.java b/src/org/traccar/protocol/AutoFonProtocol.java deleted file mode 100644 index 927bda120..000000000 --- a/src/org/traccar/protocol/AutoFonProtocol.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class AutoFonProtocol extends BaseProtocol { - - public AutoFonProtocol() { - super("autofon"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new AutoFonFrameDecoder()); - pipeline.addLast("objectDecoder", new AutoFonProtocolDecoder(AutoFonProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/AutoFonProtocolDecoder.java b/src/org/traccar/protocol/AutoFonProtocolDecoder.java deleted file mode 100644 index 32b4bfa74..000000000 --- a/src/org/traccar/protocol/AutoFonProtocolDecoder.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright 2015 - 2016 Anton Tananaev (anton@traccar.org) - * Copyright 2015 Vitaly Litvak (vitavaque@gmail.com) - * - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.LinkedList; -import java.util.List; - -public class AutoFonProtocolDecoder extends BaseProtocolDecoder { - - public AutoFonProtocolDecoder(AutoFonProtocol protocol) { - super(protocol); - } - - public static final int MSG_LOGIN = 0x10; - public static final int MSG_LOCATION = 0x11; - public static final int MSG_HISTORY = 0x12; - - public static final int MSG_45_LOGIN = 0x41; - public static final int MSG_45_LOCATION = 0x02; - - private static double convertCoordinate(int raw) { - int degrees = raw / 1000000; - double minutes = (raw % 1000000) / 10000.0; - return degrees + minutes / 60; - } - - private static double convertCoordinate(short degrees, int minutes) { - double value = degrees + BitUtil.from(minutes, 4) / 600000.0; - if (BitUtil.check(minutes, 0)) { - return value; - } else { - return -value; - } - } - - private Position decodePosition(DeviceSession deviceSession, ChannelBuffer buf, boolean history) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - if (!history) { - buf.readUnsignedByte(); // interval - buf.skipBytes(8); // settings - } - position.set(Position.KEY_STATUS, buf.readUnsignedByte()); - if (!history) { - buf.readUnsignedShort(); - } - position.set(Position.KEY_BATTERY, buf.readUnsignedByte()); - buf.skipBytes(6); // time - - if (!history) { - for (int i = 0; i < 2; i++) { - buf.skipBytes(5); // time - buf.readUnsignedShort(); // interval - buf.skipBytes(5); // mode - } - } - - position.set(Position.PREFIX_TEMP + 1, buf.readByte()); - - int rssi = buf.readUnsignedByte(); - CellTower cellTower = CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedShort(), - buf.readUnsignedShort(), buf.readUnsignedShort(), rssi); - position.setNetwork(new Network(cellTower)); - - int valid = buf.readUnsignedByte(); - position.setValid((valid & 0xc0) != 0); - position.set(Position.KEY_SATELLITES, valid & 0x3f); - - DateBuilder dateBuilder = new DateBuilder() - .setDateReverse(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - position.setTime(dateBuilder.getDate()); - - position.setLatitude(convertCoordinate(buf.readInt())); - position.setLongitude(convertCoordinate(buf.readInt())); - position.setAltitude(buf.readShort()); - position.setSpeed(buf.readUnsignedByte()); - position.setCourse(buf.readUnsignedByte() * 2.0); - - position.set(Position.KEY_HDOP, buf.readUnsignedShort()); - - buf.readUnsignedShort(); // reserved - buf.readUnsignedByte(); // checksum - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - int type = buf.readUnsignedByte(); - - if (type == MSG_LOGIN || type == MSG_45_LOGIN) { - - if (type == MSG_LOGIN) { - buf.readUnsignedByte(); // hardware version - buf.readUnsignedByte(); // software version - } - - String imei = ChannelBuffers.hexDump(buf.readBytes(8)).substring(1); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - - if (deviceSession != null && channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeBytes("resp_crc=".getBytes(StandardCharsets.US_ASCII)); - response.writeByte(buf.getByte(buf.writerIndex() - 1)); - channel.write(response); - } - - return null; - - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - if (type == MSG_LOCATION) { - - return decodePosition(deviceSession, buf, false); - - } else if (type == MSG_HISTORY) { - - int count = buf.readUnsignedByte() & 0x0f; - buf.readUnsignedShort(); // total count - List<Position> positions = new LinkedList<>(); - - for (int i = 0; i < count; i++) { - positions.add(decodePosition(deviceSession, buf, true)); - } - - return positions; - - } else if (type == MSG_45_LOCATION) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - short status = buf.readUnsignedByte(); - if (BitUtil.check(status, 7)) { - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - } - position.set(Position.KEY_BATTERY, BitUtil.to(status, 7)); - - buf.skipBytes(2); // remaining time - - position.set(Position.PREFIX_TEMP + 1, buf.readByte()); - - buf.skipBytes(2); // timer (interval and units) - buf.readByte(); // mode - buf.readByte(); // gprs sending interval - - buf.skipBytes(6); // mcc, mnc, lac, cid - - int valid = buf.readUnsignedByte(); - position.setValid(BitUtil.from(valid, 6) != 0); - position.set(Position.KEY_SATELLITES, BitUtil.from(valid, 6)); - - int time = buf.readUnsignedMedium(); - int date = buf.readUnsignedMedium(); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(time / 10000, time / 100 % 100, time % 100) - .setDateReverse(date / 10000, date / 100 % 100, date % 100); - position.setTime(dateBuilder.getDate()); - - position.setLatitude(convertCoordinate(buf.readUnsignedByte(), buf.readUnsignedMedium())); - position.setLongitude(convertCoordinate(buf.readUnsignedByte(), buf.readUnsignedMedium())); - position.setSpeed(buf.readUnsignedByte()); - position.setCourse(buf.readUnsignedShort()); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/AutoGradeProtocol.java b/src/org/traccar/protocol/AutoGradeProtocol.java deleted file mode 100644 index 41bb8d9ad..000000000 --- a/src/org/traccar/protocol/AutoGradeProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class AutoGradeProtocol extends BaseProtocol { - - public AutoGradeProtocol() { - super("autograde"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, ')')); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new AutoGradeProtocolDecoder(AutoGradeProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/AutoGradeProtocolDecoder.java b/src/org/traccar/protocol/AutoGradeProtocolDecoder.java deleted file mode 100644 index 753509f31..000000000 --- a/src/org/traccar/protocol/AutoGradeProtocolDecoder.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2016 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.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class AutoGradeProtocolDecoder extends BaseProtocolDecoder { - - public AutoGradeProtocolDecoder(AutoGradeProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("(") - .number("d{12}") // index - .number("(d{15})") // imei - .number("(dd)(dd)(dd)") // date (ddmmyy) - .expression("([AV])") // validity - .number("(d+)(dd.d+)([NS])") // latitude - .number("(d+)(dd.d+)([EW])") // longitude - .number("([d.]{5})") // speed - .number("(dd)(dd)(dd)") // time (hhmmss) - .number("([d.]{6})") // course - .expression("(.)") // status - .number("A(xxxx)") - .number("B(xxxx)") - .number("C(xxxx)") - .number("D(xxxx)") - .number("E(xxxx)") - .number("K(xxxx)") - .number("L(xxxx)") - .number("M(xxxx)") - .number("N(xxxx)") - .number("O(xxxx)") - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - - dateBuilder.setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.setCourse(parser.nextDouble(0)); - - int status = parser.next().charAt(0); - position.set(Position.KEY_STATUS, status); - position.set(Position.KEY_IGNITION, BitUtil.check(status, 0)); - - for (int i = 1; i <= 5; i++) { - position.set(Position.PREFIX_ADC + i, parser.next()); - } - - for (int i = 1; i <= 5; i++) { - position.set("can" + i, parser.next()); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/Avl301Protocol.java b/src/org/traccar/protocol/Avl301Protocol.java deleted file mode 100644 index 4a217bad6..000000000 --- a/src/org/traccar/protocol/Avl301Protocol.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class Avl301Protocol extends BaseProtocol { - - public Avl301Protocol() { - super("avl301"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(256, 2, 1, -3, 0)); - pipeline.addLast("objectDecoder", new Avl301ProtocolDecoder(Avl301Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Avl301ProtocolDecoder.java b/src/org/traccar/protocol/Avl301ProtocolDecoder.java deleted file mode 100644 index cc61be91b..000000000 --- a/src/org/traccar/protocol/Avl301ProtocolDecoder.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; - -public class Avl301ProtocolDecoder extends BaseProtocolDecoder { - - public Avl301ProtocolDecoder(Avl301Protocol protocol) { - super(protocol); - } - - private String readImei(ChannelBuffer buf) { - int b = buf.readUnsignedByte(); - StringBuilder imei = new StringBuilder(); - imei.append(b & 0x0F); - for (int i = 0; i < 7; i++) { - b = buf.readUnsignedByte(); - imei.append((b & 0xF0) >> 4); - imei.append(b & 0x0F); - } - return imei.toString(); - } - - public static final int MSG_LOGIN = 'L'; - public static final int MSG_STATUS = 'H'; - public static final int MSG_GPS_LBS_STATUS = '$'; - - private void sendResponse(Channel channel, int type) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.directBuffer(5); - response.writeByte('$'); - response.writeByte(type); - response.writeByte('#'); - response.writeByte('\r'); response.writeByte('\n'); - channel.write(response); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(1); // header - int type = buf.readUnsignedByte(); - buf.readUnsignedByte(); // length - - if (type == MSG_LOGIN) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, readImei(buf)); - if (deviceSession == null) { - sendResponse(channel, type); - } - - } else if (type == MSG_STATUS) { - - sendResponse(channel, type); - - } else if (type == MSG_GPS_LBS_STATUS) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - DateBuilder dateBuilder = new DateBuilder() - .setDate(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - position.setTime(dateBuilder.getDate()); - - int gpsLength = buf.readUnsignedByte(); // gps len and sat - position.set(Position.KEY_SATELLITES, gpsLength & 0xf); - - position.set(Position.KEY_SATELLITES_VISIBLE, buf.readUnsignedByte()); // satellites - - double latitude = buf.readUnsignedInt() / 600000.0; - double longitude = buf.readUnsignedInt() / 600000.0; - position.setSpeed(buf.readUnsignedByte()); - - int union = buf.readUnsignedShort(); // course and flags - position.setCourse(union & 0x03FF); - position.setValid((union & 0x1000) != 0); - if ((union & 0x0400) != 0) { - latitude = -latitude; - } - if ((union & 0x0800) != 0) { - longitude = -longitude; - } - - position.setLatitude(latitude); - position.setLongitude(longitude); - - if ((union & 0x4000) != 0) { - position.set("acc", (union & 0x8000) != 0); - } - - position.setNetwork(new Network( - CellTower.fromLacCid(buf.readUnsignedShort(), buf.readUnsignedMedium()))); - - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - int flags = buf.readUnsignedByte(); - position.set("acc", (flags & 0x2) != 0); - - // parse other flags - - position.set(Position.KEY_POWER, buf.readUnsignedByte()); - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/BceFrameDecoder.java b/src/org/traccar/protocol/BceFrameDecoder.java deleted file mode 100644 index 4fac79f85..000000000 --- a/src/org/traccar/protocol/BceFrameDecoder.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class BceFrameDecoder extends FrameDecoder { - - private static final int HANDSHAKE_LENGTH = 7; // "#BCE#\r\n" - - private boolean header = true; - - private static byte checksum(ChannelBuffer buf, int end) { - byte result = 0; - for (int i = 0; i < end; i++) { - result += buf.getByte(buf.readerIndex() + i); - } - return result; - } - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - if (header && buf.readableBytes() >= HANDSHAKE_LENGTH) { - buf.skipBytes(HANDSHAKE_LENGTH); - header = false; - } - - int end = 8; // IMEI - - while (buf.readableBytes() >= end + 2 + 1 + 1 + 1) { - end += buf.getUnsignedShort(buf.readerIndex() + end) + 2; - - if (buf.readableBytes() > end && checksum(buf, end) == buf.getByte(buf.readerIndex() + end)) { - return buf.readBytes(end + 1); - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/BceProtocol.java b/src/org/traccar/protocol/BceProtocol.java deleted file mode 100644 index 5374fd0e1..000000000 --- a/src/org/traccar/protocol/BceProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class BceProtocol extends BaseProtocol { - - public BceProtocol() { - super("bce"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new BceFrameDecoder()); - pipeline.addLast("objectDecoder", new BceProtocolDecoder(BceProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/BceProtocolDecoder.java b/src/org/traccar/protocol/BceProtocolDecoder.java deleted file mode 100644 index b472ac6c9..000000000 --- a/src/org/traccar/protocol/BceProtocolDecoder.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class BceProtocolDecoder extends BaseProtocolDecoder { - - public BceProtocolDecoder(BceProtocol protocol) { - super(protocol); - } - - private static final int DATA_TYPE = 7; - - public static final int MSG_ASYNC_STACK = 0xA5; - public static final int MSG_STACK_COFIRM = 0x19; - public static final int MSG_TIME_TRIGGERED = 0xA0; - public static final int MSG_OUTPUT_CONTROL = 0x41; - public static final int MSG_OUTPUT_CONTROL_ACK = 0xC1; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - String imei = String.format("%015d", buf.readLong()); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - - List<Position> positions = new LinkedList<>(); - - while (buf.readableBytes() > 1) { - - int dataEnd = buf.readUnsignedShort() + buf.readerIndex(); - int type = buf.readUnsignedByte(); - int confirmKey = buf.readUnsignedByte() & 0x7F; - - while (buf.readerIndex() < dataEnd) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - int structEnd = buf.readUnsignedByte() + buf.readerIndex(); - - long time = buf.readUnsignedInt(); - if ((time & 0x0f) == DATA_TYPE) { - - time = time >> 4 << 1; - time += 0x47798280; // 01/01/2008 - position.setTime(new Date(time * 1000)); - - // Read masks - int mask; - List<Integer> masks = new LinkedList<>(); - do { - mask = buf.readUnsignedShort(); - masks.add(mask); - } while (BitUtil.check(mask, 15)); - - mask = masks.get(0); - - if (BitUtil.check(mask, 0)) { - position.setValid(true); - position.setLongitude(buf.readFloat()); - position.setLatitude(buf.readFloat()); - position.setSpeed(buf.readUnsignedByte()); - - int gps = buf.readUnsignedByte(); - position.set(Position.KEY_SATELLITES, gps & 0xf); - position.set(Position.KEY_HDOP, gps >> 4); - - position.setCourse(buf.readUnsignedByte()); - position.setAltitude(buf.readUnsignedShort()); - - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - } - - if (BitUtil.check(mask, 1)) { - position.set(Position.KEY_INPUT, buf.readUnsignedShort()); - } - - for (int i = 1; i <= 8; i++) { - if (BitUtil.check(mask, i + 1)) { - position.set(Position.PREFIX_ADC + i, buf.readUnsignedShort()); - } - } - - if (BitUtil.check(mask, 10)) { - buf.skipBytes(4); - } - if (BitUtil.check(mask, 11)) { - buf.skipBytes(4); - } - if (BitUtil.check(mask, 12)) { - buf.skipBytes(2); - } - if (BitUtil.check(mask, 13)) { - buf.skipBytes(2); - } - - if (BitUtil.check(mask, 14)) { - position.setNetwork(new Network(CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedByte(), - buf.readUnsignedShort(), buf.readUnsignedShort(), - buf.readUnsignedByte()))); - buf.readUnsignedByte(); - } - - if (BitUtil.check(mask, 0)) { - positions.add(position); - } - } - - buf.readerIndex(structEnd); - } - - // Send response - if (type == MSG_ASYNC_STACK && channel != null) { - ChannelBuffer response = ChannelBuffers.buffer(ByteOrder.LITTLE_ENDIAN, 8 + 2 + 2 + 1); - response.writeLong(Long.parseLong(imei)); - response.writeShort(2); - response.writeByte(MSG_STACK_COFIRM); - response.writeByte(confirmKey); - - int checksum = 0; - for (int i = 0; i < response.writerIndex(); i++) { - checksum += response.getUnsignedByte(i); - } - response.writeByte(checksum); - - channel.write(response); - } - } - - return positions; - } - -} diff --git a/src/org/traccar/protocol/BlackKiteProtocol.java b/src/org/traccar/protocol/BlackKiteProtocol.java deleted file mode 100644 index db32f5328..000000000 --- a/src/org/traccar/protocol/BlackKiteProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2015 Vijay Kumar (vijaykumar@zilogic.com) - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class BlackKiteProtocol extends BaseProtocol { - - public BlackKiteProtocol() { - super("blackkite"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new GalileoFrameDecoder()); - pipeline.addLast("objectDecoder", new BlackKiteProtocolDecoder(BlackKiteProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/BlackKiteProtocolDecoder.java b/src/org/traccar/protocol/BlackKiteProtocolDecoder.java deleted file mode 100644 index 561d7c18b..000000000 --- a/src/org/traccar/protocol/BlackKiteProtocolDecoder.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright 2013 - 2016 Anton Tananaev (anton@traccar.org) - * Copyright 2015 Vijay Kumar (vijaykumar@zilogic.com) - * - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; - -public class BlackKiteProtocolDecoder extends BaseProtocolDecoder { - - public BlackKiteProtocolDecoder(BlackKiteProtocol protocol) { - super(protocol); - } - - private static final int TAG_IMEI = 0x03; - private static final int TAG_DATE = 0x20; - private static final int TAG_COORDINATES = 0x30; - private static final int TAG_SPEED_COURSE = 0x33; - private static final int TAG_ALTITUDE = 0x34; - private static final int TAG_STATUS = 0x40; - private static final int TAG_DIGITAL_OUTPUTS = 0x45; - private static final int TAG_DIGITAL_INPUTS = 0x46; - private static final int TAG_INPUT_VOLTAGE1 = 0x50; - private static final int TAG_INPUT_VOLTAGE2 = 0x51; - private static final int TAG_INPUT_VOLTAGE3 = 0x52; - private static final int TAG_INPUT_VOLTAGE4 = 0x53; - private static final int TAG_XT1 = 0x60; - private static final int TAG_XT2 = 0x61; - private static final int TAG_XT3 = 0x62; - - private void sendReply(Channel channel, int checksum) { - ChannelBuffer reply = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, 3); - reply.writeByte(0x02); - reply.writeShort((short) checksum); - if (channel != null) { - channel.write(reply); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.readUnsignedByte(); // header - int length = (buf.readUnsignedShort() & 0x7fff) + 3; - - List<Position> positions = new LinkedList<>(); - Set<Integer> tags = new HashSet<>(); - boolean hasLocation = false; - Position position = new Position(); - position.setProtocol(getProtocolName()); - - while (buf.readerIndex() < length) { - - // Check if new message started - int tag = buf.readUnsignedByte(); - if (tags.contains(tag)) { - if (hasLocation && position.getFixTime() != null) { - positions.add(position); - } - tags.clear(); - hasLocation = false; - position = new Position(); - } - tags.add(tag); - - switch (tag) { - - case TAG_IMEI: - getDeviceSession(channel, remoteAddress, buf.readBytes(15).toString(StandardCharsets.US_ASCII)); - break; - - case TAG_DATE: - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - break; - - case TAG_COORDINATES: - hasLocation = true; - position.setValid((buf.readUnsignedByte() & 0xf0) == 0x00); - position.setLatitude(buf.readInt() / 1000000.0); - position.setLongitude(buf.readInt() / 1000000.0); - break; - - case TAG_SPEED_COURSE: - position.setSpeed(buf.readUnsignedShort() * 0.0539957); - position.setCourse(buf.readUnsignedShort() * 0.1); - break; - - case TAG_ALTITUDE: - position.setAltitude(buf.readShort()); - break; - - case TAG_STATUS: - int status = buf.readUnsignedShort(); - position.set(Position.KEY_IGNITION, BitUtil.check(status, 9)); - if (BitUtil.check(status, 15)) { - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - } - position.set(Position.KEY_CHARGE, BitUtil.check(status, 2)); - break; - - case TAG_DIGITAL_INPUTS: - int input = buf.readUnsignedShort(); - for (int i = 0; i < 16; i++) { - position.set(Position.PREFIX_IO + (i + 1), BitUtil.check(input, i)); - } - break; - - case TAG_DIGITAL_OUTPUTS: - int output = buf.readUnsignedShort(); - for (int i = 0; i < 16; i++) { - position.set(Position.PREFIX_IO + (i + 17), BitUtil.check(output, i)); - } - break; - - case TAG_INPUT_VOLTAGE1: - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort() / 1000.0); - break; - - case TAG_INPUT_VOLTAGE2: - position.set(Position.PREFIX_ADC + 2, buf.readUnsignedShort() / 1000.0); - break; - - case TAG_INPUT_VOLTAGE3: - position.set(Position.PREFIX_ADC + 3, buf.readUnsignedShort() / 1000.0); - break; - - case TAG_INPUT_VOLTAGE4: - position.set(Position.PREFIX_ADC + 4, buf.readUnsignedShort() / 1000.0); - break; - - case TAG_XT1: - case TAG_XT2: - case TAG_XT3: - buf.skipBytes(16); - break; - - default: - break; - - } - } - - if (hasLocation && position.getFixTime() != null) { - positions.add(position); - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - sendReply(channel, buf.readUnsignedShort()); - - for (Position p : positions) { - p.setDeviceId(deviceSession.getDeviceId()); - } - - if (positions.isEmpty()) { - return null; - } - - return positions; - } - -} diff --git a/src/org/traccar/protocol/BoxProtocol.java b/src/org/traccar/protocol/BoxProtocol.java deleted file mode 100644 index 36e7790f0..000000000 --- a/src/org/traccar/protocol/BoxProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class BoxProtocol extends BaseProtocol { - - public BoxProtocol() { - super("box"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '\r')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new BoxProtocolDecoder(BoxProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/BoxProtocolDecoder.java b/src/org/traccar/protocol/BoxProtocolDecoder.java deleted file mode 100644 index 562731657..000000000 --- a/src/org/traccar/protocol/BoxProtocolDecoder.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2014 - 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -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 BoxProtocolDecoder extends BaseProtocolDecoder { - - public BoxProtocolDecoder(BoxProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("L,") - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .text("G,") - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(d+.?d*),") // speed - .number("(d+.?d*),") // course - .number("(d+.?d*),") // distance - .number("(d+),") // event - .number("(d+)") // status - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.startsWith("H,")) { - - int index = sentence.indexOf(',', 2) + 1; - String id = sentence.substring(index, sentence.indexOf(',', index)); - getDeviceSession(channel, remoteAddress, id); - - } else if (sentence.startsWith("E,")) { - - if (channel != null) { - channel.write("A," + sentence.substring(2) + "\r"); - } - - } else if (sentence.startsWith("L,")) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - position.setTime(parser.nextDateTime()); - - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_ODOMETER_TRIP, parser.nextDouble(0) * 1000); - position.set(Position.KEY_EVENT, parser.next()); - - int status = parser.nextInt(0); - position.setValid((status & 0x04) == 0); - position.set(Position.KEY_STATUS, status); - - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/CalAmpProtocol.java b/src/org/traccar/protocol/CalAmpProtocol.java deleted file mode 100644 index a3577f10c..000000000 --- a/src/org/traccar/protocol/CalAmpProtocol.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class CalAmpProtocol extends BaseProtocol { - - public CalAmpProtocol() { - super("calamp"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectDecoder", new CalAmpProtocolDecoder(CalAmpProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/CalAmpProtocolDecoder.java b/src/org/traccar/protocol/CalAmpProtocolDecoder.java deleted file mode 100644 index 557e2d6e6..000000000 --- a/src/org/traccar/protocol/CalAmpProtocolDecoder.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright 2015 - 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.Date; - -public class CalAmpProtocolDecoder extends BaseProtocolDecoder { - - public CalAmpProtocolDecoder(CalAmpProtocol protocol) { - super(protocol); - } - - public static final int MSG_NULL = 0; - public static final int MSG_ACK = 1; - public static final int MSG_EVENT_REPORT = 2; - public static final int MSG_ID_REPORT = 3; - public static final int MSG_USER_DATA = 4; - public static final int MSG_APP_DATA = 5; - public static final int MSG_CONFIG = 6; - public static final int MSG_UNIT_REQUEST = 7; - public static final int MSG_LOCATE_REPORT = 8; - public static final int MSG_USER_DATA_ACC = 9; - public static final int MSG_MINI_EVENT_REPORT = 10; - public static final int MSG_MINI_USER_DATA = 11; - - public static final int SERVICE_UNACKNOWLEDGED = 0; - public static final int SERVICE_ACKNOWLEDGED = 1; - public static final int SERVICE_RESPONSE = 2; - - private void sendResponse(Channel channel, SocketAddress remoteAddress, int type, int index, int result) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.directBuffer(10); - response.writeByte(SERVICE_RESPONSE); - response.writeByte(MSG_ACK); - response.writeShort(index); - response.writeByte(type); - response.writeByte(result); - response.writeByte(0); - response.writeMedium(0); - channel.write(response, remoteAddress); - } - } - - private Position decodePosition(DeviceSession deviceSession, int type, ChannelBuffer buf) { - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - if (type != MSG_MINI_EVENT_REPORT) { - buf.readUnsignedInt(); // fix time - } - position.setLatitude(buf.readInt() * 0.0000001); - position.setLongitude(buf.readInt() * 0.0000001); - if (type != MSG_MINI_EVENT_REPORT) { - position.setAltitude(buf.readInt() * 0.01); - position.setSpeed(UnitsConverter.knotsFromCps(buf.readUnsignedInt())); - } - position.setCourse(buf.readShort()); - if (type == MSG_MINI_EVENT_REPORT) { - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - } - - if (type == MSG_MINI_EVENT_REPORT) { - position.set(Position.KEY_SATELLITES, buf.getUnsignedByte(buf.readerIndex()) & 0xf); - position.setValid((buf.readUnsignedByte() & 0x20) == 0); - } else { - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - position.setValid((buf.readUnsignedByte() & 0x08) == 0); - } - - if (type != MSG_MINI_EVENT_REPORT) { - position.set("carrier", buf.readUnsignedShort()); - position.set(Position.KEY_RSSI, buf.readShort()); - } - - position.set("modem", buf.readUnsignedByte()); - - if (type != MSG_MINI_EVENT_REPORT) { - position.set(Position.KEY_HDOP, buf.readUnsignedByte()); - } - - int input = buf.readUnsignedByte(); - position.set(Position.KEY_INPUT, input); - position.set(Position.KEY_IGNITION, BitUtil.check(input, 0)); - - if (type != MSG_MINI_EVENT_REPORT) { - position.set(Position.KEY_STATUS, buf.readUnsignedByte()); - } - - if (type == MSG_EVENT_REPORT || type == MSG_MINI_EVENT_REPORT) { - if (type != MSG_MINI_EVENT_REPORT) { - buf.readUnsignedByte(); // event index - } - position.set(Position.KEY_EVENT, buf.readUnsignedByte()); - } - - int accType = BitUtil.from(buf.getUnsignedByte(buf.readerIndex()), 6); - int accCount = BitUtil.to(buf.readUnsignedByte(), 6); - - if (type != MSG_MINI_EVENT_REPORT) { - position.set("append", buf.readUnsignedByte()); - } - - if (accType == 1) { - buf.readUnsignedInt(); // threshold - buf.readUnsignedInt(); // mask - } - - for (int i = 0; i < accCount; i++) { - if (buf.readableBytes() >= 4) { - position.set("acc" + i, buf.readUnsignedInt()); - } - } - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - if (BitUtil.check(buf.getByte(buf.readerIndex()), 7)) { - - int content = buf.readUnsignedByte(); - - if (BitUtil.check(content, 0)) { - String id = ChannelBuffers.hexDump(buf.readBytes(buf.readUnsignedByte())); - getDeviceSession(channel, remoteAddress, id); - } - - if (BitUtil.check(content, 1)) { - buf.skipBytes(buf.readUnsignedByte()); // identifier type - } - - if (BitUtil.check(content, 2)) { - buf.skipBytes(buf.readUnsignedByte()); // authentication - } - - if (BitUtil.check(content, 3)) { - buf.skipBytes(buf.readUnsignedByte()); // routing - } - - if (BitUtil.check(content, 4)) { - buf.skipBytes(buf.readUnsignedByte()); // forwarding - } - - if (BitUtil.check(content, 5)) { - buf.skipBytes(buf.readUnsignedByte()); // response redirection - } - - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - int service = buf.readUnsignedByte(); - int type = buf.readUnsignedByte(); - int index = buf.readUnsignedShort(); - - if (service == SERVICE_ACKNOWLEDGED) { - sendResponse(channel, remoteAddress, type, index, 0); - } - - if (type == MSG_EVENT_REPORT || type == MSG_LOCATE_REPORT || type == MSG_MINI_EVENT_REPORT) { - return decodePosition(deviceSession, type, buf); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/CarTrackProtocol.java b/src/org/traccar/protocol/CarTrackProtocol.java deleted file mode 100644 index d235c92be..000000000 --- a/src/org/traccar/protocol/CarTrackProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class CarTrackProtocol extends BaseProtocol { - - public CarTrackProtocol() { - super("cartrack"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "##")); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new CarTrackProtocolDecoder(CarTrackProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/CarTrackProtocolDecoder.java b/src/org/traccar/protocol/CarTrackProtocolDecoder.java deleted file mode 100644 index 3064bbb35..000000000 --- a/src/org/traccar/protocol/CarTrackProtocolDecoder.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2014 - 2015 Anton Tananaev (anton@traccar.org) - * Copyright 2014 Rohit - * - * 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class CarTrackProtocolDecoder extends BaseProtocolDecoder { - - public CarTrackProtocolDecoder(CarTrackProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$$") // header - .number("(d+)") // device id - .text("?").expression("*") - .text("&A") - .number("(dddd)") // command - .text("&B") - .number("(dd)(dd)(dd).(ddd),") // time (hhmmss.sss) - .expression("([AV]),") // validity - .number("(dd)(dd.dddd),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.dddd),") // longitude - .expression("([EW]),") - .number("(d+.d*)?,") // speed - .number("(d+.d*)?,") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .any() - .expression("&C([^&]*)") // io - .expression("&D([^&]*)") // odometer - .expression("&E([^&]*)") // alarm - .expression("&Y([^&]*)").optional() // adc - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_COMMAND, parser.next()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.set(Position.PREFIX_IO + 1, parser.next()); - - String odometer = parser.next(); - odometer = odometer.replace(":", "A"); - odometer = odometer.replace(";", "B"); - odometer = odometer.replace("<", "C"); - odometer = odometer.replace("=", "D"); - odometer = odometer.replace(">", "E"); - odometer = odometer.replace("?", "F"); - position.set(Position.KEY_ODOMETER, Integer.parseInt(odometer, 16)); - - parser.next(); // there is no meaningful alarms - position.set(Position.PREFIX_ADC + 1, parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/CarcellProtocol.java b/src/org/traccar/protocol/CarcellProtocol.java deleted file mode 100644 index c9fedad65..000000000 --- a/src/org/traccar/protocol/CarcellProtocol.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2016 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 java.util.List; - -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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -public class CarcellProtocol extends BaseProtocol { - - public CarcellProtocol() { - super("carcell"); - setSupportedDataCommands( - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '\r')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectEncoder", new CarcellProtocolEncoder()); - pipeline.addLast("objectDecoder", new CarcellProtocolDecoder(CarcellProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/CarcellProtocolDecoder.java b/src/org/traccar/protocol/CarcellProtocolDecoder.java deleted file mode 100644 index fc5710f09..000000000 --- a/src/org/traccar/protocol/CarcellProtocolDecoder.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 2016 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 java.net.SocketAddress; -import java.util.regex.Pattern; - -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Parser; -import org.traccar.helper.Parser.CoordinateFormat; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -public class CarcellProtocolDecoder extends BaseProtocolDecoder { - - public CarcellProtocolDecoder(CarcellProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .expression("([$%])") // memory flag - .number("(d+),") // imei - .groupBegin() - .number("([NS])(dd)(dd).(dddd),") // latitude - .number("([EW])(ddd)(dd).(dddd),") // longitude - .or() - .text("CEL,") - .number("([NS])(d+.d+),") // latitude - .number("([EW])(d+.d+),") // longitude - .groupEnd() - .number("(d+),") // speed - .number("(d+),") // course - .groupBegin() - .number("([-+]ddd)([-+]ddd)([-+]ddd),") // x,y,z - .or() - .number("(d+),") // accel - .groupEnd() - .number("(d+),") // battery - .number("(d+),") // csq - .number("(d),") // jamming - .number("(d+),") // hdop - .expression("([CG]),?") // clock type - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(d),") // block - .number("(d),") // ignition - .groupBegin() - .number("(d),") // cloned - .expression("([AF])") // panic - .number("(d),") // painel - .number("(d+),") // battery voltage - .or() - .number("(dd),") // time until delivery - .expression("([AF])") // panic - .number("(d),") // aux - .number("(d{2,4}),") // battery voltage - .number("(d{20}),") // ccid - .groupEnd() - .number("(xx)") // crc - .any() // full format - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.set(Position.KEY_ARCHIVE, parser.next().equals("%")); - position.setValid(true); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - if (parser.hasNext(8)) { - position.setLatitude(parser.nextCoordinate(CoordinateFormat.HEM_DEG_MIN_MIN)); - position.setLongitude(parser.nextCoordinate(CoordinateFormat.HEM_DEG_MIN_MIN)); - } - - if (parser.hasNext(4)) { - position.setLatitude(parser.nextCoordinate(CoordinateFormat.HEM_DEG)); - position.setLongitude(parser.nextCoordinate(CoordinateFormat.HEM_DEG)); - } - - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextInt(0))); - position.setCourse(parser.nextInt(0)); - - if (parser.hasNext(3)) { - position.set("x", parser.nextInt(0)); - position.set("y", parser.nextInt(0)); - position.set("z", parser.nextInt(0)); - } - - if (parser.hasNext(1)) { - position.set(Position.KEY_ACCELERATION, parser.nextInt(0)); - } - - Double internalBattery = (parser.nextDouble(0) + 100d) * 0.0294d; - position.set(Position.KEY_BATTERY, internalBattery); - position.set(Position.KEY_RSSI, parser.nextInt(0)); - position.set("jamming", parser.next().equals("1")); - position.set(Position.KEY_GPS, parser.nextInt(0)); - - position.set("clockType", parser.next()); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.set("blocked", parser.next().equals("1")); - position.set(Position.KEY_IGNITION, parser.next().equals("1")); - - if (parser.hasNext(4)) { - position.set("cloned", parser.next().equals("1")); - - parser.next(); // panic button status - - String painelStatus = parser.next(); - if (painelStatus.equals("1")) { - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - } - position.set("painel", painelStatus.equals("2")); - - Double mainVoltage = parser.nextDouble(0) / 100d; - position.set(Position.KEY_POWER, mainVoltage); - } - - if (parser.hasNext(5)) { - position.set("timeUntilDelivery", parser.nextInt(0)); - parser.next(); // panic button status - position.set(Position.KEY_INPUT, parser.next()); - - Double mainVoltage = parser.nextDouble(0) / 100d; - position.set(Position.KEY_POWER, mainVoltage); - - position.set("iccid", parser.next()); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/CarcellProtocolEncoder.java b/src/org/traccar/protocol/CarcellProtocolEncoder.java deleted file mode 100644 index 0846949c4..000000000 --- a/src/org/traccar/protocol/CarcellProtocolEncoder.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2016 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.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class CarcellProtocolEncoder extends StringProtocolEncoder { - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_ENGINE_STOP: - return formatCommand(command, "$SRVCMD,{%s},BA#\r\n", Command.KEY_UNIQUE_ID); - case Command.TYPE_ENGINE_RESUME: - return formatCommand(command, "$SRVCMD,{%s},BD#\r\n", Command.KEY_UNIQUE_ID); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/CarscopProtocol.java b/src/org/traccar/protocol/CarscopProtocol.java deleted file mode 100644 index 01a754027..000000000 --- a/src/org/traccar/protocol/CarscopProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class CarscopProtocol extends BaseProtocol { - - public CarscopProtocol() { - super("carscop"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '^')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new CarscopProtocolDecoder(CarscopProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/CarscopProtocolDecoder.java b/src/org/traccar/protocol/CarscopProtocolDecoder.java deleted file mode 100644 index 2a081bcdd..000000000 --- a/src/org/traccar/protocol/CarscopProtocolDecoder.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2013 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class CarscopProtocolDecoder extends BaseProtocolDecoder { - - public CarscopProtocolDecoder(CarscopProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("*") - .any() - .number("(dd)(dd)(dd)") // time (hhmmss) - .expression("([AV])") // validity - .number("(dd)(dd.dddd)") // latitude - .expression("([NS])") - .number("(ddd)(dd.dddd)") // longitude - .expression("([EW])") - .number("(ddd.d)") // speed - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(ddd.dd)") // course - .groupBegin() - .number("(d{8})") // state - .number("L(d{6})") // odometer - .groupEnd("?") - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - DeviceSession deviceSession; - int index = sentence.indexOf("UB05"); - if (index != -1) { - String imei = sentence.substring(index + 4, index + 4 + 15); - deviceSession = getDeviceSession(channel, remoteAddress, imei); - } else { - deviceSession = getDeviceSession(channel, remoteAddress); - } - if (deviceSession == null) { - return null; - } - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - - dateBuilder.setDate(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.setCourse(parser.nextDouble(0)); - - if (parser.hasNext(2)) { - position.set(Position.KEY_STATUS, parser.next()); - position.set(Position.KEY_ODOMETER, parser.nextInt(0)); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/CastelProtocol.java b/src/org/traccar/protocol/CastelProtocol.java deleted file mode 100644 index db9df0674..000000000 --- a/src/org/traccar/protocol/CastelProtocol.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class CastelProtocol extends BaseProtocol { - - public CastelProtocol() { - super("castel"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2, 2, -4, 0)); - pipeline.addLast("objectDecoder", new CastelProtocolDecoder(CastelProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - - server = new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectDecoder", new CastelProtocolDecoder(CastelProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/CastelProtocolDecoder.java b/src/org/traccar/protocol/CastelProtocolDecoder.java deleted file mode 100644 index 3a0ccea78..000000000 --- a/src/org/traccar/protocol/CastelProtocolDecoder.java +++ /dev/null @@ -1,456 +0,0 @@ -/* - * Copyright 2015 - 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Checksum; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.ObdDecoder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -public class CastelProtocolDecoder extends BaseProtocolDecoder { - - private static final Map<Integer, Integer> PID_LENGTH_MAP = new HashMap<>(); - - static { - int[] l1 = { - 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0b, 0x0d, - 0x0e, 0x0f, 0x11, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x2c, - 0x2d, 0x2e, 0x2f, 0x30, 0x33, 0x43, 0x45, 0x46, - 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x51, 0x52, - 0x5a - }; - int[] l2 = { - 0x02, 0x03, 0x0a, 0x0c, 0x10, 0x14, 0x15, 0x16, - 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1f, 0x21, 0x22, - 0x23, 0x31, 0x32, 0x3c, 0x3d, 0x3e, 0x3f, 0x42, - 0x44, 0x4d, 0x4e, 0x50, 0x53, 0x54, 0x55, 0x56, - 0x57, 0x58, 0x59 - }; - int[] l4 = { - 0x00, 0x01, 0x20, 0x24, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x2b, 0x34, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x3a, 0x3b, 0x40, 0x41, 0x4f - }; - for (int i : l1) { - PID_LENGTH_MAP.put(i, 1); - } - for (int i : l2) { - PID_LENGTH_MAP.put(i, 2); - } - for (int i : l4) { - PID_LENGTH_MAP.put(i, 4); - } - } - - public CastelProtocolDecoder(CastelProtocol protocol) { - super(protocol); - } - - public static final short MSG_SC_LOGIN = 0x1001; - public static final short MSG_SC_LOGIN_RESPONSE = (short) 0x9001; - public static final short MSG_SC_LOGOUT = 0x1002; - public static final short MSG_SC_HEARTBEAT = 0x1003; - public static final short MSG_SC_HEARTBEAT_RESPONSE = (short) 0x9003; - public static final short MSG_SC_GPS = 0x4001; - public static final short MSG_SC_PID_DATA = 0x4002; - public static final short MSG_SC_SUPPORTED_PID = 0x4004; - public static final short MSG_SC_OBD_DATA = 0x4005; - public static final short MSG_SC_DTCS_PASSENGER = 0x4006; - public static final short MSG_SC_DTCS_COMMERCIAL = 0x400B; - public static final short MSG_SC_ALARM = 0x4007; - public static final short MSG_SC_CELL = 0x4008; - public static final short MSG_SC_GPS_SLEEP = 0x4009; - public static final short MSG_SC_AGPS_REQUEST = 0x5101; - public static final short MSG_SC_CURRENT_LOCATION = (short) 0xB001; - - public static final short MSG_CC_LOGIN = 0x4001; - public static final short MSG_CC_LOGIN_RESPONSE = (short) 0x8001; - public static final short MSG_CC_HEARTBEAT = 0x4206; - public static final short MSG_CC_HEARTBEAT_RESPONSE = (short) 0x8206; - - private Position readPosition(DeviceSession deviceSession, ChannelBuffer buf) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setDateReverse(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - position.setTime(dateBuilder.getDate()); - - double lat = buf.readUnsignedInt() / 3600000.0; - double lon = buf.readUnsignedInt() / 3600000.0; - position.setSpeed(UnitsConverter.knotsFromCps(buf.readUnsignedShort())); - position.setCourse(buf.readUnsignedShort() * 0.1); - - int flags = buf.readUnsignedByte(); - if ((flags & 0x02) == 0) { - lat = -lat; - } - if ((flags & 0x01) == 0) { - lon = -lon; - } - position.setLatitude(lat); - position.setLongitude(lon); - position.setValid((flags & 0x0C) > 0); - position.set(Position.KEY_SATELLITES, flags >> 4); - - return position; - } - - private Position createPosition(DeviceSession deviceSession) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, null); - - return position; - } - - private void decodeObd(Position position, ChannelBuffer buf, boolean groups) { - - int count = buf.readUnsignedByte(); - - int[] pids = new int[count]; - for (int i = 0; i < count; i++) { - pids[i] = buf.readUnsignedShort() & 0xff; - } - - if (groups) { - buf.readUnsignedByte(); // group count - buf.readUnsignedByte(); // group size - } - - for (int i = 0; i < count; i++) { - int value; - switch (PID_LENGTH_MAP.get(pids[i])) { - case 1: - value = buf.readUnsignedByte(); - break; - case 2: - value = buf.readUnsignedShort(); - break; - case 4: - value = buf.readInt(); - break; - default: - value = 0; - break; - } - position.add(ObdDecoder.decodeData(pids[i], value, false)); - } - } - - private void decodeStat(Position position, ChannelBuffer buf) { - - buf.readUnsignedInt(); // ACC ON time - buf.readUnsignedInt(); // UTC time - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - position.set(Position.KEY_ODOMETER_TRIP, buf.readUnsignedInt()); - position.set(Position.KEY_FUEL_CONSUMPTION, buf.readUnsignedInt()); - buf.readUnsignedShort(); // current fuel consumption - position.set(Position.KEY_STATUS, buf.readUnsignedInt()); - buf.skipBytes(8); - } - - private void sendResponse( - Channel channel, SocketAddress remoteAddress, - int version, ChannelBuffer id, short type, ChannelBuffer content) { - - if (channel != null) { - int length = 2 + 2 + 1 + id.readableBytes() + 2 + 2 + 2; - if (content != null) { - length += content.readableBytes(); - } - - ChannelBuffer response = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, length); - response.writeByte('@'); response.writeByte('@'); - response.writeShort(length); - response.writeByte(version); - response.writeBytes(id); - response.writeShort(ChannelBuffers.swapShort(type)); - if (content != null) { - response.writeBytes(content); - } - response.writeShort( - Checksum.crc16(Checksum.CRC16_X25, response.toByteBuffer(0, response.writerIndex()))); - response.writeByte(0x0D); response.writeByte(0x0A); - channel.write(response, remoteAddress); - } - } - - private void sendResponse( - Channel channel, SocketAddress remoteAddress, ChannelBuffer id, short type) { - - if (channel != null) { - int length = 2 + 2 + id.readableBytes() + 2 + 4 + 8 + 2 + 2; - - ChannelBuffer response = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, length); - response.writeByte('@'); response.writeByte('@'); - response.writeShort(length); - response.writeBytes(id); - response.writeShort(ChannelBuffers.swapShort(type)); - response.writeInt(0); - for (int i = 0; i < 8; i++) { - response.writeByte(0xff); - } - response.writeShort( - Checksum.crc16(Checksum.CRC16_X25, response.toByteBuffer(0, response.writerIndex()))); - response.writeByte(0x0D); response.writeByte(0x0A); - channel.write(response, remoteAddress); - } - } - - private Object decodeSc( - Channel channel, SocketAddress remoteAddress, ChannelBuffer buf, - int version, ChannelBuffer id, int type, DeviceSession deviceSession) { - - if (type == MSG_SC_HEARTBEAT) { - - sendResponse(channel, remoteAddress, version, id, MSG_SC_HEARTBEAT_RESPONSE, null); - - } else if (type == MSG_SC_LOGIN || type == MSG_SC_LOGOUT || type == MSG_SC_GPS - || type == MSG_SC_ALARM || type == MSG_SC_CURRENT_LOCATION) { - - if (type == MSG_SC_LOGIN) { - ChannelBuffer response = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, 10); - response.writeInt(0xFFFFFFFF); - response.writeShort(0); - response.writeInt((int) (System.currentTimeMillis() / 1000)); - sendResponse(channel, remoteAddress, version, id, MSG_SC_LOGIN_RESPONSE, response); - } - - if (type == MSG_SC_GPS) { - buf.readUnsignedByte(); // historical - } else if (type == MSG_SC_ALARM) { - buf.readUnsignedInt(); // alarm - } else if (type == MSG_SC_CURRENT_LOCATION) { - buf.readUnsignedShort(); - } - - buf.readUnsignedInt(); // ACC ON time - buf.readUnsignedInt(); // UTC time - long odometer = buf.readUnsignedInt(); - long tripOdometer = buf.readUnsignedInt(); - long fuelConsumption = buf.readUnsignedInt(); - buf.readUnsignedShort(); // current fuel consumption - long status = buf.readUnsignedInt(); - buf.skipBytes(8); - - int count = buf.readUnsignedByte(); - - List<Position> positions = new LinkedList<>(); - - for (int i = 0; i < count; i++) { - Position position = readPosition(deviceSession, buf); - position.set(Position.KEY_ODOMETER, odometer); - position.set(Position.KEY_ODOMETER_TRIP, tripOdometer); - position.set(Position.KEY_FUEL_CONSUMPTION, fuelConsumption); - position.set(Position.KEY_STATUS, status); - positions.add(position); - } - - if (!positions.isEmpty()) { - return positions; - } - - } else if (type == MSG_SC_GPS_SLEEP) { - - buf.readUnsignedInt(); // device time - - return readPosition(deviceSession, buf); - - } else if (type == MSG_SC_AGPS_REQUEST) { - - return readPosition(deviceSession, buf); - - } else if (type == MSG_SC_PID_DATA) { - - Position position = createPosition(deviceSession); - - decodeStat(position, buf); - - buf.readUnsignedShort(); // sample rate - decodeObd(position, buf, true); - - return position; - - } else if (type == MSG_SC_DTCS_PASSENGER) { - - Position position = createPosition(deviceSession); - - decodeStat(position, buf); - - buf.readUnsignedByte(); // flag - position.add(ObdDecoder.decodeCodes(ChannelBuffers.hexDump(buf.readBytes(buf.readUnsignedByte())))); - - return position; - - } else if (type == MSG_SC_OBD_DATA) { - - Position position = createPosition(deviceSession); - - decodeStat(position, buf); - - buf.readUnsignedByte(); // flag - decodeObd(position, buf, false); - - return position; - - } else if (type == MSG_SC_CELL) { - - Position position = createPosition(deviceSession); - - decodeStat(position, buf); - - position.setNetwork(new Network( - CellTower.fromLacCid(buf.readUnsignedShort(), buf.readUnsignedShort()))); - - return position; - - } - - return null; - } - - - private Object decodeCc( - Channel channel, SocketAddress remoteAddress, ChannelBuffer buf, - int version, ChannelBuffer id, int type, DeviceSession deviceSession) { - - if (type == MSG_CC_HEARTBEAT) { - - sendResponse(channel, remoteAddress, version, id, MSG_CC_HEARTBEAT_RESPONSE, null); - - buf.readUnsignedByte(); // 0x01 for history - int count = buf.readUnsignedByte(); - - List<Position> positions = new LinkedList<>(); - - for (int i = 0; i < count; i++) { - Position position = readPosition(deviceSession, buf); - - position.set(Position.KEY_STATUS, buf.readUnsignedInt()); - position.set(Position.KEY_BATTERY, buf.readUnsignedByte()); - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - - buf.readUnsignedByte(); // geo-fencing id - buf.readUnsignedByte(); // geo-fencing flags - buf.readUnsignedByte(); // additional flags - - position.setNetwork(new Network( - CellTower.fromLacCid(buf.readUnsignedShort(), buf.readUnsignedShort()))); - - positions.add(position); - } - - return positions; - - } else if (type == MSG_CC_LOGIN) { - - sendResponse(channel, remoteAddress, version, id, MSG_CC_LOGIN_RESPONSE, null); - - Position position = readPosition(deviceSession, buf); - - position.set(Position.KEY_STATUS, buf.readUnsignedInt()); - position.set(Position.KEY_BATTERY, buf.readUnsignedByte()); - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - - buf.readUnsignedByte(); // geo-fencing id - buf.readUnsignedByte(); // geo-fencing flags - buf.readUnsignedByte(); // additional flags - - // GSM_CELL_CODE - // STR_Z - firmware version - // STR_Z - hardware version - - return position; - - } - - return null; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - int header = buf.readUnsignedShort(); - buf.readUnsignedShort(); // length - - int version = -1; - if (header == 0x4040) { - version = buf.readUnsignedByte(); - } - - ChannelBuffer id = buf.readBytes(20); - int type = ChannelBuffers.swapShort(buf.readShort()); - - DeviceSession deviceSession = getDeviceSession( - channel, remoteAddress, id.toString(StandardCharsets.US_ASCII).trim()); - if (deviceSession == null) { - return null; - } - - if (version == -1) { - - if (type == 0x2001) { - - sendResponse(channel, remoteAddress, id, (short) 0x1001); - - buf.readUnsignedInt(); // index - buf.readUnsignedInt(); // unix time - buf.readUnsignedByte(); - - return readPosition(deviceSession, buf); - - } - - } else if (version == 3 || version == 4) { - - return decodeSc(channel, remoteAddress, buf, version, id, type, deviceSession); - - } else { - - return decodeCc(channel, remoteAddress, buf, version, id, type, deviceSession); - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/CellocatorFrameDecoder.java b/src/org/traccar/protocol/CellocatorFrameDecoder.java deleted file mode 100644 index b4708f5db..000000000 --- a/src/org/traccar/protocol/CellocatorFrameDecoder.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; -import org.traccar.helper.Log; - -public class CellocatorFrameDecoder extends FrameDecoder { - - private static final int MESSAGE_MINIMUM_LENGTH = 15; - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - // Check minimum length - int available = buf.readableBytes(); - if (available < MESSAGE_MINIMUM_LENGTH) { - return null; - } - - // Size depending on message type - int length = 0; - int type = buf.getUnsignedByte(4); - switch (type) { - case CellocatorProtocolDecoder.MSG_CLIENT_STATUS: - length = 70; - break; - case CellocatorProtocolDecoder.MSG_CLIENT_PROGRAMMING: - length = 31; - break; - case CellocatorProtocolDecoder.MSG_CLIENT_SERIAL_LOG: - length = 70; - break; - case CellocatorProtocolDecoder.MSG_CLIENT_SERIAL: - if (available >= 19) { - length = 19 + buf.getUnsignedShort(16); - } - break; - case CellocatorProtocolDecoder.MSG_CLIENT_MODULAR: - length = 15 + buf.getUnsignedByte(13); - break; - default: - Log.warning(new UnsupportedOperationException(String.valueOf(type))); - break; - } - - // Read packet - if (length > 0 && available >= length) { - return buf.readBytes(length); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/CellocatorProtocol.java b/src/org/traccar/protocol/CellocatorProtocol.java deleted file mode 100644 index 4a20bc977..000000000 --- a/src/org/traccar/protocol/CellocatorProtocol.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2015 - 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.bootstrap.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.nio.ByteOrder; -import java.util.List; - -public class CellocatorProtocol extends BaseProtocol { - - public CellocatorProtocol() { - super("cellocator"); - setSupportedDataCommands( - Command.TYPE_OUTPUT_CONTROL); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CellocatorFrameDecoder()); - pipeline.addLast("objectEncoder", new CellocatorProtocolEncoder()); - pipeline.addLast("objectDecoder", new CellocatorProtocolDecoder(CellocatorProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - - server = new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectEncoder", new CellocatorProtocolEncoder()); - pipeline.addLast("objectDecoder", new CellocatorProtocolDecoder(CellocatorProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/CellocatorProtocolDecoder.java b/src/org/traccar/protocol/CellocatorProtocolDecoder.java deleted file mode 100644 index 7ef013e28..000000000 --- a/src/org/traccar/protocol/CellocatorProtocolDecoder.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; - -public class CellocatorProtocolDecoder extends BaseProtocolDecoder { - - public CellocatorProtocolDecoder(CellocatorProtocol protocol) { - super(protocol); - } - - static final int MSG_CLIENT_STATUS = 0; - static final int MSG_CLIENT_PROGRAMMING = 3; - static final int MSG_CLIENT_SERIAL_LOG = 7; - static final int MSG_CLIENT_SERIAL = 8; - static final int MSG_CLIENT_MODULAR = 9; - - public static final int MSG_SERVER_ACKNOWLEDGE = 4; - - private byte commandCount; - - private void sendReply(Channel channel, SocketAddress remoteAddress, long deviceId, byte packetNumber) { - ChannelBuffer reply = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, 28); - reply.writeByte('M'); - reply.writeByte('C'); - reply.writeByte('G'); - reply.writeByte('P'); - reply.writeByte(MSG_SERVER_ACKNOWLEDGE); - reply.writeInt((int) deviceId); - reply.writeByte(commandCount++); - reply.writeInt(0); // authentication code - reply.writeByte(0); - reply.writeByte(packetNumber); - reply.writeZero(11); - - byte checksum = 0; - for (int i = 4; i < 27; i++) { - checksum += reply.getByte(i); - } - reply.writeByte(checksum); - - if (channel != null) { - channel.write(reply, remoteAddress); - } - } - - private String decodeAlarm(short reason) { - switch (reason) { - case 70: - return Position.ALARM_SOS; - case 80: - return Position.ALARM_POWER_CUT; - case 81: - return Position.ALARM_LOW_POWER; - default: - return null; - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(4); // system code - int type = buf.readUnsignedByte(); - long deviceUniqueId = buf.readUnsignedInt(); - - if (type != MSG_CLIENT_SERIAL) { - buf.readUnsignedShort(); // communication control - } - byte packetNumber = buf.readByte(); - - sendReply(channel, remoteAddress, deviceUniqueId, packetNumber); - - if (type == MSG_CLIENT_STATUS) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, String.valueOf(deviceUniqueId)); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_VERSION_HW, buf.readUnsignedByte()); - position.set(Position.KEY_VERSION_FW, buf.readUnsignedByte()); - position.set("protocolVersion", buf.readUnsignedByte()); - - position.set(Position.KEY_STATUS, buf.getUnsignedByte(buf.readerIndex()) & 0x0f); - - int operator = (buf.readUnsignedByte() & 0xf0) << 4; - operator += buf.readUnsignedByte(); - - buf.readUnsignedByte(); // reason data - position.set(Position.KEY_ALARM, decodeAlarm(buf.readUnsignedByte())); - - position.set("mode", buf.readUnsignedByte()); - position.set(Position.PREFIX_IO + 1, buf.readUnsignedInt()); - - operator <<= 8; - operator += buf.readUnsignedByte(); - position.set(Position.KEY_OPERATOR, operator); - - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedInt()); - position.set(Position.KEY_ODOMETER, buf.readUnsignedMedium()); - buf.skipBytes(6); // multi-purpose data - - position.set(Position.KEY_GPS, buf.readUnsignedShort()); - position.set("locationStatus", buf.readUnsignedByte()); - position.set("mode1", buf.readUnsignedByte()); - position.set("mode2", buf.readUnsignedByte()); - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - - position.setValid(true); - position.setLongitude(buf.readInt() / Math.PI * 180 / 100000000); - position.setLatitude(buf.readInt() / Math.PI * 180 / 100000000.0); - position.setAltitude(buf.readInt() * 0.01); - position.setSpeed(UnitsConverter.knotsFromMps(buf.readInt() * 0.01)); - position.setCourse(buf.readUnsignedShort() / Math.PI * 180.0 / 1000.0); - - DateBuilder dateBuilder = new DateBuilder() - .setTimeReverse(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setDateReverse(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedShort()); - position.setTime(dateBuilder.getDate()); - - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/CellocatorProtocolEncoder.java b/src/org/traccar/protocol/CellocatorProtocolEncoder.java deleted file mode 100644 index bb143d349..000000000 --- a/src/org/traccar/protocol/CellocatorProtocolEncoder.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import java.nio.ByteOrder; - -public class CellocatorProtocolEncoder extends BaseProtocolEncoder { - - private ChannelBuffer encodeContent(long deviceId, int command, int data1, int data2) { - - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 0); - buf.writeByte('M'); - buf.writeByte('C'); - buf.writeByte('G'); - buf.writeByte('P'); - buf.writeByte(0); - buf.writeInt(Integer.parseInt(getUniqueId(deviceId))); - buf.writeByte(0); // command numerator - buf.writeInt(0); // authentication code - buf.writeByte(command); - buf.writeByte(command); - buf.writeByte(data1); - buf.writeByte(data1); - buf.writeByte(data2); - buf.writeByte(data2); - buf.writeInt(0); // command specific data - - byte checksum = 0; - for (int i = 4; i < buf.writerIndex(); i++) { - checksum += buf.getByte(i); - } - buf.writeByte(checksum); - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_OUTPUT_CONTROL: - int data = Integer.parseInt(command.getString(Command.KEY_DATA)) << 4 - + command.getInteger(Command.KEY_INDEX); - return encodeContent(command.getDeviceId(), 0x03, data, 0); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/CguardProtocol.java b/src/org/traccar/protocol/CguardProtocol.java deleted file mode 100644 index 460bd331f..000000000 --- a/src/org/traccar/protocol/CguardProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class CguardProtocol extends BaseProtocol { - - public CguardProtocol() { - super("cguard"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new CguardProtocolDecoder(CguardProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/CguardProtocolDecoder.java b/src/org/traccar/protocol/CguardProtocolDecoder.java deleted file mode 100644 index 54f83fb73..000000000 --- a/src/org/traccar/protocol/CguardProtocolDecoder.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2016 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.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 CguardProtocolDecoder extends BaseProtocolDecoder { - - public CguardProtocolDecoder(CguardProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN_NV = new PatternBuilder() - .text("NV:") - .number("(dd)(dd)(dd) ") // date (yymmdd) - .number("(dd)(dd)(dd)") // time (hhmmss) - .number(":(-?d+.d+)") // longitude - .number(":(-?d+.d+)") // latitude - .number(":(d+.?d*)") // speed - .number(":(?:NAN|(d+.?d*))") // accuracy - .number(":(?:NAN|(d+.?d*))") // course - .number(":(?:NAN|(d+.?d*))").optional() // altitude - .compile(); - - private static final Pattern PATTERN_BC = new PatternBuilder() - .text("BC:") - .number("(dd)(dd)(dd) ") // date (yymmdd) - .number("(dd)(dd)(dd):") // time (hhmmss) - .expression("(.+)") // data - .compile(); - - private Position decodePosition(DeviceSession deviceSession, String sentence) { - - Parser parser = new Parser(PATTERN_NV, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime()); - - position.setValid(true); - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - - position.setAccuracy(parser.nextDouble(0)); - - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - return position; - } - - private Position decodeStatus(DeviceSession deviceSession, String sentence) { - - Parser parser = new Parser(PATTERN_BC, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, parser.nextDateTime()); - - String[] data = parser.next().split(":"); - for (int i = 0; i < data.length / 2; i++) { - String key = data[i * 2]; - String value = data[i * 2 + 1]; - switch (key) { - case "CSQ1": - position.set(Position.KEY_RSSI, Integer.parseInt(value)); - break; - case "NSQ1": - position.set(Position.KEY_SATELLITES, Integer.parseInt(value)); - break; - case "BAT1": - position.set(Position.KEY_BATTERY_LEVEL, Integer.parseInt(value)); - break; - case "PWR1": - position.set(Position.KEY_POWER, Double.parseDouble(value)); - break; - default: - position.set(key.toLowerCase(), value); - break; - } - } - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.startsWith("ID:") || sentence.startsWith("IDRO:")) { - getDeviceSession(channel, remoteAddress, sentence.substring(sentence.indexOf(':') + 1)); - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - if (sentence.startsWith("NV:")) { - return decodePosition(deviceSession, sentence); - } else if (sentence.startsWith("BC:")) { - return decodeStatus(deviceSession, sentence); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/CityeasyProtocol.java b/src/org/traccar/protocol/CityeasyProtocol.java deleted file mode 100644 index 7e5ca0ba0..000000000 --- a/src/org/traccar/protocol/CityeasyProtocol.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class CityeasyProtocol extends BaseProtocol { - - public CityeasyProtocol() { - super("cityeasy"); - setSupportedDataCommands( - Command.TYPE_POSITION_SINGLE, - Command.TYPE_POSITION_PERIODIC, - Command.TYPE_POSITION_STOP, - Command.TYPE_SET_TIMEZONE); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2, 2, -4, 0)); - pipeline.addLast("objectEncoder", new CityeasyProtocolEncoder()); - pipeline.addLast("objectDecoder", new CityeasyProtocolDecoder(CityeasyProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/CityeasyProtocolDecoder.java b/src/org/traccar/protocol/CityeasyProtocolDecoder.java deleted file mode 100644 index 9a614730f..000000000 --- a/src/org/traccar/protocol/CityeasyProtocolDecoder.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Checksum; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.regex.Pattern; - -public class CityeasyProtocolDecoder extends BaseProtocolDecoder { - - public CityeasyProtocolDecoder(CityeasyProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .groupBegin() - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("([AV]),") // validity - .number("(d+),") // satellites - .number("([NS]),(d+.d+),") // latitude - .number("([EW]),(d+.d+),") // longitude - .number("(d+.d),") // speed - .number("(d+.d),") // hdop - .number("(d+.d)") // altitude - .groupEnd("?").text(";") - .number("(d+),") // mcc - .number("(d+),") // mnc - .number("(d+),") // lac - .number("(d+)") // cell - .any() - .compile(); - - public static final int MSG_ADDRESS_REQUEST = 0x0001; - public static final int MSG_STATUS = 0x0002; - public static final int MSG_LOCATION_REPORT = 0x0003; - public static final int MSG_LOCATION_REQUEST = 0x0004; - public static final int MSG_LOCATION_INTERVAL = 0x0005; - public static final int MSG_PHONE_NUMBER = 0x0006; - public static final int MSG_MONITORING = 0x0007; - public static final int MSG_TIMEZONE = 0x0008; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - buf.readUnsignedShort(); // length - - String imei = ChannelBuffers.hexDump(buf.readBytes(7)); - DeviceSession deviceSession = getDeviceSession( - channel, remoteAddress, imei, imei + Checksum.luhn(Long.parseLong(imei))); - if (deviceSession == null) { - return null; - } - - int type = buf.readUnsignedShort(); - - if (type == MSG_LOCATION_REPORT || type == MSG_LOCATION_REQUEST) { - - String sentence = buf.toString(buf.readerIndex(), buf.readableBytes() - 8, StandardCharsets.US_ASCII); - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - if (parser.hasNext(15)) { - - position.setTime(parser.nextDateTime()); - - position.setValid(parser.next().equals("A")); - position.set(Position.KEY_SATELLITES, parser.nextInt()); - - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG)); - - position.setSpeed(parser.nextDouble(0)); - position.set(Position.KEY_HDOP, parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - } else { - - getLastLocation(position, null); - - } - - position.setNetwork(new Network(CellTower.from( - parser.nextInt(0), parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)))); - - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/CityeasyProtocolEncoder.java b/src/org/traccar/protocol/CityeasyProtocolEncoder.java deleted file mode 100644 index 387926e03..000000000 --- a/src/org/traccar/protocol/CityeasyProtocolEncoder.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2015 - 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 java.util.TimeZone; - -import org.jboss.netty.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Checksum; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class CityeasyProtocolEncoder extends BaseProtocolEncoder { - - private ChannelBuffer encodeContent(int type, ChannelBuffer content) { - - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); - - buf.writeByte('S'); - buf.writeByte('S'); - buf.writeShort(2 + 2 + 2 + content.readableBytes() + 4 + 2 + 2); - buf.writeShort(type); - buf.writeBytes(content); - buf.writeInt(0x0B); - buf.writeShort(Checksum.crc16(Checksum.CRC16_KERMIT, buf.toByteBuffer())); - buf.writeByte('\r'); - buf.writeByte('\n'); - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - - ChannelBuffer content = ChannelBuffers.dynamicBuffer(); - - switch (command.getType()) { - case Command.TYPE_POSITION_SINGLE: - return encodeContent(CityeasyProtocolDecoder.MSG_LOCATION_REQUEST, content); - case Command.TYPE_POSITION_PERIODIC: - content.writeShort(command.getInteger(Command.KEY_FREQUENCY)); - return encodeContent(CityeasyProtocolDecoder.MSG_LOCATION_INTERVAL, content); - case Command.TYPE_POSITION_STOP: - content.writeShort(0); - return encodeContent(CityeasyProtocolDecoder.MSG_LOCATION_INTERVAL, content); - case Command.TYPE_SET_TIMEZONE: - int timezone = TimeZone.getTimeZone(command.getString(Command.KEY_TIMEZONE)).getRawOffset() / 60000; - if (timezone < 0) { - content.writeByte(1); - } else { - content.writeByte(0); - } - content.writeShort(Math.abs(timezone)); - return encodeContent(CityeasyProtocolDecoder.MSG_TIMEZONE, content); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/CradlepointProtocol.java b/src/org/traccar/protocol/CradlepointProtocol.java deleted file mode 100644 index 6ed54aa17..000000000 --- a/src/org/traccar/protocol/CradlepointProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class CradlepointProtocol extends BaseProtocol { - - public CradlepointProtocol() { - super("cradlepoint"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new CradlepointProtocolDecoder(CradlepointProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/CradlepointProtocolDecoder.java b/src/org/traccar/protocol/CradlepointProtocolDecoder.java deleted file mode 100644 index e8f95a60c..000000000 --- a/src/org/traccar/protocol/CradlepointProtocolDecoder.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2016 - 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.Date; -import java.util.regex.Pattern; - -public class CradlepointProtocolDecoder extends BaseProtocolDecoder { - - public CradlepointProtocolDecoder(CradlepointProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .expression("([^,]+),") // id - .number("(d{1,6}),") // time (hhmmss) - .number("(d+)(dd.d+),") // latitude - .expression("([NS]),") - .number("(d+)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.d+)?,") // speed - .number("(d+.d+)?,") // course - .expression("([^,]+)?,") // carrier - .expression("([^,]+)?,") // serdis - .number("(-?d+)?,") // rsrp - .number("(-?d+)?,") // rssi - .number("(-?d+)?,") // rsrq - .expression("([^,]+)?,") // ecio - .expression("([^,]+)?") // wan ip - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - int time = parser.nextInt(); - DateBuilder dateBuilder = new DateBuilder(new Date()); - dateBuilder.setHour(time / 100 / 100); - dateBuilder.setMinute(time / 100 % 100); - dateBuilder.setSecond(time % 100); - position.setTime(dateBuilder.getDate()); - - position.setValid(true); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.set("carrid", parser.next()); - position.set("serdis", parser.next()); - position.set("rsrp", parser.next()); - position.set("dbm", parser.next()); - position.set("rsrq", parser.next()); - position.set("ecio", parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/DishaProtocol.java b/src/org/traccar/protocol/DishaProtocol.java deleted file mode 100644 index 53ba36004..000000000 --- a/src/org/traccar/protocol/DishaProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class DishaProtocol extends BaseProtocol { - - public DishaProtocol() { - super("disha"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new DishaProtocolDecoder(DishaProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/DishaProtocolDecoder.java b/src/org/traccar/protocol/DishaProtocolDecoder.java deleted file mode 100644 index ab0a63215..000000000 --- a/src/org/traccar/protocol/DishaProtocolDecoder.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2015 - 2016 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class DishaProtocolDecoder extends BaseProtocolDecoder { - - public DishaProtocolDecoder(DishaProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$A#A#") - .number("(d+)#") // imei - .expression("([AVMX])#") // validity - .number("(dd)(dd)(dd)#") // time (hhmmss) - .number("(dd)(dd)(dd)#") // date (ddmmyy) - .number("(dd)(dd.d+)#") // latitude - .expression("([NS])#") - .number("(ddd)(dd.d+)#") // longitude - .expression("([EW])#") - .number("(d+.d+)#") // speed - .number("(d+.d+)#") // course - .number("(d+)#") // satellites - .number("(d+.d+)#") // hdop - .number("(d+)#") // gsm - .expression("([012])#") // power mode - .number("(d+)#") // battery - .number("(d+)#") // adc 1 - .number("(d+)#") // adc 2 - .number("d+.d+#") // day distance - .number("(d+.d+)#") // odometer - .expression("([01]+)") // digital inputs - .text("*") - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(parser.next().equals("A")); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY)); - - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_SATELLITES, parser.nextInt()); - position.set(Position.KEY_HDOP, parser.nextDouble()); - position.set(Position.KEY_RSSI, parser.nextDouble()); - position.set(Position.KEY_CHARGE, parser.nextInt(0) == 2); - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt(0)); - - position.set(Position.PREFIX_ADC + 1, parser.nextInt(0)); - position.set(Position.PREFIX_ADC + 2, parser.nextInt(0)); - - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - position.set(Position.KEY_INPUT, parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/DmtHttpProtocol.java b/src/org/traccar/protocol/DmtHttpProtocol.java deleted file mode 100644 index 2378441ba..000000000 --- a/src/org/traccar/protocol/DmtHttpProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.http.HttpChunkAggregator; -import org.jboss.netty.handler.codec.http.HttpRequestDecoder; -import org.jboss.netty.handler.codec.http.HttpResponseEncoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class DmtHttpProtocol extends BaseProtocol { - - public DmtHttpProtocol() { - super("dmthttp"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("httpEncoder", new HttpResponseEncoder()); - pipeline.addLast("httpDecoder", new HttpRequestDecoder()); - pipeline.addLast("httpAggregator", new HttpChunkAggregator(65535)); - pipeline.addLast("objectDecoder", new DmtHttpProtocolDecoder(DmtHttpProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/DmtHttpProtocolDecoder.java b/src/org/traccar/protocol/DmtHttpProtocolDecoder.java deleted file mode 100644 index 1bd808a1f..000000000 --- a/src/org/traccar/protocol/DmtHttpProtocolDecoder.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 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.jboss.netty.handler.codec.http.DefaultHttpResponse; -import org.jboss.netty.handler.codec.http.HttpHeaders; -import org.jboss.netty.handler.codec.http.HttpRequest; -import org.jboss.netty.handler.codec.http.HttpResponse; -import org.jboss.netty.handler.codec.http.HttpResponseStatus; -import org.jboss.netty.handler.codec.http.HttpVersion; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import java.io.StringReader; -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.LinkedList; -import java.util.List; -import java.util.TimeZone; - -public class DmtHttpProtocolDecoder extends BaseProtocolDecoder { - - public DmtHttpProtocolDecoder(DmtHttpProtocol protocol) { - super(protocol); - } - - private void sendResponse(Channel channel, HttpResponseStatus status) { - if (channel != null) { - HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, status); - response.headers().add(HttpHeaders.Names.CONTENT_LENGTH, 0); - channel.write(response); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - HttpRequest request = (HttpRequest) msg; - JsonObject root = Json.createReader( - new StringReader(request.getContent().toString(StandardCharsets.US_ASCII))).readObject(); - - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, root.getString("IMEI")); - if (deviceSession == null) { - sendResponse(channel, HttpResponseStatus.BAD_REQUEST); - return null; - } - - List<Position> positions = new LinkedList<>(); - - JsonArray records = root.getJsonArray("Records"); - - for (int i = 0; i < records.size(); i++) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - JsonObject record = records.getJsonObject(i); - - position.set(Position.KEY_INDEX, record.getInt("SeqNo")); - position.set(Position.KEY_EVENT, record.getInt("Reason")); - - position.setDeviceTime(dateFormat.parse(record.getString("DateUTC"))); - - JsonArray fields = record.getJsonArray("Fields"); - - for (int j = 0; j < fields.size(); j++) { - JsonObject field = fields.getJsonObject(j); - switch (field.getInt("FType")) { - case 0: - position.setFixTime(dateFormat.parse(field.getString("GpsUTC"))); - position.setLatitude(field.getJsonNumber("Lat").doubleValue()); - position.setLongitude(field.getJsonNumber("Long").doubleValue()); - position.setAltitude(field.getInt("Alt")); - position.setSpeed(UnitsConverter.knotsFromCps(field.getInt("Spd"))); - position.setCourse(field.getInt("Head")); - position.setAccuracy(field.getInt("PosAcc")); - position.setValid(field.getInt("GpsStat") > 0); - break; - case 2: - int input = field.getInt("DIn"); - int output = field.getInt("DOut"); - - position.set(Position.KEY_IGNITION, BitUtil.check(input, 0)); - - position.set(Position.KEY_INPUT, input); - position.set(Position.KEY_OUTPUT, output); - position.set(Position.KEY_STATUS, field.getInt("DevStat")); - break; - case 6: - JsonObject adc = field.getJsonObject("AnalogueData"); - if (adc.containsKey("1")) { - position.set(Position.KEY_BATTERY, adc.getInt("1") * 0.001); - } - if (adc.containsKey("2")) { - position.set(Position.KEY_POWER, adc.getInt("2") * 0.01); - } - if (adc.containsKey("3")) { - position.set(Position.KEY_DEVICE_TEMP, adc.getInt("3") * 0.01); - } - if (adc.containsKey("4")) { - position.set(Position.KEY_RSSI, adc.getInt("4")); - } - if (adc.containsKey("5")) { - position.set("solarPower", adc.getInt("5") * 0.001); - } - break; - default: - break; - } - } - - positions.add(position); - } - - sendResponse(channel, HttpResponseStatus.OK); - return positions; - } - -} diff --git a/src/org/traccar/protocol/DmtProtocol.java b/src/org/traccar/protocol/DmtProtocol.java deleted file mode 100644 index 18bb1524a..000000000 --- a/src/org/traccar/protocol/DmtProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class DmtProtocol extends BaseProtocol { - - public DmtProtocol() { - super("dmt"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 3, 2)); - pipeline.addLast("objectDecoder", new DmtProtocolDecoder(DmtProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/DmtProtocolDecoder.java b/src/org/traccar/protocol/DmtProtocolDecoder.java deleted file mode 100644 index 39462a469..000000000 --- a/src/org/traccar/protocol/DmtProtocolDecoder.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class DmtProtocolDecoder extends BaseProtocolDecoder { - - public DmtProtocolDecoder(DmtProtocol protocol) { - super(protocol); - } - - public static final int MSG_HELLO = 0x00; - public static final int MSG_HELLO_RESPONSE = 0x01; - public static final int MSG_DATA_RECORD = 0x04; - public static final int MSG_COMMIT = 0x05; - public static final int MSG_COMMIT_RESPONSE = 0x06; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - - int type = buf.readUnsignedByte(); - - buf.readUnsignedShort(); // length - - if (type == MSG_HELLO) { - - buf.readUnsignedInt(); // device serial number - - DeviceSession deviceSession = getDeviceSession( - channel, remoteAddress, buf.readBytes(15).toString(StandardCharsets.US_ASCII)); - - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 0); - response.writeByte(0x02); response.writeByte(0x55); // header - response.writeByte(MSG_HELLO_RESPONSE); - response.writeShort(4 + 4); - response.writeInt((int) (System.currentTimeMillis() / 1000)); - response.writeInt(deviceSession != null ? 0 : 1); // flags - channel.write(response); - } - - } else if (type == MSG_COMMIT) { - - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 0); - response.writeByte(0x02); response.writeByte(0x55); // header - response.writeByte(MSG_COMMIT_RESPONSE); - response.writeShort(1); - response.writeByte(1); // flags (success) - channel.write(response); - } - - } else if (type == MSG_DATA_RECORD) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - List<Position> positions = new LinkedList<>(); - - while (buf.readable()) { - - int recordEnd = buf.readerIndex() + buf.readUnsignedShort(); - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_INDEX, buf.readUnsignedInt()); - - position.setDeviceTime(new Date(1356998400000L + buf.readUnsignedInt() * 1000)); // since 1 Jan 2013 - - position.set(Position.KEY_EVENT, buf.readUnsignedByte()); - - while (buf.readerIndex() < recordEnd) { - - int fieldId = buf.readUnsignedByte(); - int fieldLength = buf.readUnsignedByte(); - int fieldEnd = buf.readerIndex() + (fieldLength == 255 ? buf.readUnsignedShort() : fieldLength); - - if (fieldId == 0) { - - position.setFixTime(new Date(1356998400000L + buf.readUnsignedInt() * 1000)); - position.setLatitude(buf.readInt() * 0.0000001); - position.setLongitude(buf.readInt() * 0.0000001); - position.setAltitude(buf.readShort()); - position.setSpeed(UnitsConverter.knotsFromCps(buf.readUnsignedShort())); - - buf.readUnsignedByte(); // speed accuracy - - position.setCourse(buf.readUnsignedByte() * 2); - - position.set(Position.KEY_PDOP, buf.readUnsignedByte() * 0.1); - - position.setAccuracy(buf.readUnsignedByte()); - position.setValid(buf.readUnsignedByte() != 0); - - } else if (fieldId == 2) { - - int input = buf.readInt(); - int output = buf.readUnsignedShort(); - int status = buf.readUnsignedShort(); - - position.set(Position.KEY_IGNITION, BitUtil.check(input, 0)); - - position.set(Position.KEY_INPUT, input); - position.set(Position.KEY_OUTPUT, output); - position.set(Position.KEY_STATUS, status); - - } else if (fieldId == 6) { - - while (buf.readerIndex() < fieldEnd) { - switch (buf.readUnsignedByte()) { - case 1: - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - break; - case 2: - position.set(Position.KEY_POWER, buf.readUnsignedShort() * 0.01); - break; - case 3: - position.set(Position.KEY_DEVICE_TEMP, buf.readShort() * 0.01); - break; - case 4: - position.set(Position.KEY_RSSI, buf.readUnsignedShort()); - break; - case 5: - position.set("solarPower", buf.readUnsignedShort() * 0.001); - break; - default: - break; - } - } - - } - - buf.readerIndex(fieldEnd); - - } - - if (position.getFixTime() == null) { - getLastLocation(position, position.getDeviceTime()); - } - - positions.add(position); - - } - - return positions; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/DwayProtocol.java b/src/org/traccar/protocol/DwayProtocol.java deleted file mode 100644 index 151d3fe01..000000000 --- a/src/org/traccar/protocol/DwayProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class DwayProtocol extends BaseProtocol { - - public DwayProtocol() { - super("dway"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new DwayProtocolDecoder(DwayProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/DwayProtocolDecoder.java b/src/org/traccar/protocol/DwayProtocolDecoder.java deleted file mode 100644 index 767b35c72..000000000 --- a/src/org/traccar/protocol/DwayProtocolDecoder.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 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.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 DwayProtocolDecoder extends BaseProtocolDecoder { - - public DwayProtocolDecoder(DwayProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("AA55,") - .number("d+,") // index - .number("(d+),") // imei - .number("d+,") // type - .number("(dd)(dd)(dd),") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(-?d+),") // altitude - .number(" ?(d+.d+),") // speed - .number("(d+),") // course - .number("([01]{4}),") // input - .number("([01]{4}),") // output - .number("([01]+),") // flags - .number("(d+),") // battery - .number("(d+),") // adc1 - .number("(d+),") // adc2 - .number("(d+)") // driver - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - if (sentence.startsWith(">H")) { - if (channel != null) { - channel.write(">ALIVE\r\n"); - } - return null; - } - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(true); - position.setTime(parser.nextDateTime()); - position.setLatitude(parser.nextDouble()); - position.setLongitude(parser.nextDouble()); - position.setAltitude(parser.nextDouble(0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_INPUT, parser.nextBinInt()); - position.set(Position.KEY_OUTPUT, parser.nextBinInt()); - - position.set(Position.KEY_BATTERY, parser.nextInt() * 0.001); - position.set(Position.PREFIX_ADC + 1, parser.nextInt() * 0.001); - position.set(Position.PREFIX_ADC + 2, parser.nextInt() * 0.001); - position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/EasyTrackProtocol.java b/src/org/traccar/protocol/EasyTrackProtocol.java deleted file mode 100644 index eeed07129..000000000 --- a/src/org/traccar/protocol/EasyTrackProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2015 - 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class EasyTrackProtocol extends BaseProtocol { - - public EasyTrackProtocol() { - super("easytrack"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "#", "\r\n")); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new EasyTrackProtocolDecoder(EasyTrackProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/EasyTrackProtocolDecoder.java b/src/org/traccar/protocol/EasyTrackProtocolDecoder.java deleted file mode 100644 index 799254b65..000000000 --- a/src/org/traccar/protocol/EasyTrackProtocolDecoder.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * 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.helper.BitUtil; -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 EasyTrackProtocolDecoder extends BaseProtocolDecoder { - - public EasyTrackProtocolDecoder(EasyTrackProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("*").expression("..,") // manufacturer - .number("(d+),") // imei - .expression("([^,]{2}),") // command - .expression("([AV]),") // validity - .number("(xx)(xx)(xx),") // date (yymmdd) - .number("(xx)(xx)(xx),") // time (hhmmss) - .number("(x)(x{7}),") // latitude - .number("(x)(x{7}),") // longitude - .number("(x{4}),") // speed - .number("(x{4}),") // course - .number("(x{8}),") // status - .number("(x+),") // signal - .number("(d+),") // power - .number("(x{4}),") // oil - .number("(x+),?") // odometer - .number("(d+)?") // altitude - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_COMMAND, parser.next()); - - position.setValid(parser.next().equals("A")); - - DateBuilder dateBuilder = new DateBuilder() - .setDate(parser.nextHexInt(0), parser.nextHexInt(0), parser.nextHexInt(0)) - .setTime(parser.nextHexInt(0), parser.nextHexInt(0), parser.nextHexInt(0)); - position.setTime(dateBuilder.getDate()); - - if (BitUtil.check(parser.nextHexInt(0), 3)) { - position.setLatitude(-parser.nextHexInt(0) / 600000.0); - } else { - position.setLatitude(parser.nextHexInt(0) / 600000.0); - } - - if (BitUtil.check(parser.nextHexInt(0), 3)) { - position.setLongitude(-parser.nextHexInt(0) / 600000.0); - } else { - position.setLongitude(parser.nextHexInt(0) / 600000.0); - } - - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextHexInt(0) / 100.0)); - position.setCourse(parser.nextHexInt(0) / 100.0); - - position.set(Position.KEY_STATUS, parser.next()); - position.set("signal", parser.next()); - position.set(Position.KEY_POWER, parser.nextDouble(0)); - position.set("oil", parser.nextHexInt(0)); - position.set(Position.KEY_ODOMETER, parser.nextHexInt(0) * 100); - - position.setAltitude(parser.nextDouble(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/EelinkProtocol.java b/src/org/traccar/protocol/EelinkProtocol.java deleted file mode 100644 index 5499094d9..000000000 --- a/src/org/traccar/protocol/EelinkProtocol.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2015 - 2016 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class EelinkProtocol extends BaseProtocol { - - public EelinkProtocol() { - super("eelink"); - setSupportedDataCommands( - Command.TYPE_CUSTOM, - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME, - Command.TYPE_REBOOT_DEVICE); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 3, 2)); - pipeline.addLast("objectEncoder", new EelinkProtocolEncoder()); - pipeline.addLast("objectDecoder", new EelinkProtocolDecoder(EelinkProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/EelinkProtocolDecoder.java b/src/org/traccar/protocol/EelinkProtocolDecoder.java deleted file mode 100644 index 8d0f8016a..000000000 --- a/src/org/traccar/protocol/EelinkProtocolDecoder.java +++ /dev/null @@ -1,311 +0,0 @@ -/* - * Copyright 2014 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.Date; - -public class EelinkProtocolDecoder extends BaseProtocolDecoder { - - public EelinkProtocolDecoder(EelinkProtocol protocol) { - super(protocol); - } - - public static final int MSG_LOGIN = 0x01; - public static final int MSG_GPS = 0x02; - public static final int MSG_HEARTBEAT = 0x03; - public static final int MSG_ALARM = 0x04; - public static final int MSG_STATE = 0x05; - public static final int MSG_SMS = 0x06; - public static final int MSG_OBD = 0x07; - public static final int MSG_DOWNLINK = 0x80; - public static final int MSG_DATA = 0x81; - - public static final int MSG_NORMAL = 0x12; - public static final int MSG_WARNING = 0x14; - public static final int MSG_REPORT = 0x15; - public static final int MSG_COMMAND = 0x16; - public static final int MSG_OBD_DATA = 0x17; - public static final int MSG_OBD_BODY = 0x18; - public static final int MSG_OBD_CODE = 0x19; - public static final int MSG_CAMERA_INFO = 0x1E; - public static final int MSG_CAMERA_DATA = 0x1F; - - private void sendResponse(Channel channel, int type, int index) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.buffer(7); - response.writeByte(0x67); response.writeByte(0x67); // header - response.writeByte(type); - response.writeShort(2); // length - response.writeShort(index); - channel.write(response); - } - } - - private String decodeAlarm(Short value) { - switch (value) { - case 0x01: - return Position.ALARM_POWER_OFF; - case 0x02: - return Position.ALARM_SOS; - case 0x03: - return Position.ALARM_LOW_BATTERY; - case 0x04: - return Position.ALARM_VIBRATION; - case 0x08: - case 0x09: - return Position.ALARM_GPS_ANTENNA_CUT; - case 0x81: - return Position.ALARM_LOW_SPEED; - case 0x82: - return Position.ALARM_OVERSPEED; - case 0x83: - return Position.ALARM_GEOFENCE_ENTER; - case 0x84: - return Position.ALARM_GEOFENCE_EXIT; - case 0x85: - return Position.ALARM_ACCIDENT; - case 0x86: - return Position.ALARM_FALL_DOWN; - default: - return null; - } - } - - private void decodeStatus(Position position, int status) { - if (BitUtil.check(status, 1)) { - position.set(Position.KEY_IGNITION, BitUtil.check(status, 2)); - } - if (BitUtil.check(status, 3)) { - position.set(Position.KEY_ARMED, BitUtil.check(status, 4)); - } - if (BitUtil.check(status, 5)) { - position.set(Position.KEY_BLOCKED, !BitUtil.check(status, 6)); - } - if (BitUtil.check(status, 7)) { - position.set(Position.KEY_CHARGE, BitUtil.check(status, 8)); - } - position.set(Position.KEY_STATUS, status); - } - - private Position decodeOld(DeviceSession deviceSession, ChannelBuffer buf, int type, int index) { - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - position.set(Position.KEY_INDEX, index); - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - position.setLatitude(buf.readInt() / 1800000.0); - position.setLongitude(buf.readInt() / 1800000.0); - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - position.setCourse(buf.readUnsignedShort()); - - position.setNetwork(new Network(CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedShort(), buf.readUnsignedShort(), buf.readUnsignedMedium()))); - - position.setValid((buf.readUnsignedByte() & 0x01) != 0); - - if (type == MSG_GPS) { - - if (buf.readableBytes() >= 2) { - decodeStatus(position, buf.readUnsignedShort()); - } - - if (buf.readableBytes() >= 2 * 4) { - - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - - position.set(Position.KEY_RSSI, buf.readUnsignedShort()); - - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 2, buf.readUnsignedShort()); - - } - - } else if (type == MSG_ALARM) { - - position.set(Position.KEY_ALARM, decodeAlarm(buf.readUnsignedByte())); - - } else if (type == MSG_STATE) { - - int statusType = buf.readUnsignedByte(); - - position.set(Position.KEY_EVENT, statusType); - - if (statusType == 0x01 || statusType == 0x02 || statusType == 0x03) { - buf.readUnsignedInt(); // device time - if (buf.readableBytes() >= 2) { - decodeStatus(position, buf.readUnsignedShort()); - } - } - - } - - return position; - } - - private Position decodeNew(DeviceSession deviceSession, ChannelBuffer buf, int index) { - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - position.set(Position.KEY_INDEX, index); - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - - int flags = buf.readUnsignedByte(); - - if (BitUtil.check(flags, 0)) { - position.setLatitude(buf.readInt() / 1800000.0); - position.setLongitude(buf.readInt() / 1800000.0); - position.setAltitude(buf.readShort()); - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort())); - position.setCourse(buf.readUnsignedShort()); - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - } - - if (BitUtil.check(flags, 1)) { - position.setNetwork(new Network(CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedShort(), - buf.readUnsignedShort(), buf.readUnsignedInt(), buf.readUnsignedByte()))); - } - - if (BitUtil.check(flags, 2)) { - buf.skipBytes(7); // bsid1 - } - - if (BitUtil.check(flags, 3)) { - buf.skipBytes(7); // bsid2 - } - - if (BitUtil.check(flags, 4)) { - buf.skipBytes(7); // bss0 - } - - if (BitUtil.check(flags, 5)) { - buf.skipBytes(7); // bss1 - } - - if (BitUtil.check(flags, 6)) { - buf.skipBytes(7); // bss2 - } - - if (buf.readableBytes() >= 2) { - int status = buf.readUnsignedShort(); - position.setValid(BitUtil.check(status, 0)); - if (BitUtil.check(status, 1)) { - position.set(Position.KEY_IGNITION, BitUtil.check(status, 2)); - } - position.set(Position.KEY_STATUS, status); - } - - if (buf.readableBytes() >= 2) { - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - } - - if (buf.readableBytes() >= 4) { - position.set(Position.PREFIX_ADC + 0, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort()); - } - - if (buf.readableBytes() >= 4) { - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - } - - if (buf.readableBytes() >= 4) { - buf.readUnsignedShort(); // gsm counter - buf.readUnsignedShort(); // gps counter - } - - if (buf.readableBytes() >= 4) { - position.set(Position.KEY_STEPS, buf.readUnsignedShort()); - buf.readUnsignedShort(); // walking time - } - - if (buf.readableBytes() >= 12) { - position.set(Position.PREFIX_TEMP + 1, buf.readUnsignedShort() / 256.0); - position.set("humidity", buf.readUnsignedShort() * 0.1); - position.set("illuminance", buf.readUnsignedInt() / 256.0); - position.set("co2", buf.readUnsignedInt()); - } - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - int type = buf.readUnsignedByte(); - buf.readShort(); // length - int index = buf.readUnsignedShort(); - - if (type != MSG_GPS && type != MSG_DATA) { - sendResponse(channel, type, index); - } - - if (type == MSG_LOGIN) { - - getDeviceSession(channel, remoteAddress, ChannelBuffers.hexDump(buf.readBytes(8)).substring(1)); - - } else { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - if (type == MSG_GPS || type == MSG_ALARM || type == MSG_STATE || type == MSG_SMS) { - return decodeOld(deviceSession, buf, type, index); - } else if (type >= MSG_NORMAL && type <= MSG_OBD_CODE) { - return decodeNew(deviceSession, buf, index); - } else if (type == MSG_HEARTBEAT && buf.readableBytes() >= 2) { - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - getLastLocation(position, null); - - decodeStatus(position, buf.readUnsignedShort()); - - return position; - - } - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/EelinkProtocolEncoder.java b/src/org/traccar/protocol/EelinkProtocolEncoder.java deleted file mode 100644 index 5a28733f7..000000000 --- a/src/org/traccar/protocol/EelinkProtocolEncoder.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import java.nio.charset.StandardCharsets; - -public class EelinkProtocolEncoder extends BaseProtocolEncoder { - - private ChannelBuffer encodeContent(String content) { - - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); - - buf.writeByte(0x67); - buf.writeByte(0x67); - buf.writeByte(EelinkProtocolDecoder.MSG_DOWNLINK); - buf.writeShort(2 + 1 + 4 + content.length()); // length - buf.writeShort(0); // index - - buf.writeByte(0x01); // command - buf.writeInt(0); // server id - buf.writeBytes(content.getBytes(StandardCharsets.UTF_8)); - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_CUSTOM: - return encodeContent(command.getString(Command.KEY_DATA)); - case Command.TYPE_ENGINE_STOP: - return encodeContent("RELAY,1#"); - case Command.TYPE_ENGINE_RESUME: - return encodeContent("RELAY,0#"); - case Command.TYPE_REBOOT_DEVICE: - return encodeContent("RESET#"); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/EnforaProtocol.java b/src/org/traccar/protocol/EnforaProtocol.java deleted file mode 100644 index 79cc47c0b..000000000 --- a/src/org/traccar/protocol/EnforaProtocol.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class EnforaProtocol extends BaseProtocol { - - public EnforaProtocol() { - super("enfora"); - setSupportedDataCommands( - Command.TYPE_CUSTOM, - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 0, 2, -2, 2)); - pipeline.addLast("objectEncoder", new EnforaProtocolEncoder()); - pipeline.addLast("objectDecoder", new EnforaProtocolDecoder(EnforaProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/EnforaProtocolDecoder.java b/src/org/traccar/protocol/EnforaProtocolDecoder.java deleted file mode 100644 index f0b79aa1f..000000000 --- a/src/org/traccar/protocol/EnforaProtocolDecoder.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2012 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBufferIndexFinder; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.StringFinder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.regex.Pattern; - -public class EnforaProtocolDecoder extends BaseProtocolDecoder { - - public EnforaProtocolDecoder(EnforaProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("GPRMC,") - .number("(dd)(dd)(dd).?d*,") // time (hhmmss) - .expression("([AV]),") // validity - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.d+)?,") // speed - .number("(d+.d+)?,") // course - .number("(dd)(dd)(dd),") // date (ddmmyy) - .any() - .compile(); - - public static final int IMEI_LENGTH = 15; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - // Find IMEI number - int index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new ChannelBufferIndexFinder() { - @Override - public boolean find(ChannelBuffer buffer, int guessedIndex) { - if (buffer.writerIndex() - guessedIndex >= IMEI_LENGTH) { - for (int i = 0; i < IMEI_LENGTH; i++) { - if (!Character.isDigit((char) buffer.getByte(guessedIndex + i))) { - return false; - } - } - return true; - } - return false; - } - }); - if (index == -1) { - return null; - } - - String imei = buf.toString(index, IMEI_LENGTH, StandardCharsets.US_ASCII); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - - // Find NMEA sentence - int start = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new StringFinder("GPRMC")); - if (start == -1) { - return null; - } - - String sentence = buf.toString(start, buf.readableBytes() - start, StandardCharsets.US_ASCII); - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/EnforaProtocolEncoder.java b/src/org/traccar/protocol/EnforaProtocolEncoder.java deleted file mode 100644 index 3dca1b9b3..000000000 --- a/src/org/traccar/protocol/EnforaProtocolEncoder.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2017 Anton Tananaev (anton@traccar.org) - * Copyright 2017 Jose Castellanos - * - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import java.nio.charset.StandardCharsets; - -public class EnforaProtocolEncoder extends StringProtocolEncoder { - - private ChannelBuffer encodeContent(String content) { - - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); - - buf.writeShort(content.length() + 6); - buf.writeShort(0); // index - buf.writeByte(0x04); // command type - buf.writeByte(0); // optional header - buf.writeBytes(content.getBytes(StandardCharsets.US_ASCII)); - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - switch (command.getType()) { - case Command.TYPE_CUSTOM: - return encodeContent(command.getString(Command.KEY_DATA)); - case Command.TYPE_ENGINE_STOP: - return encodeContent("AT$IOGP3=1"); - case Command.TYPE_ENGINE_RESUME: - return encodeContent("AT$IOGP3=0"); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/EskyFrameDecoder.java b/src/org/traccar/protocol/EskyFrameDecoder.java deleted file mode 100644 index 3175698fd..000000000 --- a/src/org/traccar/protocol/EskyFrameDecoder.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class EskyFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - buf.readerIndex(buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) 'E')); - - int endIndex = buf.indexOf(buf.readerIndex() + 1, buf.writerIndex(), (byte) 'E'); - if (endIndex > 0) { - return buf.readBytes(endIndex - buf.readerIndex()); - } else { - return buf.readBytes(buf.readableBytes()); // assume full frame - } - } - -} diff --git a/src/org/traccar/protocol/EskyProtocol.java b/src/org/traccar/protocol/EskyProtocol.java deleted file mode 100644 index 4c1d11f7d..000000000 --- a/src/org/traccar/protocol/EskyProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 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.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 java.util.List; - -public class EskyProtocol extends BaseProtocol { - - public EskyProtocol() { - super("esky"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new EskyFrameDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new EskyProtocolDecoder(EskyProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/EskyProtocolDecoder.java b/src/org/traccar/protocol/EskyProtocolDecoder.java deleted file mode 100644 index d524224af..000000000 --- a/src/org/traccar/protocol/EskyProtocolDecoder.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 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.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 EskyProtocolDecoder extends BaseProtocolDecoder { - - public EskyProtocolDecoder(EskyProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("EO;") // header - .number("d+;") // index - .number("(d+);") // imei - .text("R;") // data type - .number("(d+)").text("+") // satellites - .number("(dd)(dd)(dd)") // date - .number("(dd)(dd)(dd)").text("+") // time - .number("(-?d+.d+)").text("+") // latitude - .number("(-?d+.d+)").text("+") // longitude - .number("(d+.d+)").text("+") // speed - .number("(d+)").text("+") // course - .text("0x").number("(d+)").text("+") // input - .number("(d+)").text("+") // message type - .number("(d+)").text("+") // odometer - .number("(d+)") // voltage - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_SATELLITES, parser.nextInt()); - - position.setValid(true); - position.setTime(parser.nextDateTime()); - position.setLatitude(parser.nextDouble()); - position.setLongitude(parser.nextDouble()); - position.setSpeed(UnitsConverter.knotsFromMps(parser.nextDouble())); - position.setCourse(parser.nextDouble()); - - position.set(Position.KEY_INPUT, parser.nextHexInt()); - position.set(Position.KEY_EVENT, parser.nextInt()); - position.set(Position.KEY_ODOMETER, parser.nextInt()); - position.set(Position.KEY_POWER, parser.nextInt()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/ExtremTracProtocol.java b/src/org/traccar/protocol/ExtremTracProtocol.java deleted file mode 100644 index d9b178e23..000000000 --- a/src/org/traccar/protocol/ExtremTracProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class ExtremTracProtocol extends BaseProtocol { - - public ExtremTracProtocol() { - super("extremtrac"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new ExtremTracProtocolDecoder(ExtremTracProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/ExtremTracProtocolDecoder.java b/src/org/traccar/protocol/ExtremTracProtocolDecoder.java deleted file mode 100644 index 79e3306df..000000000 --- a/src/org/traccar/protocol/ExtremTracProtocolDecoder.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2016 - 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class ExtremTracProtocolDecoder extends BaseProtocolDecoder { - - public ExtremTracProtocolDecoder(ExtremTracProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$GPRMC,") - .number("(d+),") // device id - .number("(dd)(dd)(dd).(ddd),") // time (hhmmss.sss) - .expression("([AV]),") // validity - .number("(d+)(dd.d+),") // latitude - .expression("([NS]),") - .number("(d+)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*),") // speed - .number("(d+.?d*),") // course - .number("(dd)(dd)(dd),") // date (ddmmyy) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/FifotrackProtocol.java b/src/org/traccar/protocol/FifotrackProtocol.java deleted file mode 100644 index f4ca450c0..000000000 --- a/src/org/traccar/protocol/FifotrackProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2016 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.frame.LineBasedFrameDecoder; -import org.jboss.netty.handler.codec.string.StringDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class FifotrackProtocol extends BaseProtocol { - - public FifotrackProtocol() { - super("fifotrack"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new FifotrackProtocolDecoder(FifotrackProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/FifotrackProtocolDecoder.java b/src/org/traccar/protocol/FifotrackProtocolDecoder.java deleted file mode 100644 index 304f6a2c3..000000000 --- a/src/org/traccar/protocol/FifotrackProtocolDecoder.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2016 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class FifotrackProtocolDecoder extends BaseProtocolDecoder { - - public FifotrackProtocolDecoder(FifotrackProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$$") - .number("d+,") // length - .number("(d+),") // imei - .number("x+,") // index - .expression("[^,]+,") // type - .number("(d+)?,") // alarm - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("([AV]),") // validity - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(d+),") // speed - .number("(d+),") // course - .number("(-?d+),") // altitude - .number("(d+),") // odometer - .number("d+,") // runtime - .number("(xxxx),") // status - .number("(x+)?,") // input - .number("(x+)?,") // output - .number("(d+)|") // mcc - .number("(d+)|") // mnc - .number("(x+)|") // lac - .number("(x+),") // cid - .number("([x|]+)") // adc - .expression(",([^,]+)") // rfid - .expression(",([^*]+)").optional(2) // sensors - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_ALARM, parser.next()); - - position.setTime(parser.nextDateTime()); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextInt(0))); - position.setCourse(parser.nextInt(0)); - position.setAltitude(parser.nextInt(0)); - - position.set(Position.KEY_ODOMETER, parser.nextLong(0)); - position.set(Position.KEY_STATUS, parser.nextHexInt(0)); - if (parser.hasNext()) { - position.set(Position.KEY_INPUT, parser.nextHexInt(0)); - } - if (parser.hasNext()) { - position.set(Position.KEY_OUTPUT, parser.nextHexInt(0)); - } - - position.setNetwork(new Network(CellTower.from( - parser.nextInt(0), parser.nextInt(0), parser.nextHexInt(0), parser.nextHexInt(0)))); - - 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)); - } - - position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next()); - - if (parser.hasNext()) { - String[] sensors = parser.next().split("\\|"); - for (int i = 0; i < sensors.length; i++) { - position.set(Position.PREFIX_IO + (i + 1), sensors[i]); - } - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/FlespiProtocol.java b/src/org/traccar/protocol/FlespiProtocol.java deleted file mode 100644 index d22bd7ae0..000000000 --- a/src/org/traccar/protocol/FlespiProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.http.HttpChunkAggregator; -import org.jboss.netty.handler.codec.http.HttpRequestDecoder; -import org.jboss.netty.handler.codec.http.HttpResponseEncoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class FlespiProtocol extends BaseProtocol { - - public FlespiProtocol() { - super("flespi"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("httpEncoder", new HttpResponseEncoder()); - pipeline.addLast("httpDecoder", new HttpRequestDecoder()); - pipeline.addLast("httpAggregator", new HttpChunkAggregator(Integer.MAX_VALUE)); - pipeline.addLast("objectDecoder", new FlespiProtocolDecoder(FlespiProtocol.this)); - } - }); - } -} diff --git a/src/org/traccar/protocol/FlespiProtocolDecoder.java b/src/org/traccar/protocol/FlespiProtocolDecoder.java deleted file mode 100644 index 799d78ecb..000000000 --- a/src/org/traccar/protocol/FlespiProtocolDecoder.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 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.jboss.netty.handler.codec.http.DefaultHttpResponse; -import org.jboss.netty.handler.codec.http.HttpRequest; -import org.jboss.netty.handler.codec.http.HttpResponse; -import org.jboss.netty.handler.codec.http.HttpResponseStatus; -import org.jboss.netty.handler.codec.http.HttpVersion; -import org.jboss.netty.handler.codec.http.HttpHeaders; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.model.Position; - -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonString; -import java.io.StringReader; -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.LinkedList; -import java.util.Date; - -public class FlespiProtocolDecoder extends BaseProtocolDecoder { - - public FlespiProtocolDecoder(FlespiProtocol protocol) { - super(protocol); - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - HttpRequest request = (HttpRequest) msg; - JsonArray result = Json.createReader(new StringReader(request.getContent().toString(StandardCharsets.UTF_8))) - .readArray(); - List<Position> positions = new LinkedList<>(); - for (int i = 0; i < result.size(); i++) { - JsonObject message = result.getJsonObject(i); - JsonString ident = message.getJsonString("ident"); - if (ident == null) { - continue; - } - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, ident.getString()); - if (deviceSession == null) { - continue; - } - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - decodePosition(message, position); - positions.add(position); - } - - sendResponse(channel, HttpResponseStatus.OK); - return positions; - } - - private void sendResponse(Channel channel, HttpResponseStatus status) { - if (channel != null) { - HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, status); - response.headers().add(HttpHeaders.Names.CONTENT_LENGTH, 0); - channel.write(response); - } - } - - private void decodePosition(JsonObject object, Position position) { - position.setProtocol(getProtocolName()); - - Date deviceTime = new Date((long) object.getJsonNumber("timestamp").doubleValue() * 1000); - position.setTime(deviceTime); - JsonNumber lat = object.getJsonNumber("position.latitude"); - JsonNumber lon = object.getJsonNumber("position.longitude"); - if (lat != null && lon != null) { - position.setLatitude(lat.doubleValue()); - position.setLongitude(lon.doubleValue()); - } else { - getLastLocation(position, deviceTime); - } - JsonNumber speed = object.getJsonNumber("position.speed"); - if (speed != null) { - position.setSpeed(speed.doubleValue()); - } - JsonNumber course = object.getJsonNumber("position.direction"); - if (course != null) { - position.setCourse(course.doubleValue()); - } - JsonNumber altitude = object.getJsonNumber("position.altitude"); - if (altitude != null) { - position.setAltitude(altitude.doubleValue()); - } - - position.setValid(object.getBoolean("position.valid", true)); - position.set(Position.KEY_SATELLITES, object.getInt("position.satellites", 0)); - - if (object.getBoolean("alarm.event.trigger", false)) { - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - } - } -} diff --git a/src/org/traccar/protocol/FlexCommProtocol.java b/src/org/traccar/protocol/FlexCommProtocol.java deleted file mode 100644 index 5dba4421a..000000000 --- a/src/org/traccar/protocol/FlexCommProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.FixedLengthFrameDecoder; -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 java.util.List; - -public class FlexCommProtocol extends BaseProtocol { - - public FlexCommProtocol() { - super("flexcomm"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new FixedLengthFrameDecoder(2 + 2 + 101 + 5)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new FlexCommProtocolDecoder(FlexCommProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/FlexCommProtocolDecoder.java b/src/org/traccar/protocol/FlexCommProtocolDecoder.java deleted file mode 100644 index f401145b9..000000000 --- a/src/org/traccar/protocol/FlexCommProtocolDecoder.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class FlexCommProtocolDecoder extends BaseProtocolDecoder { - - public FlexCommProtocolDecoder(FlexCommProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("7E") - .number("(dd)") // status - .number("(d{15})") // imei - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)") // time (hhmmss) - .expression("([01])") // valid - .number("(d{9})") // latitude - .number("(d{10})") // longitude - .number("(d{4})") // altitude - .number("(ddd)") // speed - .number("(ddd)") // course - .number("(dd)") // satellites view - .number("(dd)") // satellites used - .number("(dd)") // rssi - .number("(ddd)") // mcc - .number("(ddd)") // mnc - .number("(x{6})") // lac - .number("(x{6})") // cid - .expression("([01])([01])([01])") // input - .expression("([01])([01])") // output - .number("(ddd)") // fuel - .number("(d{4})") // temperature - .number("(ddd)") // battery - .number("(ddd)") // power - .any() - .compile(); - - private static double parseSignedValue(Parser parser, int decimalPoints) { - String stringValue = parser.next(); - boolean negative = stringValue.charAt(0) == '1'; - double value = Integer.parseInt(stringValue.substring(1)) * Math.pow(10, -decimalPoints); - return negative ? -value : value; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.set(Position.KEY_STATUS, parser.nextInt()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime()); - position.setValid(parser.next().equals("1")); - position.setLatitude(parseSignedValue(parser, 6)); - position.setLongitude(parseSignedValue(parser, 6)); - position.setAltitude(parseSignedValue(parser, 0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextInt())); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_SATELLITES_VISIBLE, parser.nextInt()); - position.set(Position.KEY_SATELLITES, parser.nextInt()); - position.set(Position.KEY_RSSI, parser.nextInt()); - - position.setNetwork(new Network(CellTower.from( - parser.nextInt(), parser.nextInt(), parser.nextHexInt(), parser.nextHexInt()))); - - for (int i = 1; i <= 3; i++) { - position.set(Position.PREFIX_IN + i, parser.nextInt()); - } - - for (int i = 1; i <= 2; i++) { - position.set(Position.PREFIX_OUT + i, parser.nextInt()); - } - - position.set(Position.KEY_FUEL_LEVEL, parser.nextInt()); - position.set(Position.PREFIX_TEMP + 1, parseSignedValue(parser, 0)); - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt()); - position.set(Position.KEY_POWER, parser.nextInt() * 0.1); - - if (channel != null) { - channel.write("{01}"); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/FlextrackProtocol.java b/src/org/traccar/protocol/FlextrackProtocol.java deleted file mode 100644 index 77e316d82..000000000 --- a/src/org/traccar/protocol/FlextrackProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class FlextrackProtocol extends BaseProtocol { - - public FlextrackProtocol() { - super("flextrack"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "\r")); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new FlextrackProtocolDecoder(FlextrackProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/FlextrackProtocolDecoder.java b/src/org/traccar/protocol/FlextrackProtocolDecoder.java deleted file mode 100644 index ab2e4d24c..000000000 --- a/src/org/traccar/protocol/FlextrackProtocolDecoder.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class FlextrackProtocolDecoder extends BaseProtocolDecoder { - - public FlextrackProtocolDecoder(FlextrackProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN_LOGON = new PatternBuilder() - .number("(-?d+),") // index - .text("LOGON,") - .number("(d+),") // node id - .number("(d+)") // iccid - .compile(); - - private static final Pattern PATTERN = new PatternBuilder() - .number("(-?d+),") // index - .text("UNITSTAT,") - .number("(dddd)(dd)(dd),") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("d+,") // node id - .number("([NS])(d+).(d+.d+),") // latitude - .number("([EW])(d+).(d+.d+),") // longitude - .number("(d+),") // speed - .number("(d+),") // course - .number("(d+),") // satellites - .number("(d+),") // battery - .number("(-?d+),") // gsm - .number("(x+),") // state - .number("(ddd)") // mcc - .number("(dd),") // mnc - .number("(-?d+),") // altitude - .number("(d+),") // hdop - .number("(x+),") // cell - .number("d+,") // gps fix time - .number("(x+),") // lac - .number("(d+)") // odometer - .compile(); - - private void sendAcknowledgement(Channel channel, String index) { - if (channel != null) { - channel.write(index + ",ACK\r"); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.contains("LOGON")) { - - Parser parser = new Parser(PATTERN_LOGON, sentence); - if (!parser.matches()) { - return null; - } - - sendAcknowledgement(channel, parser.next()); - - String id = parser.next(); - String iccid = parser.next(); - - getDeviceSession(channel, remoteAddress, iccid, id); - - } else if (sentence.contains("UNITSTAT")) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - sendAcknowledgement(channel, parser.next()); - - position.setTime(parser.nextDateTime()); - - position.setValid(true); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextInt(0))); - position.setCourse(parser.nextInt(0)); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - position.set(Position.KEY_BATTERY, parser.nextInt(0)); - int rssi = parser.nextInt(0); - position.set(Position.KEY_STATUS, parser.nextHexInt(0)); - - int mcc = parser.nextInt(0); - int mnc = parser.nextInt(0); - - position.setAltitude(parser.nextInt(0)); - - position.set(Position.KEY_HDOP, parser.nextInt(0) * 0.1); - - position.setNetwork(new Network(CellTower.from( - mcc, mnc, parser.nextHexInt(0), parser.nextHexInt(0), rssi))); - - position.set(Position.KEY_ODOMETER, parser.nextInt(0)); - - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/FoxProtocol.java b/src/org/traccar/protocol/FoxProtocol.java deleted file mode 100644 index 501bff4c4..000000000 --- a/src/org/traccar/protocol/FoxProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class FoxProtocol extends BaseProtocol { - - public FoxProtocol() { - super("fox"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "</fox>")); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new FoxProtocolDecoder(FoxProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/FoxProtocolDecoder.java b/src/org/traccar/protocol/FoxProtocolDecoder.java deleted file mode 100644 index 9b2cf0e1d..000000000 --- a/src/org/traccar/protocol/FoxProtocolDecoder.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2016 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.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 FoxProtocolDecoder extends BaseProtocolDecoder { - - public FoxProtocolDecoder(FoxProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("(d+),") // status id - .expression("([AV]),") // validity - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*)?,") // speed - .number("(d+.?d*)?,") // course - .expression("[^,]*,") // cell info - .number("([01]+) ") // input - .number("(d+) ") // power - .number("(d+) ") // temperature - .number("(d+) ") // rpm - .number("(d+) ") // fuel - .number("(d+) ") // adc 1 - .number("(d+) ") // adc 2 - .number("([01]+) ") // output - .number("(d+),") // odometer - .expression("(.+)") // status info - .compile(); - - private String getAttribute(String xml, String key) { - int start = xml.indexOf(key + "=\""); - if (start != -1) { - start += key.length() + 2; - int end = xml.indexOf("\"", start); - if (end != -1) { - return xml.substring(start, end); - } - } - return null; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String xml = (String) msg; - String id = getAttribute(xml, "id"); - String data = getAttribute(xml, "data"); - - if (id != null && data != null) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id); - if (deviceSession == null) { - return null; - } - - Parser parser = new Parser(PATTERN, data); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_STATUS, parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_INPUT, parser.nextBinInt(0)); - position.set(Position.KEY_POWER, parser.nextDouble(0) * 0.1); - position.set(Position.PREFIX_TEMP + 1, parser.nextInt(0)); - position.set(Position.KEY_RPM, parser.nextInt(0)); - position.set(Position.KEY_FUEL_LEVEL, parser.nextInt(0)); - position.set(Position.PREFIX_ADC + 1, parser.nextInt(0)); - position.set(Position.PREFIX_ADC + 2, parser.nextInt(0)); - position.set(Position.KEY_OUTPUT, parser.nextBinInt(0)); - position.set(Position.KEY_ODOMETER, parser.nextInt(0)); - - position.set("statusData", parser.next()); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/FreedomProtocol.java b/src/org/traccar/protocol/FreedomProtocol.java deleted file mode 100644 index 5b4bf22ff..000000000 --- a/src/org/traccar/protocol/FreedomProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class FreedomProtocol extends BaseProtocol { - - public FreedomProtocol() { - super("freedom"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new FreedomProtocolDecoder(FreedomProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/FreedomProtocolDecoder.java b/src/org/traccar/protocol/FreedomProtocolDecoder.java deleted file mode 100644 index 56b6b9e19..000000000 --- a/src/org/traccar/protocol/FreedomProtocolDecoder.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2014 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class FreedomProtocolDecoder extends BaseProtocolDecoder { - - public FreedomProtocolDecoder(FreedomProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("IMEI,") - .number("(d+),") // imei - .number("(dddd)/(dd)/(dd), ") // date (yyyy/dd/mm) - .number("(dd):(dd):(dd), ") // time (hh:mm:ss) - .expression("([NS]), ") - .number("Lat:(dd)(d+.d+), ") // latitude - .expression("([EW]), ") - .number("Lon:(ddd)(d+.d+), ") // longitude - .text("Spd:").number("(d+.d+)") // speed - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(true); - - position.setTime(parser.nextDateTime()); - - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - - position.setSpeed(parser.nextDouble(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/GalileoFrameDecoder.java b/src/org/traccar/protocol/GalileoFrameDecoder.java deleted file mode 100644 index 6d02ce744..000000000 --- a/src/org/traccar/protocol/GalileoFrameDecoder.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class GalileoFrameDecoder extends FrameDecoder { - - private static final int MESSAGE_MINIMUM_LENGTH = 5; - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - // Check minimum length - if (buf.readableBytes() < MESSAGE_MINIMUM_LENGTH) { - return null; - } - - // Read packet - int length = buf.getUnsignedShort(buf.readerIndex() + 1) & 0x7fff; - if (buf.readableBytes() >= (length + MESSAGE_MINIMUM_LENGTH)) { - return buf.readBytes(length + MESSAGE_MINIMUM_LENGTH); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/GalileoProtocol.java b/src/org/traccar/protocol/GalileoProtocol.java deleted file mode 100644 index f76de04a0..000000000 --- a/src/org/traccar/protocol/GalileoProtocol.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2015 - 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.nio.ByteOrder; -import java.util.List; - -public class GalileoProtocol extends BaseProtocol { - - public GalileoProtocol() { - super("galileo"); - setSupportedDataCommands( - Command.TYPE_CUSTOM, - Command.TYPE_OUTPUT_CONTROL); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new GalileoFrameDecoder()); - pipeline.addLast("objectEncoder", new GalileoProtocolEncoder()); - pipeline.addLast("objectDecoder", new GalileoProtocolDecoder(GalileoProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/GalileoProtocolDecoder.java b/src/org/traccar/protocol/GalileoProtocolDecoder.java deleted file mode 100644 index 3944b37de..000000000 --- a/src/org/traccar/protocol/GalileoProtocolDecoder.java +++ /dev/null @@ -1,305 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class GalileoProtocolDecoder extends BaseProtocolDecoder { - - public GalileoProtocolDecoder(GalileoProtocol protocol) { - super(protocol); - } - - private static final Map<Integer, Integer> TAG_LENGTH_MAP = new HashMap<>(); - - static { - int[] l1 = { - 0x01, 0x02, 0x35, 0x43, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, - 0xd0, 0xd1, 0xd2, 0xd5, 0x88, 0x8a, 0x8b, 0x8c, - 0xa0, 0xaf, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, - 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae - }; - int[] l2 = { - 0x04, 0x10, 0x34, 0x40, 0x41, 0x42, 0x45, 0x46, - 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x60, 0x61, - 0x62, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, - 0x77, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, - 0xb7, 0xb8, 0xb9, 0xd6, 0xd7, 0xd8, 0xd9, 0xda - }; - int[] l3 = { - 0x63, 0x64, 0x6f, 0x5d, 0x65, 0x66, 0x67, 0x68, - 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e - }; - int[] l4 = { - 0x20, 0x33, 0x44, 0x90, 0xc0, 0xc2, 0xc3, 0xd3, - 0xd4, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xf0, 0xf9, - 0x5a, 0x47, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, - 0xf7, 0xf8, 0xe2, 0xe9 - }; - for (int i : l1) { - TAG_LENGTH_MAP.put(i, 1); - } - for (int i : l2) { - TAG_LENGTH_MAP.put(i, 2); - } - for (int i : l3) { - TAG_LENGTH_MAP.put(i, 3); - } - for (int i : l4) { - TAG_LENGTH_MAP.put(i, 4); - } - TAG_LENGTH_MAP.put(0x5b, 7); // variable length - TAG_LENGTH_MAP.put(0x5c, 68); - } - - private static int getTagLength(int tag) { - Integer length = TAG_LENGTH_MAP.get(tag); - if (length == null) { - throw new IllegalArgumentException("Unknown tag: " + tag); - } - return length; - } - - private void sendReply(Channel channel, int checksum) { - ChannelBuffer reply = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, 3); - reply.writeByte(0x02); - reply.writeShort((short) checksum); - if (channel != null) { - channel.write(reply); - } - } - - private void decodeTag(Position position, ChannelBuffer buf, int tag) { - switch (tag) { - case 0x01: - position.set(Position.KEY_VERSION_HW, buf.readUnsignedByte()); - break; - case 0x02: - position.set(Position.KEY_VERSION_FW, buf.readUnsignedByte()); - break; - case 0x04: - position.set("deviceId", buf.readUnsignedShort()); - break; - case 0x10: - position.set(Position.KEY_INDEX, buf.readUnsignedShort()); - break; - case 0x20: - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - break; - case 0x33: - position.setSpeed(buf.readUnsignedShort() * 0.0539957); - position.setCourse(buf.readUnsignedShort() * 0.1); - break; - case 0x34: - position.setAltitude(buf.readShort()); - break; - case 0x40: - position.set(Position.KEY_STATUS, buf.readUnsignedShort()); - break; - case 0x41: - position.set(Position.KEY_POWER, buf.readUnsignedShort()); - break; - case 0x42: - position.set(Position.KEY_BATTERY, buf.readUnsignedShort()); - break; - case 0x43: - position.set(Position.KEY_DEVICE_TEMP, buf.readByte()); - break; - case 0x44: - position.set(Position.KEY_ACCELERATION, buf.readUnsignedInt()); - break; - case 0x45: - position.set(Position.KEY_OUTPUT, buf.readUnsignedShort()); - break; - case 0x46: - position.set(Position.KEY_INPUT, buf.readUnsignedShort()); - break; - case 0x50: - case 0x51: - case 0x52: - case 0x53: - case 0x54: - case 0x55: - case 0x56: - case 0x57: - position.set(Position.PREFIX_ADC + (tag - 0x50), buf.readUnsignedShort()); - break; - case 0x58: - position.set("rs2320", buf.readUnsignedShort()); - break; - case 0x59: - position.set("rs2321", buf.readUnsignedShort()); - break; - case 0xc0: - position.set("fuelTotal", buf.readUnsignedInt() * 0.5); - break; - case 0xc1: - position.set(Position.KEY_FUEL_LEVEL, buf.readUnsignedByte() * 0.4); - position.set(Position.PREFIX_TEMP + 1, buf.readUnsignedByte() - 40); - position.set(Position.KEY_RPM, buf.readUnsignedShort() * 0.125); - break; - case 0xc2: - position.set("canB0", buf.readUnsignedInt()); - break; - case 0xc3: - position.set("canB1", buf.readUnsignedInt()); - break; - case 0xc4: - case 0xc5: - case 0xc6: - case 0xc7: - case 0xc8: - case 0xc9: - case 0xca: - case 0xcb: - case 0xcc: - case 0xcd: - case 0xce: - case 0xcf: - case 0xd0: - case 0xd1: - case 0xd2: - position.set("can8Bit" + (tag - 0xc4), buf.readUnsignedByte()); - break; - case 0xd6: - case 0xd7: - case 0xd8: - case 0xd9: - case 0xda: - position.set("can16Bit" + (tag - 0xd6), buf.readUnsignedShort()); - break; - case 0xdb: - case 0xdc: - case 0xdd: - case 0xde: - case 0xdf: - position.set("can32Bit" + (tag - 0xdb), buf.readUnsignedInt()); - break; - case 0xd4: - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - break; - case 0xe0: - position.set(Position.KEY_INDEX, buf.readUnsignedInt()); - break; - case 0xe1: - position.set(Position.KEY_RESULT, - buf.readBytes(buf.readUnsignedByte()).toString(StandardCharsets.US_ASCII)); - break; - case 0xe2: - case 0xe3: - case 0xe4: - case 0xe5: - case 0xe6: - case 0xe7: - case 0xe8: - case 0xe9: - position.set("userData" + (tag - 0xe2), buf.readUnsignedInt()); - break; - case 0xea: - position.set("userDataArray", ChannelBuffers.hexDump(buf.readBytes(buf.readUnsignedByte()))); - break; - default: - buf.skipBytes(getTagLength(tag)); - break; - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.readUnsignedByte(); // header - int length = (buf.readUnsignedShort() & 0x7fff) + 3; - - List<Position> positions = new LinkedList<>(); - Set<Integer> tags = new HashSet<>(); - boolean hasLocation = false; - - DeviceSession deviceSession = null; - Position position = new Position(); - - while (buf.readerIndex() < length) { - - // Check if new message started - int tag = buf.readUnsignedByte(); - if (tags.contains(tag)) { - if (hasLocation && position.getFixTime() != null) { - positions.add(position); - } - tags.clear(); - hasLocation = false; - position = new Position(); - } - tags.add(tag); - - if (tag == 0x03) { - deviceSession = getDeviceSession( - channel, remoteAddress, buf.readBytes(15).toString(StandardCharsets.US_ASCII)); - } else if (tag == 0x30) { - hasLocation = true; - position.setValid((buf.readUnsignedByte() & 0xf0) == 0x00); - position.setLatitude(buf.readInt() / 1000000.0); - position.setLongitude(buf.readInt() / 1000000.0); - } else { - decodeTag(position, buf, tag); - } - - } - - if (hasLocation && position.getFixTime() != null) { - positions.add(position); - } else if (position.getAttributes().containsKey(Position.KEY_RESULT)) { - getLastLocation(position, null); - positions.add(position); - } - - if (deviceSession == null) { - deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - } - - sendReply(channel, buf.readUnsignedShort()); - - for (Position p : positions) { - p.setProtocol(getProtocolName()); - p.setDeviceId(deviceSession.getDeviceId()); - } - - return positions.isEmpty() ? null : positions; - } - -} diff --git a/src/org/traccar/protocol/GalileoProtocolEncoder.java b/src/org/traccar/protocol/GalileoProtocolEncoder.java deleted file mode 100644 index cb6028abb..000000000 --- a/src/org/traccar/protocol/GalileoProtocolEncoder.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Checksum; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; - -public class GalileoProtocolEncoder extends BaseProtocolEncoder { - - private ChannelBuffer encodeText(String uniqueId, String text) { - - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 256); - - buf.writeByte(0x01); - buf.writeShort(uniqueId.length() + text.length() + 11); // TODO - - buf.writeByte(0x03); // imei tag - buf.writeBytes(uniqueId.getBytes(StandardCharsets.US_ASCII)); - - buf.writeByte(0x04); // device id tag - buf.writeShort(0); // not needed if imei provided - - buf.writeByte(0xE0); // index tag - buf.writeInt(0); // index - - buf.writeByte(0xE1); // command text tag - buf.writeByte(text.length()); - buf.writeBytes(text.getBytes(StandardCharsets.US_ASCII)); - - buf.writeShort(Checksum.crc16(Checksum.CRC16_MODBUS, buf.toByteBuffer(0, buf.writerIndex()))); - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_CUSTOM: - return encodeText(getUniqueId(command.getDeviceId()), command.getString(Command.KEY_DATA)); - case Command.TYPE_OUTPUT_CONTROL: - return encodeText(getUniqueId(command.getDeviceId()), - "Out " + command.getInteger(Command.KEY_INDEX) + "," + command.getString(Command.KEY_DATA)); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/GatorProtocol.java b/src/org/traccar/protocol/GatorProtocol.java deleted file mode 100644 index 7fa4854d3..000000000 --- a/src/org/traccar/protocol/GatorProtocol.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2015 - 2016 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.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class GatorProtocol extends BaseProtocol { - - public GatorProtocol() { - super("gator"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 3, 2)); - pipeline.addLast("objectDecoder", new GatorProtocolDecoder(GatorProtocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectDecoder", new GatorProtocolDecoder(GatorProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/GatorProtocolDecoder.java b/src/org/traccar/protocol/GatorProtocolDecoder.java deleted file mode 100644 index 2ad4be3d3..000000000 --- a/src/org/traccar/protocol/GatorProtocolDecoder.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BcdUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; - -public class GatorProtocolDecoder extends BaseProtocolDecoder { - - public GatorProtocolDecoder(GatorProtocol protocol) { - super(protocol); - } - - public static final int MSG_HEARTBEAT = 0x21; - public static final int MSG_POSITION_DATA = 0x80; - public static final int MSG_ROLLCALL_RESPONSE = 0x81; - public static final int MSG_ALARM_DATA = 0x82; - public static final int MSG_TERMINAL_STATUS = 0x83; - public static final int MSG_MESSAGE = 0x84; - public static final int MSG_TERMINAL_ANSWER = 0x85; - public static final int MSG_BLIND_AREA = 0x8E; - public static final int MSG_PICTURE_FRAME = 0x54; - public static final int MSG_CAMERA_RESPONSE = 0x56; - public static final int MSG_PICTURE_DATA = 0x57; - - public static String decodeId(int b1, int b2, int b3, int b4) { - - int d1 = 30 + ((b1 >> 7) << 3) + ((b2 >> 7) << 2) + ((b3 >> 7) << 1) + (b4 >> 7); - int d2 = b1 & 0x7f; - int d3 = b2 & 0x7f; - int d4 = b3 & 0x7f; - int d5 = b4 & 0x7f; - - return String.format("%02d%02d%02d%02d%02d", d1, d2, d3, d4, d5); - } - - private void sendResponse(Channel channel, byte calibration) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeByte(0x24); response.writeByte(0x24); // header - response.writeByte(MSG_HEARTBEAT); // size - response.writeShort(5); - response.writeByte(calibration); - response.writeByte(0); // main order - response.writeByte(0); // slave order - response.writeByte(1); // calibration - response.writeByte(0x0D); - channel.write(response); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - int type = buf.readUnsignedByte(); - buf.readUnsignedShort(); // length - - String id = decodeId( - buf.readUnsignedByte(), buf.readUnsignedByte(), - buf.readUnsignedByte(), buf.readUnsignedByte()); - - sendResponse(channel, buf.getByte(buf.writerIndex() - 2)); - - if (type == MSG_POSITION_DATA || type == MSG_ROLLCALL_RESPONSE - || type == MSG_ALARM_DATA || type == MSG_BLIND_AREA) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, "1" + id, id); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setYear(BcdUtil.readInteger(buf, 2)) - .setMonth(BcdUtil.readInteger(buf, 2)) - .setDay(BcdUtil.readInteger(buf, 2)) - .setHour(BcdUtil.readInteger(buf, 2)) - .setMinute(BcdUtil.readInteger(buf, 2)) - .setSecond(BcdUtil.readInteger(buf, 2)); - position.setTime(dateBuilder.getDate()); - - position.setLatitude(BcdUtil.readCoordinate(buf)); - position.setLongitude(BcdUtil.readCoordinate(buf)); - position.setSpeed(UnitsConverter.knotsFromKph(BcdUtil.readInteger(buf, 4))); - position.setCourse(BcdUtil.readInteger(buf, 4)); - - int flags = buf.readUnsignedByte(); - position.setValid((flags & 0x80) != 0); - position.set(Position.KEY_SATELLITES, flags & 0x0f); - - position.set(Position.KEY_STATUS, buf.readUnsignedByte()); - position.set("key", buf.readUnsignedByte()); - position.set("oil", buf.readUnsignedShort() / 10.0); - position.set(Position.KEY_POWER, buf.readUnsignedByte() + buf.readUnsignedByte() * 0.01); - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/GenxProtocol.java b/src/org/traccar/protocol/GenxProtocol.java deleted file mode 100644 index 2b5b1a43d..000000000 --- a/src/org/traccar/protocol/GenxProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; -import org.jboss.netty.handler.codec.string.StringDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class GenxProtocol extends BaseProtocol { - - public GenxProtocol() { - super("genx"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new GenxProtocolDecoder(GenxProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/GenxProtocolDecoder.java b/src/org/traccar/protocol/GenxProtocolDecoder.java deleted file mode 100644 index ebf6f2b53..000000000 --- a/src/org/traccar/protocol/GenxProtocolDecoder.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 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.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.text.SimpleDateFormat; - -public class GenxProtocolDecoder extends BaseProtocolDecoder { - - private int[] reportColumns; - - public GenxProtocolDecoder(GenxProtocol protocol) { - super(protocol); - setReportColumns(Context.getConfig().getString(getProtocolName() + ".reportColumns", "1,2,3,4")); - } - - public void setReportColumns(String format) { - String[] columns = format.split(","); - reportColumns = new int[columns.length]; - for (int i = 0; i < columns.length; i++) { - reportColumns[i] = Integer.parseInt(columns[i]); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String[] values = ((String) msg).split(","); - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setValid(true); - - for (int i = 0; i < Math.min(values.length, reportColumns.length); i++) { - switch (reportColumns[i]) { - case 1: - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, values[i]); - if (deviceSession != null) { - position.setDeviceId(deviceSession.getDeviceId()); - } - break; - case 2: - position.setTime(new SimpleDateFormat("MM/dd/yy HH:mm:ss").parse(values[i])); - break; - case 3: - position.setLatitude(Double.parseDouble(values[i])); - break; - case 4: - position.setLongitude(Double.parseDouble(values[i])); - break; - case 11: - position.set(Position.KEY_IGNITION, values[i].equals("ON")); - break; - case 13: - position.setSpeed(UnitsConverter.knotsFromKph(Integer.parseInt(values[i]))); - break; - case 17: - position.setCourse(Integer.parseInt(values[i])); - break; - case 23: - position.set(Position.KEY_ODOMETER, Double.parseDouble(values[i]) * 1000); - break; - case 27: - position.setAltitude(UnitsConverter.metersFromFeet(Integer.parseInt(values[i]))); - break; - case 46: - position.set(Position.KEY_SATELLITES, Integer.parseInt(values[i])); - break; - default: - break; - } - } - - return position.getDeviceId() != 0 ? position : null; - } - -} diff --git a/src/org/traccar/protocol/Gl100Protocol.java b/src/org/traccar/protocol/Gl100Protocol.java deleted file mode 100644 index 0fd18d44f..000000000 --- a/src/org/traccar/protocol/Gl100Protocol.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class Gl100Protocol extends BaseProtocol { - - public Gl100Protocol() { - super("gl100"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '\0')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new Gl100ProtocolDecoder(Gl100Protocol.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("objectDecoder", new Gl100ProtocolDecoder(Gl100Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Gl100ProtocolDecoder.java b/src/org/traccar/protocol/Gl100ProtocolDecoder.java deleted file mode 100644 index 945edfff0..000000000 --- a/src/org/traccar/protocol/Gl100ProtocolDecoder.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2012 - 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class Gl100ProtocolDecoder extends BaseProtocolDecoder { - - public Gl100ProtocolDecoder(Gl100Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("+RESP:") - .expression("GT...,") - .number("(d{15}),") // imei - .groupBegin() - .number("d+,") // number - .number("d,") // reserved / geofence id - .number("d+") // reserved / geofence alert // battery - .or() - .number("[^,]*") // calling number - .groupEnd(",") - .expression("([01]),") // gps fix - .number("(d+.d),") // speed - .number("(d+),") // course - .number("(-?d+.d),") // altitude - .number("d*,") // gps accuracy - .number("(-?d+.d+),") // longitude - .number("(-?d+.d+),") // latitude - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.contains("AT+GTHBD=") && channel != null) { - String response = "+RESP:GTHBD,GPRS ACTIVE,"; - response += sentence.substring(9, sentence.lastIndexOf(',')); - response += '\0'; - channel.write(response); // heartbeat response - } - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(parser.nextInt(0) == 0); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setLatitude(parser.nextDouble(0)); - - position.setTime(parser.nextDateTime()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/Gl200BinaryProtocolDecoder.java b/src/org/traccar/protocol/Gl200BinaryProtocolDecoder.java deleted file mode 100644 index 071960e49..000000000 --- a/src/org/traccar/protocol/Gl200BinaryProtocolDecoder.java +++ /dev/null @@ -1,406 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitBuffer; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class Gl200BinaryProtocolDecoder extends BaseProtocolDecoder { - - public Gl200BinaryProtocolDecoder(Gl200Protocol protocol) { - super(protocol); - } - - private Date decodeTime(ChannelBuffer buf) { - DateBuilder dateBuilder = new DateBuilder() - .setDate(buf.readUnsignedShort(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - return dateBuilder.getDate(); - } - - public static final int MSG_RSP_LCB = 3; - public static final int MSG_RSP_GEO = 8; - public static final int MSG_RSP_COMPRESSED = 100; - - private List<Position> decodeLocation(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - - List<Position> positions = new LinkedList<>(); - - int type = buf.readUnsignedByte(); - - buf.readUnsignedInt(); // mask - buf.readUnsignedShort(); // length - buf.readUnsignedByte(); // device type - buf.readUnsignedShort(); // protocol version - buf.readUnsignedShort(); // firmware version - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, String.format("%015d", buf.readLong())); - if (deviceSession == null) { - return null; - } - - int battery = buf.readUnsignedByte(); - int power = buf.readUnsignedShort(); - - if (type == MSG_RSP_GEO) { - buf.readUnsignedByte(); // reserved - buf.readUnsignedByte(); // reserved - } - - buf.readUnsignedByte(); // motion status - int satellites = buf.readUnsignedByte(); - - if (type != MSG_RSP_COMPRESSED) { - buf.readUnsignedByte(); // index - } - - if (type == MSG_RSP_LCB) { - buf.readUnsignedByte(); // phone length - for (int b = buf.readUnsignedByte();; b = buf.readUnsignedByte()) { - if ((b & 0xf) == 0xf || (b & 0xf0) == 0xf0) { - break; - } - } - } - - if (type == MSG_RSP_COMPRESSED) { - - int count = buf.readUnsignedShort(); - - BitBuffer bits; - int speed = 0; - int heading = 0; - int latitude = 0; - int longitude = 0; - long time = 0; - - for (int i = 0; i < count; i++) { - - if (time > 0) { - time += 1; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - switch (BitUtil.from(buf.getUnsignedByte(buf.readerIndex()), 8 - 2)) { - case 1: - bits = new BitBuffer(buf.readBytes(3)); - bits.readUnsigned(2); // point attribute - bits.readUnsigned(1); // fix type - speed = bits.readUnsigned(12); - heading = bits.readUnsigned(9); - longitude = buf.readInt(); - latitude = buf.readInt(); - if (time == 0) { - time = buf.readUnsignedInt(); - } - break; - case 2: - bits = new BitBuffer(buf.readBytes(5)); - bits.readUnsigned(2); // point attribute - bits.readUnsigned(1); // fix type - speed += bits.readSigned(7); - heading += bits.readSigned(7); - longitude += bits.readSigned(12); - latitude += bits.readSigned(11); - break; - default: - buf.readUnsignedByte(); // invalid or same - continue; - } - - position.setValid(true); - position.setTime(new Date(time * 1000)); - position.setSpeed(UnitsConverter.knotsFromKph(speed * 0.1)); - position.setCourse(heading); - position.setLongitude(longitude * 0.000001); - position.setLatitude(latitude * 0.000001); - - positions.add(position); - - } - - } else { - - int count = buf.readUnsignedByte(); - - for (int i = 0; i < count; i++) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_BATTERY_LEVEL, battery); - position.set(Position.KEY_POWER, power); - position.set(Position.KEY_SATELLITES, satellites); - - int hdop = buf.readUnsignedByte(); - position.setValid(hdop > 0); - position.set(Position.KEY_HDOP, hdop); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedMedium() * 0.1)); - position.setCourse(buf.readUnsignedShort()); - position.setAltitude(buf.readShort()); - position.setLongitude(buf.readInt() * 0.000001); - position.setLatitude(buf.readInt() * 0.000001); - - position.setTime(decodeTime(buf)); - - position.setNetwork(new Network(CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedShort(), - buf.readUnsignedShort(), buf.readUnsignedShort()))); - - buf.readUnsignedByte(); // reserved - - positions.add(position); - - } - - } - - return positions; - } - - public static final int MSG_EVT_BPL = 6; - public static final int MSG_EVT_VGN = 45; - public static final int MSG_EVT_VGF = 46; - public static final int MSG_EVT_UPD = 15; - public static final int MSG_EVT_IDF = 17; - public static final int MSG_EVT_GSS = 21; - public static final int MSG_EVT_GES = 26; - public static final int MSG_EVT_GPJ = 31; - public static final int MSG_EVT_RMD = 35; - public static final int MSG_EVT_JDS = 33; - public static final int MSG_EVT_CRA = 23; - public static final int MSG_EVT_UPC = 34; - - private Position decodeEvent(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - int type = buf.readUnsignedByte(); - - buf.readUnsignedInt(); // mask - buf.readUnsignedShort(); // length - buf.readUnsignedByte(); // device type - buf.readUnsignedShort(); // protocol version - - position.set(Position.KEY_VERSION_FW, String.valueOf(buf.readUnsignedShort())); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, String.format("%015d", buf.readLong())); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_BATTERY_LEVEL, buf.readUnsignedByte()); - position.set(Position.KEY_POWER, buf.readUnsignedShort()); - - buf.readUnsignedByte(); // motion status - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - - switch (type) { - case MSG_EVT_BPL: - buf.readUnsignedShort(); // backup battery voltage - break; - case MSG_EVT_VGN: - case MSG_EVT_VGF: - buf.readUnsignedShort(); // reserved - buf.readUnsignedByte(); // report type - buf.readUnsignedInt(); // ignition duration - break; - case MSG_EVT_UPD: - buf.readUnsignedShort(); // code - buf.readUnsignedByte(); // retry - break; - case MSG_EVT_IDF: - buf.readUnsignedInt(); // idling duration - break; - case MSG_EVT_GSS: - buf.readUnsignedByte(); // gps signal status - buf.readUnsignedInt(); // reserved - break; - case MSG_EVT_GES: - buf.readUnsignedShort(); // trigger geo id - buf.readUnsignedByte(); // trigger geo enable - buf.readUnsignedByte(); // trigger mode - buf.readUnsignedInt(); // radius - buf.readUnsignedInt(); // check interval - break; - case MSG_EVT_GPJ: - buf.readUnsignedByte(); // cw jamming value - buf.readUnsignedByte(); // gps jamming state - break; - case MSG_EVT_RMD: - buf.readUnsignedByte(); // roaming state - break; - case MSG_EVT_JDS: - buf.readUnsignedByte(); // jamming state - break; - case MSG_EVT_CRA: - buf.readUnsignedByte(); // crash counter - break; - case MSG_EVT_UPC: - buf.readUnsignedByte(); // command id - buf.readUnsignedShort(); // result - break; - default: - break; - } - - buf.readUnsignedByte(); // count - - int hdop = buf.readUnsignedByte(); - position.setValid(hdop > 0); - position.set(Position.KEY_HDOP, hdop); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedMedium() * 0.1)); - position.setCourse(buf.readUnsignedShort()); - position.setAltitude(buf.readShort()); - position.setLongitude(buf.readInt() * 0.000001); - position.setLatitude(buf.readInt() * 0.000001); - - position.setTime(decodeTime(buf)); - - position.setNetwork(new Network(CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedShort(), - buf.readUnsignedShort(), buf.readUnsignedShort()))); - - buf.readUnsignedByte(); // reserved - - return position; - } - - public static final int MSG_INF_GPS = 2; - public static final int MSG_INF_CID = 4; - public static final int MSG_INF_CSQ = 5; - public static final int MSG_INF_VER = 6; - public static final int MSG_INF_BAT = 7; - public static final int MSG_INF_TMZ = 9; - public static final int MSG_INF_GIR = 10; - - private Position decodeInformation(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - int type = buf.readUnsignedByte(); - - buf.readUnsignedInt(); // mask - buf.readUnsignedShort(); // length - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, String.format("%015d", buf.readLong())); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - buf.readUnsignedByte(); // device type - buf.readUnsignedShort(); // protocol version - - position.set(Position.KEY_VERSION_FW, String.valueOf(buf.readUnsignedShort())); - - if (type == MSG_INF_VER) { - buf.readUnsignedShort(); // hardware version - buf.readUnsignedShort(); // mcu version - buf.readUnsignedShort(); // reserved - } - - buf.readUnsignedByte(); // motion status - buf.readUnsignedByte(); // reserved - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - - buf.readUnsignedByte(); // mode - buf.skipBytes(7); // last fix time - buf.readUnsignedByte(); // reserved - buf.readUnsignedByte(); - buf.readUnsignedShort(); // response report mask - buf.readUnsignedShort(); // ign interval - buf.readUnsignedShort(); // igf interval - buf.readUnsignedInt(); // reserved - buf.readUnsignedByte(); // reserved - - if (type == MSG_INF_BAT) { - position.set(Position.KEY_CHARGE, buf.readUnsignedByte() != 0); - position.set(Position.KEY_POWER, buf.readUnsignedShort() * 0.001); - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - position.set(Position.KEY_BATTERY_LEVEL, buf.readUnsignedByte()); - } - - buf.skipBytes(10); // iccid - - if (type == MSG_INF_CSQ) { - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - buf.readUnsignedByte(); - } - - buf.readUnsignedByte(); // time zone flags - buf.readUnsignedShort(); // time zone offset - - if (type == MSG_INF_GIR) { - buf.readUnsignedByte(); // gir trigger - buf.readUnsignedByte(); // cell number - position.setNetwork(new Network(CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedShort(), - buf.readUnsignedShort(), buf.readUnsignedShort()))); - buf.readUnsignedByte(); // ta - buf.readUnsignedByte(); // rx level - } - - getLastLocation(position, decodeTime(buf)); - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - switch (buf.readBytes(4).toString(StandardCharsets.US_ASCII)) { - case "+RSP": - return decodeLocation(channel, remoteAddress, buf); - case "+INF": - return decodeInformation(channel, remoteAddress, buf); - case "+EVT": - return decodeEvent(channel, remoteAddress, buf); - default: - return null; - } - } - -} diff --git a/src/org/traccar/protocol/Gl200FrameDecoder.java b/src/org/traccar/protocol/Gl200FrameDecoder.java deleted file mode 100644 index 960c3779a..000000000 --- a/src/org/traccar/protocol/Gl200FrameDecoder.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -public class Gl200FrameDecoder extends FrameDecoder { - - private static final int MINIMUM_LENGTH = 11; - - private static final Set<String> BINARY_HEADERS = new HashSet<>( - Arrays.asList("+RSP", "+BSP", "+EVT", "+BVT", "+INF", "+BNF", "+HBD", "+CRD", "+BRD")); - - public static boolean isBinary(ChannelBuffer buf) { - String header = buf.toString(buf.readerIndex(), 4, StandardCharsets.US_ASCII); - if (header.equals("+ACK")) { - return buf.getByte(buf.readerIndex() + header.length()) != (byte) ':'; - } else { - return BINARY_HEADERS.contains(header); - } - } - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < MINIMUM_LENGTH) { - return null; - } - - if (isBinary(buf)) { - - int length; - switch (buf.toString(buf.readerIndex(), 4, StandardCharsets.US_ASCII)) { - case "+ACK": - length = buf.getUnsignedByte(buf.readerIndex() + 6); - break; - case "+INF": - case "+BNF": - length = buf.getUnsignedShort(buf.readerIndex() + 7); - break; - case "+HBD": - length = buf.getUnsignedByte(buf.readerIndex() + 5); - break; - case "+CRD": - case "+BRD": - length = buf.getUnsignedShort(buf.readerIndex() + 6); - break; - default: - length = buf.getUnsignedShort(buf.readerIndex() + 9); - break; - } - - if (buf.readableBytes() >= length) { - return buf.readBytes(length); - } - - } else { - - int endIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '$'); - if (endIndex < 0) { - endIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) 0); - } - if (endIndex > 0) { - ChannelBuffer frame = buf.readBytes(endIndex - buf.readerIndex()); - buf.readByte(); // delimiter - return frame; - } - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Gl200Protocol.java b/src/org/traccar/protocol/Gl200Protocol.java deleted file mode 100644 index 799d7fe36..000000000 --- a/src/org/traccar/protocol/Gl200Protocol.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2015 - 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.bootstrap.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -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; - -public class Gl200Protocol extends BaseProtocol { - - public Gl200Protocol() { - super("gl200"); - setSupportedDataCommands( - Command.TYPE_POSITION_SINGLE, - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME, - Command.TYPE_IDENTIFICATION, - Command.TYPE_REBOOT_DEVICE); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new Gl200FrameDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new Gl200ProtocolEncoder()); - pipeline.addLast("objectDecoder", new Gl200ProtocolDecoder(Gl200Protocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new Gl200ProtocolEncoder()); - pipeline.addLast("objectDecoder", new Gl200ProtocolDecoder(Gl200Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Gl200ProtocolDecoder.java b/src/org/traccar/protocol/Gl200ProtocolDecoder.java deleted file mode 100644 index 0de7bb926..000000000 --- a/src/org/traccar/protocol/Gl200ProtocolDecoder.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; - -import java.net.SocketAddress; - -public class Gl200ProtocolDecoder extends BaseProtocolDecoder { - - private final Gl200TextProtocolDecoder textProtocolDecoder; - private final Gl200BinaryProtocolDecoder binaryProtocolDecoder; - - public Gl200ProtocolDecoder(Gl200Protocol protocol) { - super(protocol); - textProtocolDecoder = new Gl200TextProtocolDecoder(protocol); - binaryProtocolDecoder = new Gl200BinaryProtocolDecoder(protocol); - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - if (Gl200FrameDecoder.isBinary(buf)) { - return binaryProtocolDecoder.decode(channel, remoteAddress, msg); - } else { - return textProtocolDecoder.decode(channel, remoteAddress, msg); - } - } - -} diff --git a/src/org/traccar/protocol/Gl200ProtocolEncoder.java b/src/org/traccar/protocol/Gl200ProtocolEncoder.java deleted file mode 100644 index 2c8efa318..000000000 --- a/src/org/traccar/protocol/Gl200ProtocolEncoder.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2016 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.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class Gl200ProtocolEncoder extends StringProtocolEncoder { - - @Override - protected Object encodeCommand(Command command) { - - initDevicePassword(command, ""); - - switch (command.getType()) { - case Command.TYPE_POSITION_SINGLE: - return formatCommand(command, "AT+GTRTO={%s},1,,,,,,FFFF$", Command.KEY_DEVICE_PASSWORD); - case Command.TYPE_ENGINE_STOP: - return formatCommand(command, "AT+GTOUT={%s},1,,,0,0,0,0,0,0,0,,,,,,,FFFF$", - Command.KEY_DEVICE_PASSWORD); - case Command.TYPE_ENGINE_RESUME: - return formatCommand(command, "AT+GTOUT={%s},0,,,0,0,0,0,0,0,0,,,,,,,FFFF$", - Command.KEY_DEVICE_PASSWORD); - case Command.TYPE_IDENTIFICATION: - return formatCommand(command, "AT+GTRTO={%s},8,,,,,,FFFF$", Command.KEY_DEVICE_PASSWORD); - case Command.TYPE_REBOOT_DEVICE: - return formatCommand(command, "AT+GTRTO={%s},3,,,,,,FFFF$", Command.KEY_DEVICE_PASSWORD); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Gl200TextProtocolDecoder.java b/src/org/traccar/protocol/Gl200TextProtocolDecoder.java deleted file mode 100644 index 2f03cbb8f..000000000 --- a/src/org/traccar/protocol/Gl200TextProtocolDecoder.java +++ /dev/null @@ -1,917 +0,0 @@ -/* - * Copyright 2012 - 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; -import org.traccar.model.WifiAccessPoint; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.LinkedList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Gl200TextProtocolDecoder extends BaseProtocolDecoder { - - private boolean ignoreFixTime; - - public Gl200TextProtocolDecoder(Gl200Protocol protocol) { - super(protocol); - - ignoreFixTime = Context.getConfig().getBoolean(getProtocolName() + ".ignoreFixTime"); - } - - private static final Pattern PATTERN_ACK = new PatternBuilder() - .text("+ACK:GT") - .expression("...,") // type - .number("([0-9A-Z]{2}xxxx),") // protocol version - .number("(d{15}|x{14}),") // imei - .any().text(",") - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(xxxx)") // counter - .text("$").optional() - .compile(); - - private static final Pattern PATTERN_INF = new PatternBuilder() - .text("+").expression("(?:RESP|BUFF):GTINF,") - .number("[0-9A-Z]{2}xxxx,") // protocol version - .number("(d{15}|x{14}),") // imei - .expression("(?:[0-9A-Z]{17},)?") // vin - .expression("(?:[^,]+)?,") // device name - .number("(xx),") // state - .expression("(?:[0-9Ff]{20})?,") // iccid - .number("(d{1,2}),") // rssi - .number("d{1,2},") - .expression("[01],") // external power - .number("([d.]+)?,") // odometer or external power - .number("d*,") // backup battery or lightness - .number("(d+.d+),") // battery - .expression("([01]),") // charging - .number("(?:d),") // led - .number("(?:d)?,") // gps on need - .number("(?:d)?,") // gps antenna type - .number("(?:d)?,").optional() // gps antenna state - .number("d{14},") // last fix time - .groupBegin() - .number("(d+),") // battery percentage - .number("[d.]*,") // flash type / power - .number("(-?[d.]+)?,,,") // temperature - .or() - .expression("(?:[01])?,").optional() // pin15 mode - .number("(d+)?,") // adc1 - .number("(d+)?,").optional() // adc2 - .number("(xx)?,") // digital input - .number("(xx)?,") // digital output - .number("[-+]dddd,") // timezone - .expression("[01],") // daylight saving - .groupEnd() - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(xxxx)") // counter - .text("$").optional() - .compile(); - - private static final Pattern PATTERN_VER = new PatternBuilder() - .text("+").expression("(?:RESP|BUFF):GTVER,") - .number("[0-9A-Z]{2}xxxx,") // protocol version - .number("(d{15}|x{14}),") // imei - .expression("[^,]*,") // device name - .expression("([^,]*),") // device type - .number("(xxxx),") // firmware version - .number("(xxxx),") // hardware version - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(xxxx)") // counter - .text("$").optional() - .compile(); - - private static final Pattern PATTERN_LOCATION = new PatternBuilder() - .number("(d{1,2})?,") // hdop - .number("(d{1,3}.d)?,") // speed - .number("(d{1,3})?,") // course - .number("(-?d{1,5}.d)?,") // altitude - .number("(-?d{1,3}.d{6})?,") // longitude - .number("(-?d{1,2}.d{6})?,") // latitude - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)").optional(2) // time (hhmmss) - .text(",") - .number("(d+)?,") // mcc - .number("(d+)?,") // mnc - .groupBegin() - .number("(d+),") // lac - .number("(d+),") // cid - .or() - .number("(x+)?,") // lac - .number("(x+)?,") // cid - .groupEnd() - .number("(?:d+|(d+.d))?,") // odometer - .compile(); - - private static final Pattern PATTERN_OBD = new PatternBuilder() - .text("+RESP:GTOBD,") - .number("[0-9A-Z]{2}xxxx,") // protocol version - .number("(d{15}|x{14}),") // imei - .expression("(?:[0-9A-Z]{17})?,") // vin - .expression("[^,]{0,20},") // device name - .expression("[01],") // report type - .number("x{1,8},") // report mask - .expression("(?:[0-9A-Z]{17})?,") // vin - .number("[01],") // obd connect - .number("(?:d{1,5})?,") // obd voltage - .number("(?:x{8})?,") // support pids - .number("(d{1,5})?,") // engine rpm - .number("(d{1,3})?,") // speed - .number("(-?d{1,3})?,") // coolant temp - .number("(d+.?d*|Inf|NaN)?,") // fuel consumption - .number("(d{1,5})?,") // dtcs cleared distance - .number("(?:d{1,5})?,") - .expression("([01])?,") // obd connect - .number("(d{1,3})?,") // number of dtcs - .number("(x*),") // dtcs - .number("(d{1,3})?,") // throttle - .number("(?:d{1,3})?,") // engine load - .number("(d{1,3})?,") // fuel level - .expression("(?:[0-9A],)?") // obd protocol - .number("(d+),") // odometer - .expression(PATTERN_LOCATION.pattern()) - .number("(d{1,7}.d)?,") // odometer - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)").optional(2) // time (hhmmss) - .text(",") - .number("(xxxx)") // count number - .text("$").optional() - .compile(); - - private static final Pattern PATTERN_FRI = new PatternBuilder() - .text("+").expression("(?:RESP|BUFF):GTFRI,") - .number("(?:[0-9A-Z]{2}xxxx)?,") // protocol version - .number("(d{15}|x{14}),") // imei - .expression("(?:([0-9A-Z]{17}),)?") // vin - .expression("[^,]*,") // device name - .number("(d+)?,") // power - .number("d{1,2},") // report type - .number("d{1,2},") // count - .expression("((?:") - .expression(PATTERN_LOCATION.pattern()) - .expression(")+)") - .groupBegin() - .number("(d{1,7}.d)?,").optional() // odometer - .number("(d{1,3})?,") // battery - .or() - .number("(d{1,7}.d)?,") // odometer - .number("(d{5}:dd:dd)?,") // hour meter - .number("(x+)?,") // adc 1 - .number("(x+)?,") // adc 2 - .number("(d{1,3})?,") // battery - .number("(?:(xx)(xx)(xx))?,") // device status - .number("(d+)?,") // rpm - .number("(?:d+.?d*|Inf|NaN)?,") // fuel consumption - .number("(d+)?,") // fuel level - .groupEnd() - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)").optional(2) // time (hhmmss) - .text(",") - .number("(xxxx)") // count number - .text("$").optional() - .compile(); - - private static final Pattern PATTERN_ERI = new PatternBuilder() - .text("+").expression("(?:RESP|BUFF):GTERI,") - .number("(?:[0-9A-Z]{2}xxxx)?,") // protocol version - .number("(d{15}|x{14}),") // imei - .expression("[^,]*,") // device name - .number("x{8},") // mask - .number("(d+)?,") // power - .number("d{1,2},") // report type - .number("d{1,2},") // count - .expression("((?:") - .expression(PATTERN_LOCATION.pattern()) - .expression(")+)") - .number("(d{1,7}.d)?,") // odometer - .number("(d{5}:dd:dd)?,") // hour meter - .number("(x+)?,") // adc 1 - .number("(x+)?,") // adc 2 - .number("(d{1,3})?,") // battery - .number("(?:(xx)(xx)(xx))?,") // device status - .expression("(.*)") // additional data - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)").optional(2) // time (hhmmss) - .text(",") - .number("(xxxx)") // count number - .text("$").optional() - .compile(); - - private static final Pattern PATTERN_IGN = new PatternBuilder() - .text("+").expression("(?:RESP|BUFF):GTIG[NF],") - .number("(?:[0-9A-Z]{2}xxxx)?,") // protocol version - .number("(d{15}|x{14}),") // imei - .expression("[^,]*,") // device name - .number("d+,") // ignition off duration - .expression(PATTERN_LOCATION.pattern()) - .number("(d{5}:dd:dd)?,") // hour meter - .number("(d{1,7}.d)?,") // odometer - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)").optional(2) // time (hhmmss) - .text(",") - .number("(xxxx)") // count number - .text("$").optional() - .compile(); - - private static final Pattern PATTERN_IDA = new PatternBuilder() - .text("+RESP:GTIDA,") - .number("(?:[0-9A-Z]{2}xxxx)?,") // protocol version - .number("(d{15}|x{14}),") // imei - .expression("[^,]*,,") // device name - .number("([^,]+),") // rfid - .expression("[01],") // report type - .number("1,") // count - .expression(PATTERN_LOCATION.pattern()) - .number("(d+.d),") // odometer - .text(",,,,") - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)").optional(2) // time (hhmmss) - .text(",") - .number("(xxxx)") // count number - .text("$").optional() - .compile(); - - private static final Pattern PATTERN_WIF = new PatternBuilder() - .text("+RESP:GTWIF,") - .number("(?:[0-9A-Z]{2}xxxx)?,") // protocol version - .number("(d{15}|x{14}),") // imei - .expression("[^,]*,") // device name - .number("(d+),") // count - .number("((?:x{12},-?d+,,,,)+),,,,") // wifi - .number("(d{1,3}),") // battery - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)").optional(2) // time (hhmmss) - .text(",") - .number("(xxxx)") // count number - .text("$").optional() - .compile(); - - private static final Pattern PATTERN_GSM = new PatternBuilder() - .text("+RESP:GTGSM,") - .number("(?:[0-9A-Z]{2}xxxx)?,") // protocol version - .number("(d{15}|x{14}),") // imei - .expression("(?:STR|CTN|NMR|RTL),") // fix type - .expression("(.*)") // cells - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)").optional(2) // time (hhmmss) - .text(",") - .number("(xxxx)") // count number - .text("$").optional() - .compile(); - - private static final Pattern PATTERN = new PatternBuilder() - .text("+").expression("(?:RESP|BUFF):GT...,") - .number("(?:[0-9A-Z]{2}xxxx)?,") // protocol version - .number("(d{15}|x{14}),") // imei - .expression("[^,]*,") // device name - .number("d*,") - .number("(d{1,2}),") // report type - .number("d{1,2},") // count - .expression(PATTERN_LOCATION.pattern()) - .groupBegin() - .number("(d{1,7}.d)?,").optional() // odometer - .number("(d{1,3})?,") // battery - .or() - .number("(d{1,7}.d)?,") // odometer - .groupEnd() - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)") // time (hhmmss) - .text(",") - .number("(xxxx)") // count number - .text("$").optional() - .compile(); - - private static final Pattern PATTERN_BASIC = new PatternBuilder() - .text("+").expression("(?:RESP|BUFF)").text(":") - .expression("GT...,") - .number("(?:[0-9A-Z]{2}xxxx)?,").optional() // protocol version - .number("(d{15}|x{14}),") // imei - .any() - .number("(d{1,2})?,") // hdop - .number("(d{1,3}.d)?,") // speed - .number("(d{1,3})?,") // course - .number("(-?d{1,5}.d)?,") // altitude - .number("(-?d{1,3}.d{6})?,") // longitude - .number("(-?d{1,2}.d{6})?,") // latitude - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)").optional(2) // time (hhmmss) - .text(",") - .number("(d+),") // mcc - .number("(d+),") // mnc - .number("(x+),") // lac - .number("(x+),").optional(4) // cell - .any() - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd)").optional(2) // time (hhmmss) - .text(",") - .number("(xxxx)") // count number - .text("$").optional() - .compile(); - - private Object decodeAck(Channel channel, SocketAddress remoteAddress, String sentence, String type) { - Parser parser = new Parser(PATTERN_ACK, sentence); - if (parser.matches()) { - String protocolVersion = parser.next(); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - if (type.equals("HBD")) { - if (channel != null) { - parser.skip(6); - channel.write("+SACK:GTHBD," + protocolVersion + "," + parser.next() + "$", remoteAddress); - } - } else { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - getLastLocation(position, parser.nextDateTime()); - position.setValid(false); - position.set(Position.KEY_RESULT, "Command " + type + " accepted"); - return position; - } - } - return null; - } - - private Position initPosition(Parser parser, Channel channel, SocketAddress remoteAddress) { - if (parser.matches()) { - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession != null) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - return position; - } - } - return null; - } - - private void decodeDeviceTime(Position position, Parser parser) { - if (parser.hasNext(6)) { - if (ignoreFixTime) { - position.setTime(parser.nextDateTime()); - } else { - position.setDeviceTime(parser.nextDateTime()); - } - } - } - - private Object decodeInf(Channel channel, SocketAddress remoteAddress, String sentence) { - Parser parser = new Parser(PATTERN_INF, sentence); - Position position = initPosition(parser, channel, remoteAddress); - if (position == null) { - return null; - } - - switch (parser.nextHexInt()) { - case 0x16: - case 0x1A: - case 0x12: - position.set(Position.KEY_IGNITION, false); - position.set(Position.KEY_MOTION, true); - break; - case 0x11: - position.set(Position.KEY_IGNITION, false); - position.set(Position.KEY_MOTION, false); - break; - case 0x21: - position.set(Position.KEY_IGNITION, true); - position.set(Position.KEY_MOTION, false); - break; - case 0x22: - position.set(Position.KEY_IGNITION, true); - position.set(Position.KEY_MOTION, true); - break; - case 0x41: - position.set(Position.KEY_MOTION, false); - break; - case 0x42: - position.set(Position.KEY_MOTION, true); - break; - default: - break; - } - - position.set(Position.KEY_RSSI, parser.nextInt()); - - parser.next(); // odometer or external power - - position.set(Position.KEY_BATTERY, parser.nextDouble(0)); - position.set(Position.KEY_CHARGE, parser.nextInt(0) == 1); - - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt()); - - position.set(Position.PREFIX_TEMP + 1, parser.next()); - - position.set(Position.PREFIX_ADC + 1, parser.next()); - position.set(Position.PREFIX_ADC + 2, parser.next()); - - position.set(Position.KEY_INPUT, parser.next()); - position.set(Position.KEY_OUTPUT, parser.next()); - - getLastLocation(position, parser.nextDateTime()); - - position.set(Position.KEY_INDEX, parser.nextHexInt(0)); - - return position; - } - - private Object decodeVer(Channel channel, SocketAddress remoteAddress, String sentence) { - Parser parser = new Parser(PATTERN_VER, sentence); - Position position = initPosition(parser, channel, remoteAddress); - if (position == null) { - return null; - } - - position.set("deviceType", parser.next()); - position.set(Position.KEY_VERSION_FW, parser.nextHexInt(0)); - position.set(Position.KEY_VERSION_HW, parser.nextHexInt(0)); - - getLastLocation(position, parser.nextDateTime()); - - return position; - } - - private void decodeLocation(Position position, Parser parser) { - int hdop = parser.nextInt(0); - position.setValid(hdop > 0); - position.set(Position.KEY_HDOP, hdop); - - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - if (parser.hasNext(8)) { - position.setValid(true); - position.setLongitude(parser.nextDouble(0)); - position.setLatitude(parser.nextDouble(0)); - position.setTime(parser.nextDateTime()); - } else { - getLastLocation(position, null); - } - - if (parser.hasNext(6)) { - int mcc = parser.nextInt(0); - int mnc = parser.nextInt(0); - if (parser.hasNext(2)) { - position.setNetwork(new Network(CellTower.from(mcc, mnc, parser.nextInt(0), parser.nextInt(0)))); - } - if (parser.hasNext(2)) { - position.setNetwork(new Network(CellTower.from(mcc, mnc, parser.nextHexInt(0), parser.nextHexInt(0)))); - } - } - - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - } - - private Object decodeObd(Channel channel, SocketAddress remoteAddress, String sentence) { - Parser parser = new Parser(PATTERN_OBD, sentence); - Position position = initPosition(parser, channel, remoteAddress); - if (position == null) { - return null; - } - - position.set(Position.KEY_RPM, parser.nextInt()); - position.set(Position.KEY_OBD_SPEED, parser.nextInt()); - position.set(Position.PREFIX_TEMP + 1, parser.nextInt()); - position.set(Position.KEY_FUEL_CONSUMPTION, parser.next()); - position.set("dtcsClearedDistance", parser.nextInt()); - position.set("odbConnect", parser.nextInt(0) == 1); - position.set("dtcsNumber", parser.nextInt()); - position.set("dtcsCodes", parser.next()); - position.set(Position.KEY_THROTTLE, parser.nextInt()); - position.set(Position.KEY_FUEL_LEVEL, parser.nextInt()); - position.set(Position.KEY_OBD_ODOMETER, parser.nextInt(0) * 1000); - - decodeLocation(position, parser); - - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - - decodeDeviceTime(position, parser); - - return position; - } - - private void decodeStatus(Position position, Parser parser) { - if (parser.hasNext(3)) { - int ignition = parser.nextHexInt(0); - if (BitUtil.check(ignition, 4)) { - position.set(Position.KEY_IGNITION, false); - } else if (BitUtil.check(ignition, 5)) { - position.set(Position.KEY_IGNITION, true); - } - position.set(Position.KEY_INPUT, parser.nextHexInt(0)); - position.set(Position.KEY_OUTPUT, parser.nextHexInt(0)); - } - } - - private Object decodeFri(Channel channel, SocketAddress remoteAddress, String sentence) { - Parser parser = new Parser(PATTERN_FRI, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - LinkedList<Position> positions = new LinkedList<>(); - - String vin = parser.next(); - int power = parser.nextInt(0); - - Parser itemParser = new Parser(PATTERN_LOCATION, parser.next()); - while (itemParser.find()) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_VIN, vin); - - decodeLocation(position, itemParser); - - positions.add(position); - } - - Position position = positions.getLast(); - - decodeLocation(position, parser); - - // power value only on some devices - if (power > 10) { - position.set(Position.KEY_POWER, power); - } - - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt()); - - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - position.set(Position.KEY_HOURS, parser.next()); - position.set(Position.PREFIX_ADC + 1, parser.next()); - position.set(Position.PREFIX_ADC + 2, parser.next()); - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt()); - - decodeStatus(position, parser); - - position.set(Position.KEY_RPM, parser.nextInt()); - position.set(Position.KEY_FUEL_LEVEL, parser.nextInt()); - - decodeDeviceTime(position, parser); - if (ignoreFixTime) { - positions.clear(); - positions.add(position); - } - - return positions; - } - - private Object decodeEri(Channel channel, SocketAddress remoteAddress, String sentence) { - Parser parser = new Parser(PATTERN_ERI, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - LinkedList<Position> positions = new LinkedList<>(); - - int power = parser.nextInt(0); - - Parser itemParser = new Parser(PATTERN_LOCATION, parser.next()); - while (itemParser.find()) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - decodeLocation(position, itemParser); - - positions.add(position); - } - - Position position = positions.getLast(); - - decodeLocation(position, parser); - - position.set(Position.KEY_POWER, power); - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - position.set(Position.KEY_HOURS, parser.next()); - position.set(Position.PREFIX_ADC + 1, parser.next()); - position.set(Position.PREFIX_ADC + 2, parser.next()); - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt()); - - decodeStatus(position, parser); - - int index = 0; - String[] data = parser.next().split(","); - if (data.length > 1) { - int deviceType = Integer.parseInt(data[index++]); - if (deviceType == 2) { - int deviceCount = Integer.parseInt(data[index++]); - for (int i = 1; i <= deviceCount; i++) { - index++; // id - index++; // type - position.set(Position.PREFIX_TEMP + i, (short) Integer.parseInt(data[index++], 16) * 0.0625); - } - } - } - - decodeDeviceTime(position, parser); - if (ignoreFixTime) { - positions.clear(); - positions.add(position); - } - - return positions; - } - - private Object decodeIgn(Channel channel, SocketAddress remoteAddress, String sentence) { - Parser parser = new Parser(PATTERN_IGN, sentence); - Position position = initPosition(parser, channel, remoteAddress); - if (position == null) { - return null; - } - - decodeLocation(position, parser); - - position.set(Position.KEY_HOURS, parser.next()); - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - - decodeDeviceTime(position, parser); - - return position; - } - - private Object decodeIda(Channel channel, SocketAddress remoteAddress, String sentence) { - Parser parser = new Parser(PATTERN_IDA, sentence); - Position position = initPosition(parser, channel, remoteAddress); - if (position == null) { - return null; - } - - position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next()); - - decodeLocation(position, parser); - - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - - decodeDeviceTime(position, parser); - - return position; - } - - private Object decodeWif(Channel channel, SocketAddress remoteAddress, String sentence) { - Parser parser = new Parser(PATTERN_WIF, sentence); - Position position = initPosition(parser, channel, remoteAddress); - if (position == null) { - return null; - } - - getLastLocation(position, null); - - Network network = new Network(); - - parser.nextInt(0); // count - Matcher matcher = Pattern.compile("([0-9a-fA-F]{12}),(-?\\d+),,,,").matcher(parser.next()); - while (matcher.find()) { - String mac = matcher.group(1).replaceAll("(..)", "$1:"); - network.addWifiAccessPoint(WifiAccessPoint.from( - mac.substring(0, mac.length() - 1), Integer.parseInt(matcher.group(2)))); - } - - position.setNetwork(network); - - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt(0)); - - return position; - } - - private Object decodeGsm(Channel channel, SocketAddress remoteAddress, String sentence) { - Parser parser = new Parser(PATTERN_GSM, sentence); - Position position = initPosition(parser, channel, remoteAddress); - if (position == null) { - return null; - } - - getLastLocation(position, null); - - Network network = new Network(); - - String[] data = parser.next().split(","); - for (int i = 0; i < 6; i++) { - if (!data[i * 6].isEmpty()) { - network.addCellTower(CellTower.from( - Integer.parseInt(data[i * 6]), Integer.parseInt(data[i * 6 + 1]), - Integer.parseInt(data[i * 6 + 2], 16), Integer.parseInt(data[i * 6 + 3], 16), - Integer.parseInt(data[i * 6 + 4]))); - } - } - - position.setNetwork(network); - - return position; - } - - private Object decodeOther(Channel channel, SocketAddress remoteAddress, String sentence, String type) { - Parser parser = new Parser(PATTERN, sentence); - Position position = initPosition(parser, channel, remoteAddress); - if (position == null) { - return null; - } - - int reportType = parser.nextInt(0); - if (type.equals("NMR")) { - position.set(Position.KEY_MOTION, reportType == 1); - } else if (type.equals("SOS")) { - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - } - - decodeLocation(position, parser); - - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt(0)); - - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - - decodeDeviceTime(position, parser); - - if (Context.getConfig().getBoolean(getProtocolName() + ".ack") && channel != null) { - channel.write("+SACK:" + parser.next() + "$", remoteAddress); - } - - return position; - } - - private Object decodeBasic(Channel channel, SocketAddress remoteAddress, String sentence, String type) { - Parser parser = new Parser(PATTERN_BASIC, sentence); - Position position = initPosition(parser, channel, remoteAddress); - if (position == null) { - return null; - } - - int hdop = parser.nextInt(0); - position.setValid(hdop > 0); - position.set(Position.KEY_HDOP, hdop); - - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - if (parser.hasNext(2)) { - position.setLongitude(parser.nextDouble(0)); - position.setLatitude(parser.nextDouble(0)); - } else { - getLastLocation(position, null); - } - - if (parser.hasNext(6)) { - position.setTime(parser.nextDateTime()); - } - - if (parser.hasNext(4)) { - position.setNetwork(new Network(CellTower.from( - parser.nextInt(0), parser.nextInt(0), parser.nextHexInt(0), parser.nextHexInt(0)))); - } - - decodeDeviceTime(position, parser); - - switch (type) { - case "PNA": - position.set(Position.KEY_ALARM, Position.ALARM_POWER_ON); - break; - case "PFA": - position.set(Position.KEY_ALARM, Position.ALARM_POWER_OFF); - break; - case "EPN": - position.set(Position.KEY_ALARM, Position.ALARM_POWER_RESTORED); - break; - case "EPF": - position.set(Position.KEY_ALARM, Position.ALARM_POWER_CUT); - break; - case "BPL": - position.set(Position.KEY_ALARM, Position.ALARM_LOW_BATTERY); - break; - case "STT": - position.set(Position.KEY_ALARM, Position.ALARM_MOVEMENT); - break; - case "SWG": - position.set(Position.KEY_ALARM, Position.ALARM_GEOFENCE); - break; - case "TMP": - case "TEM": - position.set(Position.KEY_ALARM, Position.ALARM_TEMPERATURE); - break; - case "JDR": - case "JDS": - position.set(Position.KEY_ALARM, Position.ALARM_JAMMING); - break; - default: - break; - } - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = ((ChannelBuffer) msg).toString(StandardCharsets.US_ASCII); - - int typeIndex = sentence.indexOf(":GT"); - if (typeIndex < 0) { - return null; - } - - Object result; - String type = sentence.substring(typeIndex + 3, typeIndex + 6); - if (sentence.startsWith("+ACK")) { - result = decodeAck(channel, remoteAddress, sentence, type); - } else { - switch (type) { - case "INF": - result = decodeInf(channel, remoteAddress, sentence); - break; - case "OBD": - result = decodeObd(channel, remoteAddress, sentence); - break; - case "FRI": - result = decodeFri(channel, remoteAddress, sentence); - break; - case "ERI": - result = decodeEri(channel, remoteAddress, sentence); - break; - case "IGN": - case "IGF": - result = decodeIgn(channel, remoteAddress, sentence); - break; - case "IDA": - result = decodeIda(channel, remoteAddress, sentence); - break; - case "WIF": - result = decodeWif(channel, remoteAddress, sentence); - break; - case "GSM": - result = decodeGsm(channel, remoteAddress, sentence); - break; - case "VER": - result = decodeVer(channel, remoteAddress, sentence); - break; - default: - result = decodeOther(channel, remoteAddress, sentence, type); - break; - } - - if (result == null) { - result = decodeBasic(channel, remoteAddress, sentence, type); - } - - if (result != null) { - if (result instanceof Position) { - ((Position) result).set(Position.KEY_TYPE, type); - } else { - for (Position p : (List<Position>) result) { - p.set(Position.KEY_TYPE, type); - } - } - } - } - - return result; - } - -} diff --git a/src/org/traccar/protocol/GlobalSatProtocol.java b/src/org/traccar/protocol/GlobalSatProtocol.java deleted file mode 100644 index f3d07fc96..000000000 --- a/src/org/traccar/protocol/GlobalSatProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class GlobalSatProtocol extends BaseProtocol { - - public GlobalSatProtocol() { - super("globalsat"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '!')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new GlobalSatProtocolDecoder(GlobalSatProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/GlobalSatProtocolDecoder.java b/src/org/traccar/protocol/GlobalSatProtocolDecoder.java deleted file mode 100644 index c45a937d4..000000000 --- a/src/org/traccar/protocol/GlobalSatProtocolDecoder.java +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright 2013 - 2014 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.Context; -import org.traccar.DeviceSession; -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 GlobalSatProtocolDecoder extends BaseProtocolDecoder { - - private String format0; - private String format1; - - public GlobalSatProtocolDecoder(GlobalSatProtocol protocol) { - super(protocol); - - format0 = Context.getConfig().getString(getProtocolName() + ".format0", "TSPRXAB27GHKLMnaicz*U!"); - format1 = Context.getConfig().getString(getProtocolName() + ".format1", "SARY*U!"); - } - - public void setFormat0(String format) { - format0 = format; - } - - public void setFormat1(String format) { - format1 = format; - } - - private Position decodeOriginal(Channel channel, SocketAddress remoteAddress, String sentence) { - - if (channel != null) { - channel.write("ACK\r"); - } - - String format; - if (sentence.startsWith("GSr")) { - format = format0; - } else if (sentence.startsWith("GSh")) { - format = format1; - } else { - return null; - } - - // Check that message contains required parameters - if (!format.contains("B") || !format.contains("S") || !(format.contains("1") - || format.contains("2") || format.contains("3")) || !(format.contains("6") - || format.contains("7") || format.contains("8"))) { - return null; - } - - if (format.contains("*")) { - format = format.substring(0, format.indexOf('*')); - sentence = sentence.substring(0, sentence.indexOf('*')); - } - String[] values = sentence.split(","); - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - for (int formatIndex = 0, valueIndex = 1; formatIndex < format.length() - && valueIndex < values.length; formatIndex++) { - String value = values[valueIndex]; - - switch (format.charAt(formatIndex)) { - case 'S': - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, value); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - break; - case 'A': - if (value.isEmpty()) { - position.setValid(false); - } else { - position.setValid(Integer.parseInt(value) != 1); - } - break; - case 'B': - DateBuilder dateBuilder = new DateBuilder() - .setDay(Integer.parseInt(value.substring(0, 2))) - .setMonth(Integer.parseInt(value.substring(2, 4))) - .setYear(Integer.parseInt(value.substring(4))); - value = values[++valueIndex]; - dateBuilder - .setHour(Integer.parseInt(value.substring(0, 2))) - .setMinute(Integer.parseInt(value.substring(2, 4))) - .setSecond(Integer.parseInt(value.substring(4))); - position.setTime(dateBuilder.getDate()); - break; - case 'C': - valueIndex += 1; - break; - case '1': - double longitude = Double.parseDouble(value.substring(1)); - if (value.charAt(0) == 'W') { - longitude = -longitude; - } - position.setLongitude(longitude); - break; - case '2': - longitude = Double.parseDouble(value.substring(4)) / 60; - longitude += Integer.parseInt(value.substring(1, 4)); - if (value.charAt(0) == 'W') { - longitude = -longitude; - } - position.setLongitude(longitude); - break; - case '3': - position.setLongitude(Double.parseDouble(value) * 0.000001); - break; - case '6': - double latitude = Double.parseDouble(value.substring(1)); - if (value.charAt(0) == 'S') { - latitude = -latitude; - } - position.setLatitude(latitude); - break; - case '7': - latitude = Double.parseDouble(value.substring(3)) / 60; - latitude += Integer.parseInt(value.substring(1, 3)); - if (value.charAt(0) == 'S') { - latitude = -latitude; - } - position.setLatitude(latitude); - break; - case '8': - position.setLatitude(Double.parseDouble(value) * 0.000001); - break; - case 'G': - position.setAltitude(Double.parseDouble(value)); - break; - case 'H': - position.setSpeed(Double.parseDouble(value)); - break; - case 'I': - position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble(value))); - break; - case 'J': - position.setSpeed(UnitsConverter.knotsFromMph(Double.parseDouble(value))); - break; - case 'K': - position.setCourse(Double.parseDouble(value)); - break; - case 'N': - if (value.endsWith("mV")) { - position.set(Position.KEY_BATTERY, - Integer.parseInt(value.substring(0, value.length() - 2)) / 1000.0); - } else { - position.set(Position.KEY_BATTERY_LEVEL, Integer.parseInt(value)); - } - break; - default: - // Unsupported - break; - } - - valueIndex += 1; - } - return position; - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$") - .number("(d+),") // imei - .number("d+,") // mode - .number("(d+),") // fix - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(dd)(dd)(dd),") // time (hhmmss) - .expression("([EW])") - .number("(ddd)(dd.d+),") // longitude (dddmm.mmmm) - .expression("([NS])") - .number("(dd)(dd.d+),") // latitude (ddmm.mmmm) - .number("(d+.?d*),") // altitude - .number("(d+.?d*),") // speed - .number("(d+.?d*)?,") // course - .number("(d+)[,*]") // satellites - .number("(d+.?d*)") // hdop - .compile(); - - private Position decodeAlternative(Channel channel, SocketAddress remoteAddress, String sentence) { - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(!parser.next().equals("1")); - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setAltitude(parser.nextDouble(0)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - position.set(Position.KEY_HDOP, parser.nextDouble()); - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.startsWith("GS")) { - return decodeOriginal(channel, remoteAddress, sentence); - } else if (sentence.startsWith("$")) { - return decodeAlternative(channel, remoteAddress, sentence); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/GnxProtocol.java b/src/org/traccar/protocol/GnxProtocol.java deleted file mode 100644 index 84af24000..000000000 --- a/src/org/traccar/protocol/GnxProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class GnxProtocol extends BaseProtocol { - - public GnxProtocol() { - super("gnx"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "\n\r")); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new GnxProtocolDecoder(GnxProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/GnxProtocolDecoder.java b/src/org/traccar/protocol/GnxProtocolDecoder.java deleted file mode 100644 index 2274ec164..000000000 --- a/src/org/traccar/protocol/GnxProtocolDecoder.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2016 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class GnxProtocolDecoder extends BaseProtocolDecoder { - - public GnxProtocolDecoder(GnxProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN_LOCATION = new PatternBuilder() - .number("(d+),") // imei - .number("d+,") // length - .expression("([01]),") // history - .number("(dd)(dd)(dd),") // device time (hhmmss) - .number("(dd)(dd)(dd),") // device date (ddmmyy) - .number("(dd)(dd)(dd),") // fix time (hhmmss) - .number("(dd)(dd)(dd),") // fix date (ddmmyy) - .number("(d),") // valid - .number("(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd.d+),") // longitude - .expression("([EW]),") - .compile(); - - private static final Pattern PATTERN_MIF = new PatternBuilder() - .text("$GNX_MIF,") - .expression(PATTERN_LOCATION.pattern()) - .expression("[01],") // valid card - .expression("([^,]+),") // rfid - .any() - .compile(); - - private static final Pattern PATTERN_OTHER = new PatternBuilder() - .text("$GNX_") - .expression("...,") - .expression(PATTERN_LOCATION.pattern()) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - String type = sentence.substring(5, 8); - - Pattern pattern; - if (type.equals("MIF")) { - pattern = PATTERN_MIF; - } else { - pattern = PATTERN_OTHER; - } - - Parser parser = new Parser(pattern, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - if (parser.nextInt(0) == 1) { - position.set(Position.KEY_ARCHIVE, true); - } - - position.setDeviceTime(parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY, "GMT+5:30")); - position.setFixTime(parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY, "GMT+5:30")); - - position.setValid(parser.nextInt(0) != 0); - - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM)); - - if (type.equals("MIF")) { - position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next()); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/GoSafeProtocol.java b/src/org/traccar/protocol/GoSafeProtocol.java deleted file mode 100644 index bfd473df9..000000000 --- a/src/org/traccar/protocol/GoSafeProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class GoSafeProtocol extends BaseProtocol { - - public GoSafeProtocol() { - super("gosafe"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '#')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new GoSafeProtocolDecoder(GoSafeProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/GoSafeProtocolDecoder.java b/src/org/traccar/protocol/GoSafeProtocolDecoder.java deleted file mode 100644 index f9aaae0ce..000000000 --- a/src/org/traccar/protocol/GoSafeProtocolDecoder.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright 2015 - 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.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.regex.Pattern; - -public class GoSafeProtocolDecoder extends BaseProtocolDecoder { - - public GoSafeProtocolDecoder(GoSafeProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("*GS") // header - .number("d+,") // protocol version - .number("(d+),") // imei - .number("(dd)(dd)(dd)") // time (hhmmss) - .number("(dd)(dd)(dd),") // date (ddmmyy) - .expression("(.*)#?") // data - .compile(); - - private static final Pattern PATTERN_ITEM = new PatternBuilder() - .number("(x+)?,").optional() // event - .groupBegin() - .text("SYS:") - .expression("[^,]*,") - .groupEnd("?") - .groupBegin() - .text("GPS:") - .expression("([AV]);") // validity - .number("(d+);") // satellites - .number("([NS])(d+.d+);") // latitude - .number("([EW])(d+.d+);") // longitude - .number("(d+)?;") // speed - .number("(d+);") // course - .number("(d+);") // altitude - .number("(d+.d+)") // hdop - .number(";(d+.d+)").optional() // vdop - .expression(",?") - .groupEnd() - .groupBegin() - .text("GSM:") - .number("d*;") // registration - .number("d*;") // gsm signal - .number("(d+);") // mcc - .number("(d+);") // mnc - .number("(x+);") // lac - .number("(x+);") // cid - .number("(-d+)") // rssi - .expression("[^,]*,?") - .groupEnd("?") - .groupBegin() - .text("COT:") - .number("(d+)") // odometer - .number("(?:;d+:d+:d+)?") // engine hours - .expression(",?") - .groupEnd("?") - .groupBegin() - .text("ADC:") - .number("(d+.d+)") // power - .number("(?:;(d+.d+))?,?") // battery - .groupEnd("?") - .groupBegin() - .text("DTT:") - .number("(x+);") // status - .number("(x+)?;") // io - .number("(x+);") // geo-fence 0-119 - .number("(x+);") // geo-fence 120-155 - .number("(x+)") // event status - .number("(?:;(x+))?,?") // packet type - .groupEnd("?") - .groupBegin() - .text("ETD:").expression("([^,]+),?") - .groupEnd("?") - .groupBegin() - .text("OBD:") - .number("(x+),?") - .groupEnd("?") - .groupBegin() - .text("FUL:").expression("[^,]*,?") - .groupEnd("?") - .groupBegin() - .text("TRU:").expression("[^,]*,?") - .groupEnd("?") - .groupBegin() - .text("TAG:").expression("([^,]+),?") - .groupEnd("?") - .compile(); - - private static final Pattern PATTERN_OLD = new PatternBuilder() - .text("*GS") // header - .number("d+,") // protocol version - .number("(d+),") // imei - .text("GPS:") - .number("(dd)(dd)(dd);") // time (hhmmss) - .number("d;").optional() // fix type - .expression("([AV]);") // validity - .number("([NS])(d+.d+);") // latitude - .number("([EW])(d+.d+);") // longitude - .number("(d+)?;") // speed - .number("(d+);") // course - .number("(d+.?d*)").optional() // hdop - .number("(dd)(dd)(dd)") // date (ddmmyy) - .any() - .compile(); - - private Position decodePosition(DeviceSession deviceSession, Parser parser, Date time) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - if (time != null) { - position.setTime(time); - } - - position.set(Position.KEY_EVENT, parser.next()); - - position.setValid(parser.next().equals("A")); - position.set(Position.KEY_SATELLITES, parser.nextInt()); - - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - position.set(Position.KEY_HDOP, parser.nextDouble(0)); - position.set(Position.KEY_VDOP, parser.nextDouble(0)); - - if (parser.hasNext(5)) { - position.setNetwork(new Network(CellTower.from(parser.nextInt(0), parser.nextInt(0), - parser.nextHexInt(0), parser.nextHexInt(0), parser.nextInt(0)))); - } - if (parser.hasNext()) { - position.set(Position.KEY_ODOMETER, parser.nextInt(0)); - } - position.set(Position.KEY_POWER, parser.nextDouble()); - position.set(Position.KEY_BATTERY, parser.nextDouble()); - - if (parser.hasNext(6)) { - long status = parser.nextLong(16, 0); - position.set(Position.KEY_IGNITION, BitUtil.check(status, 13)); - position.set(Position.KEY_STATUS, status); - position.set("ioStatus", parser.next()); - position.set(Position.KEY_GEOFENCE, parser.next() + parser.next()); - position.set("eventStatus", parser.next()); - position.set("packetType", parser.next()); - } - - if (parser.hasNext()) { - position.set("eventData", parser.next()); - } - - if (parser.hasNext()) { - position.set("obd", parser.next()); - } - - if (parser.hasNext()) { - position.set("tagData", parser.next()); - } - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - if (channel != null) { - channel.write("1234"); - } - - String sentence = (String) msg; - Pattern pattern = PATTERN; - if (sentence.startsWith("*GS02")) { - pattern = PATTERN_OLD; - } - - Parser parser = new Parser(pattern, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - if (pattern == PATTERN_OLD) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_HDOP, parser.next()); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return position; - - } else { - - Date time = null; - if (parser.hasNext(6)) { - time = parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY); - } - - List<Position> positions = new LinkedList<>(); - Parser itemParser = new Parser(PATTERN_ITEM, parser.next()); - while (itemParser.find()) { - positions.add(decodePosition(deviceSession, itemParser, time)); - } - - return positions; - - } - } - -} diff --git a/src/org/traccar/protocol/GotopProtocol.java b/src/org/traccar/protocol/GotopProtocol.java deleted file mode 100644 index 5d522adf5..000000000 --- a/src/org/traccar/protocol/GotopProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class GotopProtocol extends BaseProtocol { - - public GotopProtocol() { - super("gotop"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '#')); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new GotopProtocolDecoder(GotopProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/GotopProtocolDecoder.java b/src/org/traccar/protocol/GotopProtocolDecoder.java deleted file mode 100644 index f938887e2..000000000 --- a/src/org/traccar/protocol/GotopProtocolDecoder.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2013 - 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -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 GotopProtocolDecoder extends BaseProtocolDecoder { - - public GotopProtocolDecoder(GotopProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("(d+),") // imei - .expression("[^,]+,") // type - .expression("([AV]),") // validity - .number("DATE:(dd)(dd)(dd),") // date (yyddmm) - .number("TIME:(dd)(dd)(dd),") // time (hhmmss) - .number("LAT:(d+.d+)([NS]),") // latitude - .number("LOT:(d+.d+)([EW]),") // longitude - .text("Speed:").number("(d+.d+),") // speed - .expression("([^,]+),") // status - .number("(d+)?") // course - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(parser.next().equals("A")); - - position.setTime(parser.nextDateTime()); - - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - - position.set(Position.KEY_STATUS, parser.next()); - - position.setCourse(parser.nextDouble(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/Gps056FrameDecoder.java b/src/org/traccar/protocol/Gps056FrameDecoder.java deleted file mode 100644 index 4ce83dc0a..000000000 --- a/src/org/traccar/protocol/Gps056FrameDecoder.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -import java.nio.charset.StandardCharsets; - -public class Gps056FrameDecoder extends FrameDecoder { - - private static final int MESSAGE_HEADER = 4; - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() >= MESSAGE_HEADER) { - int length = Integer.parseInt(buf.toString(2, 2, StandardCharsets.US_ASCII)) + 5; - if (buf.readableBytes() >= length) { - ChannelBuffer frame = buf.readBytes(length); - while (buf.readable() && buf.getUnsignedByte(buf.readerIndex()) != '$') { - buf.readByte(); - } - return frame; - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Gps056Protocol.java b/src/org/traccar/protocol/Gps056Protocol.java deleted file mode 100644 index 33c190ad2..000000000 --- a/src/org/traccar/protocol/Gps056Protocol.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class Gps056Protocol extends BaseProtocol { - - public Gps056Protocol() { - super("gps056"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new Gps056FrameDecoder()); - pipeline.addLast("objectDecoder", new Gps056ProtocolDecoder(Gps056Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Gps056ProtocolDecoder.java b/src/org/traccar/protocol/Gps056ProtocolDecoder.java deleted file mode 100644 index 7248365b0..000000000 --- a/src/org/traccar/protocol/Gps056ProtocolDecoder.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; - -public class Gps056ProtocolDecoder extends BaseProtocolDecoder { - - public Gps056ProtocolDecoder(Gps056Protocol protocol) { - super(protocol); - } - - private static void sendResponse(Channel channel, String type, String imei, ChannelBuffer content) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - String header = "*" + type + imei; - response.writeBytes(header.getBytes(StandardCharsets.US_ASCII)); - if (content != null) { - response.writeBytes(content); - } - response.writeByte('#'); - channel.write(response); - } - } - - private static double decodeCoordinate(ChannelBuffer buf) { - double degrees = buf.getUnsignedShort(buf.readerIndex()) / 100; - double minutes = buf.readUnsignedShort() % 100 + buf.readUnsignedShort() * 0.0001; - degrees += minutes / 60; - byte hemisphere = buf.readByte(); - if (hemisphere == 'S' || hemisphere == 'W') { - degrees = -degrees; - } - return degrees; - } - - private static void decodeStatus(ChannelBuffer buf, Position position) { - - position.set(Position.KEY_INPUT, buf.readUnsignedByte()); - position.set(Position.KEY_OUTPUT, buf.readUnsignedByte()); - - position.set(Position.PREFIX_ADC + 1, ChannelBuffers.swapShort(buf.readShort()) * 5.06); // mV - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - buf.skipBytes(2); // length - - String type = buf.readBytes(7).toString(StandardCharsets.US_ASCII); - String imei = buf.readBytes(15).toString(StandardCharsets.US_ASCII); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - - if (type.startsWith("LOGN")) { - - sendResponse(channel, "LGSA" + type.substring(4), imei, - ChannelBuffers.copiedBuffer("1", StandardCharsets.US_ASCII)); - - } else if (type.startsWith("GPSL")) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setDateReverse(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - - position.setValid(true); - position.setTime(dateBuilder.getDate()); - position.setLatitude(decodeCoordinate(buf)); - position.setLongitude(decodeCoordinate(buf)); - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - position.setCourse(buf.readUnsignedShort()); - - decodeStatus(buf, position); - - sendResponse(channel, "GPSA" + type.substring(4), imei, buf.readBytes(2)); - - return position; - - } else if (type.startsWith("SYNC")) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, null); - - decodeStatus(buf, position); - - sendResponse(channel, "SYSA" + type.substring(4), imei, null); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Gps103Protocol.java b/src/org/traccar/protocol/Gps103Protocol.java deleted file mode 100644 index a5bd32261..000000000 --- a/src/org/traccar/protocol/Gps103Protocol.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class Gps103Protocol extends BaseProtocol { - - public Gps103Protocol() { - super("gps103"); - setSupportedDataCommands( - Command.TYPE_CUSTOM, - Command.TYPE_POSITION_SINGLE, - Command.TYPE_POSITION_PERIODIC, - Command.TYPE_POSITION_STOP, - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME, - Command.TYPE_ALARM_ARM, - Command.TYPE_ALARM_DISARM, - Command.TYPE_REQUEST_PHOTO); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(2048, "\r\n", "\n", ";")); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectEncoder", new Gps103ProtocolEncoder()); - pipeline.addLast("objectDecoder", new Gps103ProtocolDecoder(Gps103Protocol.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 Gps103ProtocolEncoder()); - pipeline.addLast("objectDecoder", new Gps103ProtocolDecoder(Gps103Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Gps103ProtocolDecoder.java b/src/org/traccar/protocol/Gps103ProtocolDecoder.java deleted file mode 100644 index 099047aa0..000000000 --- a/src/org/traccar/protocol/Gps103ProtocolDecoder.java +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Copyright 2012 - 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class Gps103ProtocolDecoder extends BaseProtocolDecoder { - - public Gps103ProtocolDecoder(Gps103Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("imei:") - .number("(d+),") // imei - .expression("([^,]+),") // alarm - .number("(dd)/?(dd)/?(dd) ?") // local date (yymmdd) - .number("(dd):?(dd)(?:dd)?,") // local time (hhmmss) - .expression("([^,]+)?,") // rfid - .expression("[FL],") // full / low - .groupBegin() - .number("(dd)(dd)(dd).d+") // time utc (hhmmss) - .or() - .number("(?:d{1,5}.d+)?") - .groupEnd() - .text(",") - .expression("([AV]),") // validity - .expression("([NS]),").optional() - .number("(d+)(dd.d+),") // latitude (ddmm.mmmm) - .expression("([NS]),").optional() - .expression("([EW]),").optional() - .number("(d+)(dd.d+),") // longitude (dddmm.mmmm) - .expression("([EW])?,").optional() - .number("(d+.?d*)?,?") // speed - .number("(d+.?d*)?,?") // course - .number("(d+.?d*)?,?") // altitude - .expression("([^,;]+)?,?") - .expression("([^,;]+)?,?") - .expression("([^,;]+)?,?") - .expression("([^,;]+)?,?") - .expression("([^,;]+)?,?") - .any() - .compile(); - - private static final Pattern PATTERN_NETWORK = new PatternBuilder() - .text("imei:") - .number("(d+),") // imei - .expression("[^,]+,") // alarm - .number("d*,,") - .text("L,,,") - .number("(x+),,") // lac - .number("(x+),,,") // cid - .any() - .compile(); - - private static final Pattern PATTERN_HANDSHAKE = new PatternBuilder() - .number("##,imei:(d+),A") - .compile(); - - private static final Pattern PATTERN_OBD = new PatternBuilder() - .text("imei:") - .number("(d+),") // imei - .expression("OBD,") // type - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(d+),") // odometer - .number("(d+.d+)?,") // fuel instant - .number("(d+.d+)?,") // fuel average - .number("(d+)?,") // hours - .number("(d+),") // speed - .number("(d+.?d*%),") // power load - .number("(?:([-+]?d+)|[-+]?),") // temperature - .number("(d+.?d*%),") // throttle - .number("(d+),") // rpm - .number("(d+.d+),") // battery - .number("([^;]*)") // dtcs - .any() - .compile(); - - private String decodeAlarm(String value) { - if (value.startsWith("T:")) { - return Position.ALARM_TEMPERATURE; - } else if (value.startsWith("oil")) { - return Position.ALARM_OIL_LEAK; - } - switch (value) { - case "tracker": - return null; - case "help me": - return Position.ALARM_SOS; - case "low battery": - return Position.ALARM_LOW_BATTERY; - case "stockade": - return Position.ALARM_GEOFENCE; - case "move": - return Position.ALARM_MOVEMENT; - case "speed": - return Position.ALARM_OVERSPEED; - case "acc on": - return Position.ALARM_POWER_ON; - case "acc off": - return Position.ALARM_POWER_OFF; - case "door alarm": - return Position.ALARM_DOOR; - case "ac alarm": - return Position.ALARM_POWER_CUT; - case "accident alarm": - return Position.ALARM_ACCIDENT; - case "sensor alarm": - return Position.ALARM_SHOCK; - case "bonnet alarm": - return Position.ALARM_BONNET; - case "footbrake alarm": - return Position.ALARM_FOOT_BRAKE; - case "DTC": - return Position.ALARM_FAULT; - default: - return null; - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - // Send response #1 - if (sentence.contains("##")) { - if (channel != null) { - channel.write("LOAD", remoteAddress); - Parser handshakeParser = new Parser(PATTERN_HANDSHAKE, sentence); - if (handshakeParser.matches()) { - getDeviceSession(channel, remoteAddress, handshakeParser.next()); - } - } - return null; - } - - // Send response #2 - if (!sentence.isEmpty() && Character.isDigit(sentence.charAt(0))) { - if (channel != null) { - channel.write("ON", remoteAddress); - } - int start = sentence.indexOf("imei:"); - if (start >= 0) { - sentence = sentence.substring(start); - } else { - return null; - } - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - Parser parser = new Parser(PATTERN_NETWORK, sentence); - if (parser.matches()) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, null); - - position.setNetwork(new Network( - CellTower.fromLacCid(parser.nextHexInt(0), parser.nextHexInt(0)))); - - return position; - - } - - parser = new Parser(PATTERN_OBD, sentence); - if (parser.matches()) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, parser.nextDateTime()); - - position.set(Position.KEY_ODOMETER, parser.nextInt(0)); - parser.nextDouble(0); // instant fuel consumption - position.set(Position.KEY_FUEL_CONSUMPTION, parser.nextDouble(0)); - position.set(Position.KEY_HOURS, parser.nextInt()); - position.set(Position.KEY_OBD_SPEED, parser.nextInt(0)); - position.set(Position.KEY_ENGINE_LOAD, parser.next()); - position.set(Position.KEY_COOLANT_TEMP, parser.nextInt()); - position.set(Position.KEY_THROTTLE, parser.next()); - position.set(Position.KEY_RPM, parser.nextInt(0)); - position.set(Position.KEY_BATTERY, parser.nextDouble(0)); - position.set(Position.KEY_DTCS, parser.next().replace(',', ' ').trim()); - - return position; - - } - - parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - String imei = parser.next(); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - String alarm = parser.next(); - position.set(Position.KEY_ALARM, decodeAlarm(alarm)); - if (alarm.equals("help me")) { - if (channel != null) { - channel.write("**,imei:" + imei + ",E;", remoteAddress); - } - } else if (alarm.equals("acc on")) { - position.set(Position.KEY_IGNITION, true); - } else if (alarm.equals("acc off")) { - position.set(Position.KEY_IGNITION, false); - } else if (alarm.startsWith("T:")) { - position.set(Position.PREFIX_TEMP + 1, alarm.substring(2)); - } else if (alarm.startsWith("oil ")) { - position.set("oil", alarm.substring(4)); - } else if (!position.getAttributes().containsKey(Position.KEY_ALARM) && !alarm.equals("tracker")) { - position.set(Position.KEY_EVENT, alarm); - } - - DateBuilder dateBuilder = new DateBuilder() - .setDate(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - int localHours = parser.nextInt(0); - int localMinutes = parser.nextInt(0); - - String rfid = parser.next(); - if (alarm.equals("rfid")) { - position.set(Position.KEY_DRIVER_UNIQUE_ID, rfid); - } - - String utcHours = parser.next(); - String utcMinutes = parser.next(); - - dateBuilder.setTime(localHours, localMinutes, parser.nextInt(0)); - - // Timezone calculation - if (utcHours != null && utcMinutes != null) { - int deltaMinutes = (localHours - Integer.parseInt(utcHours)) * 60; - deltaMinutes += localMinutes - Integer.parseInt(utcMinutes); - if (deltaMinutes <= -12 * 60) { - deltaMinutes += 24 * 60; - } else if (deltaMinutes > 12 * 60) { - deltaMinutes -= 24 * 60; - } - dateBuilder.addMinute(-deltaMinutes); - } - position.setTime(dateBuilder.getDate()); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN_HEM)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN_HEM)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - for (int i = 1; i <= 5; i++) { - position.set(Position.PREFIX_IO + i, parser.next()); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/Gps103ProtocolEncoder.java b/src/org/traccar/protocol/Gps103ProtocolEncoder.java deleted file mode 100644 index 36801b401..000000000 --- a/src/org/traccar/protocol/Gps103ProtocolEncoder.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class Gps103ProtocolEncoder extends StringProtocolEncoder implements StringProtocolEncoder.ValueFormatter { - - @Override - public String formatValue(String key, Object value) { - - if (key.equals(Command.KEY_FREQUENCY)) { - long frequency = ((Number) value).longValue(); - if (frequency / 60 / 60 > 0) { - return String.format("%02dh", frequency / 60 / 60); - } else if (frequency / 60 > 0) { - return String.format("%02dm", frequency / 60); - } else { - return String.format("%02ds", frequency); - } - } - - return null; - } - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_CUSTOM: - return formatCommand(command, "**,imei:{%s},{%s}", Command.KEY_UNIQUE_ID, Command.KEY_DATA); - case Command.TYPE_POSITION_STOP: - return formatCommand(command, "**,imei:{%s},A", Command.KEY_UNIQUE_ID); - case Command.TYPE_POSITION_SINGLE: - return formatCommand(command, "**,imei:{%s},B", Command.KEY_UNIQUE_ID); - case Command.TYPE_POSITION_PERIODIC: - return formatCommand( - command, "**,imei:{%s},C,{%s}", this, Command.KEY_UNIQUE_ID, Command.KEY_FREQUENCY); - case Command.TYPE_ENGINE_STOP: - return formatCommand(command, "**,imei:{%s},J", Command.KEY_UNIQUE_ID); - case Command.TYPE_ENGINE_RESUME: - return formatCommand(command, "**,imei:{%s},K", Command.KEY_UNIQUE_ID); - case Command.TYPE_ALARM_ARM: - return formatCommand(command, "**,imei:{%s},L", Command.KEY_UNIQUE_ID); - case Command.TYPE_ALARM_DISARM: - return formatCommand(command, "**,imei:{%s},M", Command.KEY_UNIQUE_ID); - case Command.TYPE_REQUEST_PHOTO: - return formatCommand(command, "**,imei:{%s},160", Command.KEY_UNIQUE_ID); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/GpsGateProtocol.java b/src/org/traccar/protocol/GpsGateProtocol.java deleted file mode 100644 index c7dc2c4f3..000000000 --- a/src/org/traccar/protocol/GpsGateProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2015 - 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class GpsGateProtocol extends BaseProtocol { - - public GpsGateProtocol() { - super("gpsgate"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "\0", "\n", "\r\n")); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new GpsGateProtocolDecoder(GpsGateProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/GpsGateProtocolDecoder.java b/src/org/traccar/protocol/GpsGateProtocolDecoder.java deleted file mode 100644 index ca1d6453e..000000000 --- a/src/org/traccar/protocol/GpsGateProtocolDecoder.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright 2013 - 2016 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.helper.Checksum; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class GpsGateProtocolDecoder extends BaseProtocolDecoder { - - public GpsGateProtocolDecoder(GpsGateProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN_GPRMC = new PatternBuilder() - .text("$GPRMC,") - .number("(dd)(dd)(dd).?d*,") // time (hhmmss) - .expression("([AV]),") // validity - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.d+)?,") // speed - .number("(d+.d+)?,") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .any() - .compile(); - - private static final Pattern PATTERN_FRCMD = new PatternBuilder() - .text("$FRCMD,") - .number("(d+),") // imei - .expression("[^,]*,") // command - .expression("[^,]*,") - .number("(d+)(dd.d+),") // latitude - .expression("([NS]),") - .number("(d+)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*),") // altitude - .number("(d+.?d*),") // speed - .number("(d+.?d*)?,") // course - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(dd)(dd)(dd).?d*,") // time (hhmmss) - .expression("([01])") // validity - .any() - .compile(); - - private void send(Channel channel, String message) { - if (channel != null) { - channel.write(message + Checksum.nmea(message) + "\r\n"); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.startsWith("$FRLIN,")) { - - // Login - int beginIndex = sentence.indexOf(',', 7); - if (beginIndex != -1) { - beginIndex += 1; - int endIndex = sentence.indexOf(',', beginIndex); - if (endIndex != -1) { - String imei = sentence.substring(beginIndex, endIndex); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession != null) { - if (channel != null) { - send(channel, "$FRSES," + channel.getId()); - } - } else { - send(channel, "$FRERR,AuthError,Unknown device"); - } - } else { - send(channel, "$FRERR,AuthError,Parse error"); - } - } else { - send(channel, "$FRERR,AuthError,Parse error"); - } - - } else if (sentence.startsWith("$FRVER,")) { - - // Version check - send(channel, "$FRVER,1,0,GpsGate Server 1.0"); - - } else if (sentence.startsWith("$GPRMC,")) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Parser parser = new Parser(PATTERN_GPRMC, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return position; - - } else if (sentence.startsWith("$FRCMD,")) { - - Parser parser = new Parser(PATTERN_FRCMD, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setAltitude(parser.nextDouble(0)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setValid(parser.next().equals("1")); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/GpsMarkerProtocol.java b/src/org/traccar/protocol/GpsMarkerProtocol.java deleted file mode 100644 index 5c64d16b2..000000000 --- a/src/org/traccar/protocol/GpsMarkerProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class GpsMarkerProtocol extends BaseProtocol { - - public GpsMarkerProtocol() { - super("gpsmarker"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "\r")); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new GpsMarkerProtocolDecoder(GpsMarkerProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/GpsMarkerProtocolDecoder.java b/src/org/traccar/protocol/GpsMarkerProtocolDecoder.java deleted file mode 100644 index f65f5b2bb..000000000 --- a/src/org/traccar/protocol/GpsMarkerProtocolDecoder.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2015 - 2016 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class GpsMarkerProtocolDecoder extends BaseProtocolDecoder { - - public GpsMarkerProtocolDecoder(GpsMarkerProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$GM") - .number("d") // type - .number("(?:xx)?") // index - .number("(d{15})") // imei - .number("T(dd)(dd)(dd)") // date (ddmmyy) - .number("(dd)(dd)(dd)?") // time (hhmmss) - .expression("([NS])") - .number("(dd)(dd)(dddd)") // latitude - .expression("([EW])") - .number("(ddd)(dd)(dddd)") // longitude - .number("(ddd)") // speed - .number("(ddd)") // course - .number("(x)") // satellites - .number("(dd)") // battery - .number("(d)") // input - .number("(d)") // output - .number("(ddd)") // temperature - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setValid(true); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN_MIN)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN_MIN)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_SATELLITES, parser.nextHexInt(0)); - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt(0)); - position.set(Position.KEY_INPUT, parser.next()); - position.set(Position.KEY_OUTPUT, parser.next()); - position.set(Position.PREFIX_TEMP + 1, parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/GpsmtaProtocol.java b/src/org/traccar/protocol/GpsmtaProtocol.java deleted file mode 100644 index 2d1181bec..000000000 --- a/src/org/traccar/protocol/GpsmtaProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -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 java.util.List; - -public class GpsmtaProtocol extends BaseProtocol { - - public GpsmtaProtocol() { - super("gpsmta"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - 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("objectDecoder", new GpsmtaProtocolDecoder(GpsmtaProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/GpsmtaProtocolDecoder.java b/src/org/traccar/protocol/GpsmtaProtocolDecoder.java deleted file mode 100644 index 11777bece..000000000 --- a/src/org/traccar/protocol/GpsmtaProtocolDecoder.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.Date; -import java.util.regex.Pattern; - -public class GpsmtaProtocolDecoder extends BaseProtocolDecoder { - - public GpsmtaProtocolDecoder(GpsmtaProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .expression("([^ ]+) ") // uid - .number("(d+) ") // time (unix time) - .number("(d+.d+) ") // latitude - .number("(d+.d+) ") // longitude - .number("(d+) ") // speed - .number("(d+) ") // course - .number("(d+) ") // accuracy - .number("(d+) ") // altitude - .number("(d+) ") // flags - .number("(d+) ") // battery - .number("(d+) ") // temperature - .number("(d)") // changing status - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - String time = parser.next(); - position.setTime(new Date(Long.parseLong(time) * 1000)); - - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setSpeed(parser.nextInt(0)); - position.setCourse(parser.nextInt(0)); - position.setAccuracy(parser.nextInt(0)); - position.setAltitude(parser.nextInt(0)); - - position.set(Position.KEY_STATUS, parser.nextInt(0)); - position.set(Position.KEY_BATTERY, parser.nextInt(0)); - position.set(Position.PREFIX_TEMP + 1, parser.nextInt(0)); - position.set(Position.KEY_CHARGE, parser.nextInt(0) == 1); - - if (channel != null) { - channel.write(time, remoteAddress); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/GranitFrameDecoder.java b/src/org/traccar/protocol/GranitFrameDecoder.java deleted file mode 100644 index 7e8f4a3f5..000000000 --- a/src/org/traccar/protocol/GranitFrameDecoder.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; -import org.traccar.helper.StringFinder; - -public class GranitFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - int indexEnd = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new StringFinder("\r\n")); - if (indexEnd != -1) { - int indexTilde = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new StringFinder("~")); - if (indexTilde != -1 && indexTilde < indexEnd) { - int length = buf.getUnsignedShort(indexTilde + 1); - indexEnd = buf.indexOf(indexTilde + 2 + length, buf.writerIndex(), new StringFinder("\r\n")); - if (indexEnd == -1) { - return null; - } - } - ChannelBuffer frame = buf.readBytes(indexEnd - buf.readerIndex()); - buf.skipBytes(2); - return frame; - } - return null; - } - -} diff --git a/src/org/traccar/protocol/GranitProtocol.java b/src/org/traccar/protocol/GranitProtocol.java deleted file mode 100644 index 32e8e00b0..000000000 --- a/src/org/traccar/protocol/GranitProtocol.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2016 - 2017 Anton Tananaev (anton@traccar.org) - * Copyright 2017 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.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.nio.ByteOrder; -import java.util.List; - -public class GranitProtocol extends BaseProtocol { - - public GranitProtocol() { - super("granit"); - setSupportedDataCommands( - Command.TYPE_IDENTIFICATION, - Command.TYPE_REBOOT_DEVICE, - Command.TYPE_POSITION_SINGLE); - setTextCommandEncoder(new GranitProtocolSmsEncoder()); - setSupportedTextCommands( - Command.TYPE_REBOOT_DEVICE, - Command.TYPE_POSITION_PERIODIC); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new GranitFrameDecoder()); - pipeline.addLast("objectEncoder", new GranitProtocolEncoder()); - pipeline.addLast("objectDecoder", new GranitProtocolDecoder(GranitProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/GranitProtocolDecoder.java b/src/org/traccar/protocol/GranitProtocolDecoder.java deleted file mode 100644 index 8e935ae9e..000000000 --- a/src/org/traccar/protocol/GranitProtocolDecoder.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.Checksum; -import org.traccar.helper.StringFinder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -public class GranitProtocolDecoder extends BaseProtocolDecoder { - - private static final int HEADER_LENGTH = 6; - - private double adc1Ratio; - private double adc2Ratio; - private double adc3Ratio; - private double adc4Ratio; - - public GranitProtocolDecoder(GranitProtocol protocol) { - super(protocol); - adc1Ratio = Context.getConfig().getDouble("granit.adc1Ratio", 1); - adc2Ratio = Context.getConfig().getDouble("granit.adc2Ratio", 1); - adc3Ratio = Context.getConfig().getDouble("granit.adc3Ratio", 1); - adc4Ratio = Context.getConfig().getDouble("granit.adc4Ratio", 1); - } - - public static void appendChecksum(ChannelBuffer buffer, int length) { - buffer.writeByte('*'); - int checksum = Checksum.xor(buffer.toByteBuffer(0, length)) & 0xFF; - String checksumString = String.format("%02X", checksum); - buffer.writeBytes(checksumString.getBytes(StandardCharsets.US_ASCII)); - buffer.writeByte('\r'); buffer.writeByte('\n'); - } - - private static void sendResponseCurrent(Channel channel, int deviceId, long time) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 0); - response.writeBytes("BB+UGRC~".getBytes(StandardCharsets.US_ASCII)); - response.writeShort(6); // length - response.writeInt((int) time); - response.writeShort(deviceId); - appendChecksum(response, 16); - channel.write(response); - } - - private static void sendResponseArchive(Channel channel, int deviceId, int packNum) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 0); - response.writeBytes("BB+ARCF~".getBytes(StandardCharsets.US_ASCII)); - response.writeShort(4); // length - response.writeShort(packNum); - response.writeShort(deviceId); - appendChecksum(response, 14); - channel.write(response); - } - - private void decodeStructure(ChannelBuffer buf, Position position) { - short flags = buf.readUnsignedByte(); - position.setValid(BitUtil.check(flags, 7)); - if (BitUtil.check(flags, 1)) { - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - } - - short satDel = buf.readUnsignedByte(); - position.set(Position.KEY_SATELLITES, BitUtil.from(satDel, 4)); - - int pdop = BitUtil.to(satDel, 4); - position.set(Position.KEY_PDOP, pdop); - - int lonDegrees = buf.readUnsignedByte(); - int latDegrees = buf.readUnsignedByte(); - int lonMinutes = buf.readUnsignedShort(); - int latMinutes = buf.readUnsignedShort(); - - double latitude = latDegrees + latMinutes / 60000.0; - double longitude = lonDegrees + lonMinutes / 60000.0; - - if (position.getValid()) { - if (!BitUtil.check(flags, 4)) { - latitude = -latitude; - } - if (!BitUtil.check(flags, 5)) { - longitude = -longitude; - } - } - - position.setLongitude(longitude); - position.setLatitude(latitude); - - position.setSpeed(buf.readUnsignedByte()); - - int course = buf.readUnsignedByte(); - if (BitUtil.check(flags, 6)) { - course = course | 0x100; - } - position.setCourse(course); - - position.set(Position.KEY_DISTANCE, buf.readShort()); - - int analogIn1 = buf.readUnsignedByte(); - int analogIn2 = buf.readUnsignedByte(); - int analogIn3 = buf.readUnsignedByte(); - int analogIn4 = buf.readUnsignedByte(); - - int analogInHi = buf.readUnsignedByte(); - - analogIn1 = analogInHi << 8 & 0x300 | analogIn1; - analogIn2 = analogInHi << 6 & 0x300 | analogIn2; - analogIn3 = analogInHi << 4 & 0x300 | analogIn3; - analogIn4 = analogInHi << 2 & 0x300 | analogIn4; - - position.set(Position.PREFIX_ADC + 1, analogIn1 * adc1Ratio); - position.set(Position.PREFIX_ADC + 2, analogIn2 * adc2Ratio); - position.set(Position.PREFIX_ADC + 3, analogIn3 * adc3Ratio); - position.set(Position.PREFIX_ADC + 4, analogIn4 * adc4Ratio); - - position.setAltitude(buf.readUnsignedByte() * 10); - - int output = buf.readUnsignedByte(); - for (int i = 0; i < 8; i++) { - position.set(Position.PREFIX_IO + (i + 1), BitUtil.check(output, i)); - } - buf.readUnsignedByte(); // status message buffer - } - - @Override - protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - int indexTilde = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new StringFinder("~")); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - - if (deviceSession != null && indexTilde == -1) { - String bufString = buf.toString(StandardCharsets.US_ASCII); - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(new Date()); - getLastLocation(position, new Date()); - position.setValid(false); - position.set(Position.KEY_RESULT, bufString); - return position; - } - - if (buf.readableBytes() < HEADER_LENGTH) { - return null; - } - String header = buf.readBytes(HEADER_LENGTH).toString(StandardCharsets.US_ASCII); - - if (header.equals("+RRCB~")) { - - buf.skipBytes(2); //binary length 26 - int deviceId = buf.readUnsignedShort(); - deviceSession = getDeviceSession(channel, remoteAddress, String.valueOf(deviceId)); - if (deviceSession == null) { - return null; - } - long unixTime = buf.readUnsignedInt(); - if (channel != null) { - sendResponseCurrent(channel, deviceId, unixTime); - } - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(new Date(unixTime * 1000)); - - decodeStructure(buf, position); - return position; - - } else if (header.equals("+DDAT~")) { - - buf.skipBytes(2); //binary length - int deviceId = buf.readUnsignedShort(); - deviceSession = getDeviceSession(channel, remoteAddress, String.valueOf(deviceId)); - if (deviceSession == null) { - return null; - } - byte format = buf.readByte(); - if (format != 4) { - return null; - } - byte nblocks = buf.readByte(); - int packNum = buf.readUnsignedShort(); - if (channel != null) { - sendResponseArchive(channel, deviceId, packNum); - } - List<Position> positions = new ArrayList<>(); - while (nblocks > 0) { - nblocks--; - long unixTime = buf.readUnsignedInt(); - int timeIncrement = buf.getUnsignedShort(buf.readerIndex() + 120); - for (int i = 0; i < 6; i++) { - if (buf.getUnsignedByte(buf.readerIndex()) != 0xFE) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - position.setTime(new Date((unixTime + i * timeIncrement) * 1000)); - decodeStructure(buf, position); - position.set(Position.KEY_ARCHIVE, true); - positions.add(position); - } else { - buf.skipBytes(20); // skip filled 0xFE structure - } - } - buf.skipBytes(2); // increment - } - return positions; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/GranitProtocolEncoder.java b/src/org/traccar/protocol/GranitProtocolEncoder.java deleted file mode 100644 index dbfd30ff1..000000000 --- a/src/org/traccar/protocol/GranitProtocolEncoder.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2016 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 java.nio.charset.StandardCharsets; - -import org.jboss.netty.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class GranitProtocolEncoder extends BaseProtocolEncoder { - @Override - protected Object encodeCommand(Command command) { - - String commandString = ""; - - switch (command.getType()) { - case Command.TYPE_IDENTIFICATION: - commandString = "BB+IDNT"; - break; - case Command.TYPE_REBOOT_DEVICE: - commandString = "BB+RESET"; - break; - case Command.TYPE_POSITION_SINGLE: - commandString = "BB+RRCD"; - break; - default: - Log.warning(new UnsupportedOperationException(command.getType())); - return null; - } - if (!commandString.isEmpty()) { - ChannelBuffer commandBuf = ChannelBuffers.dynamicBuffer(); - commandBuf.writeBytes(commandString.getBytes(StandardCharsets.US_ASCII)); - GranitProtocolDecoder.appendChecksum(commandBuf, commandString.length()); - return commandBuf; - } - return null; - } - -} diff --git a/src/org/traccar/protocol/GranitProtocolSmsEncoder.java b/src/org/traccar/protocol/GranitProtocolSmsEncoder.java deleted file mode 100644 index 668e5d4d3..000000000 --- a/src/org/traccar/protocol/GranitProtocolSmsEncoder.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2017 Anton Tananaev (anton@traccar.org) - * Copyright 2017 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 GranitProtocolSmsEncoder extends StringProtocolEncoder { - - @Override - protected String encodeCommand(Command command) { - switch (command.getType()) { - case Command.TYPE_REBOOT_DEVICE: - return "BB+RESET"; - case Command.TYPE_POSITION_PERIODIC: - return formatCommand(command, "BB+BBMD={%s}", Command.KEY_FREQUENCY); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - return null; - } - } - -} diff --git a/src/org/traccar/protocol/Gt02Protocol.java b/src/org/traccar/protocol/Gt02Protocol.java deleted file mode 100644 index e484b66cd..000000000 --- a/src/org/traccar/protocol/Gt02Protocol.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class Gt02Protocol extends BaseProtocol { - - public Gt02Protocol() { - super("gt02"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(256, 2, 1, 2, 0)); - pipeline.addLast("objectDecoder", new Gt02ProtocolDecoder(Gt02Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Gt02ProtocolDecoder.java b/src/org/traccar/protocol/Gt02ProtocolDecoder.java deleted file mode 100644 index a520bff13..000000000 --- a/src/org/traccar/protocol/Gt02ProtocolDecoder.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2012 - 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; - -public class Gt02ProtocolDecoder extends BaseProtocolDecoder { - - public Gt02ProtocolDecoder(Gt02Protocol protocol) { - super(protocol); - } - - public static final int MSG_DATA = 0x10; - public static final int MSG_HEARTBEAT = 0x1A; - public static final int MSG_RESPONSE = 0x1C; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - buf.readByte(); // size - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - // Zero for location messages - int power = buf.readUnsignedByte(); - int gsm = buf.readUnsignedByte(); - - String imei = ChannelBuffers.hexDump(buf.readBytes(8)).substring(1); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_INDEX, buf.readUnsignedShort()); - - int type = buf.readUnsignedByte(); - - if (type == MSG_HEARTBEAT) { - - getLastLocation(position, null); - - position.set(Position.KEY_POWER, power); - position.set(Position.KEY_RSSI, gsm); - - if (channel != null) { - byte[] response = {0x54, 0x68, 0x1A, 0x0D, 0x0A}; - channel.write(ChannelBuffers.wrappedBuffer(response)); - } - - } else if (type == MSG_DATA) { - - DateBuilder dateBuilder = new DateBuilder() - .setDate(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - position.setTime(dateBuilder.getDate()); - - double latitude = buf.readUnsignedInt() / (60.0 * 30000.0); - double longitude = buf.readUnsignedInt() / (60.0 * 30000.0); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - position.setCourse(buf.readUnsignedShort()); - - buf.skipBytes(3); // reserved - - long flags = buf.readUnsignedInt(); - position.setValid(BitUtil.check(flags, 0)); - if (!BitUtil.check(flags, 1)) { - latitude = -latitude; - } - if (!BitUtil.check(flags, 2)) { - longitude = -longitude; - } - - position.setLatitude(latitude); - position.setLongitude(longitude); - - } else if (type == MSG_RESPONSE) { - - getLastLocation(position, null); - - position.set(Position.KEY_RESULT, - buf.readBytes(buf.readUnsignedByte()).toString(StandardCharsets.US_ASCII)); - - } else { - - return null; - - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/Gt06FrameDecoder.java b/src/org/traccar/protocol/Gt06FrameDecoder.java deleted file mode 100644 index c8b5e56ae..000000000 --- a/src/org/traccar/protocol/Gt06FrameDecoder.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2014 - 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class Gt06FrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 5) { - return null; - } - - int length = 2 + 2; // head and tail - - if (buf.getByte(buf.readerIndex()) == 0x78) { - length += 1 + buf.getUnsignedByte(buf.readerIndex() + 2); - } else { - length += 2 + buf.getUnsignedShort(buf.readerIndex() + 2); - } - - if (buf.readableBytes() >= length && buf.getUnsignedShort(buf.readerIndex() + length - 2) == 0x0d0a) { - return buf.readBytes(length); - } - - int endIndex = buf.readerIndex() - 1; - do { - endIndex = buf.indexOf(endIndex + 1, buf.writerIndex(), (byte) 0x0d); - if (endIndex > 0 && buf.writerIndex() > endIndex + 1 && buf.getByte(endIndex + 1) == 0x0a) { - return buf.readBytes(endIndex + 2 - buf.readerIndex()); - } - } while (endIndex > 0); - - return null; - } - -} diff --git a/src/org/traccar/protocol/Gt06Protocol.java b/src/org/traccar/protocol/Gt06Protocol.java deleted file mode 100644 index f45ac95ee..000000000 --- a/src/org/traccar/protocol/Gt06Protocol.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class Gt06Protocol extends BaseProtocol { - - public Gt06Protocol() { - super("gt06"); - setSupportedDataCommands( - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME, - Command.TYPE_CUSTOM); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new Gt06FrameDecoder()); - pipeline.addLast("objectEncoder", new Gt06ProtocolEncoder()); - pipeline.addLast("objectDecoder", new Gt06ProtocolDecoder(Gt06Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Gt06ProtocolDecoder.java b/src/org/traccar/protocol/Gt06ProtocolDecoder.java deleted file mode 100644 index 177c0b653..000000000 --- a/src/org/traccar/protocol/Gt06ProtocolDecoder.java +++ /dev/null @@ -1,666 +0,0 @@ -/* - * Copyright 2012 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.BcdUtil; -import org.traccar.helper.BitUtil; -import org.traccar.helper.Checksum; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Device; -import org.traccar.model.Network; -import org.traccar.model.Position; -import org.traccar.model.WifiAccessPoint; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; -import java.util.TimeZone; -import java.util.regex.Pattern; - -public class Gt06ProtocolDecoder extends BaseProtocolDecoder { - - private boolean forceTimeZone = false; - private final TimeZone timeZone = TimeZone.getTimeZone("UTC"); - - private int serverIndex; - - private final Map<Integer, ChannelBuffer> photos = new HashMap<>(); - - public Gt06ProtocolDecoder(Gt06Protocol protocol) { - super(protocol); - - if (Context.getConfig().hasKey(getProtocolName() + ".timezone")) { - forceTimeZone = true; - timeZone.setRawOffset(Context.getConfig().getInteger(getProtocolName() + ".timezone") * 1000); - } - } - - public static final int MSG_LOGIN = 0x01; - public static final int MSG_GPS = 0x10; - public static final int MSG_LBS = 0x11; - public static final int MSG_GPS_LBS_1 = 0x12; - public static final int MSG_GPS_LBS_2 = 0x22; - public static final int MSG_STATUS = 0x13; - public static final int MSG_SATELLITE = 0x14; - public static final int MSG_STRING = 0x15; - public static final int MSG_GPS_LBS_STATUS_1 = 0x16; - public static final int MSG_WIFI = 0x17; - public static final int MSG_GPS_LBS_STATUS_2 = 0x26; - public static final int MSG_GPS_LBS_STATUS_3 = 0x27; - public static final int MSG_LBS_MULTIPLE = 0x28; - public static final int MSG_LBS_WIFI = 0x2C; - public static final int MSG_LBS_PHONE = 0x17; - public static final int MSG_LBS_EXTEND = 0x18; - public static final int MSG_LBS_STATUS = 0x19; - public static final int MSG_GPS_PHONE = 0x1A; - public static final int MSG_GPS_LBS_EXTEND = 0x1E; - public static final int MSG_AZ735_GPS = 0x32; - public static final int MSG_AZ735_ALARM = 0x33; - public static final int MSG_X1_GPS = 0x34; - public static final int MSG_X1_PHOTO_INFO = 0x35; - public static final int MSG_X1_PHOTO_DATA = 0x36; - public static final int MSG_WIFI_2 = 0x69; - public static final int MSG_COMMAND_0 = 0x80; - public static final int MSG_COMMAND_1 = 0x81; - public static final int MSG_COMMAND_2 = 0x82; - public static final int MSG_INFO = 0x94; - public static final int MSG_STRING_INFO = 0x21; - - private static boolean isSupported(int type) { - return hasGps(type) || hasLbs(type) || hasStatus(type); - } - - private static boolean hasGps(int type) { - return type == MSG_GPS || type == MSG_GPS_LBS_1 || type == MSG_GPS_LBS_2 - || type == MSG_GPS_LBS_STATUS_1 || type == MSG_GPS_LBS_STATUS_2 || type == MSG_GPS_LBS_STATUS_3 - || type == MSG_GPS_PHONE || type == MSG_GPS_LBS_EXTEND; - } - - private static boolean hasLbs(int type) { - return type == MSG_LBS || type == MSG_LBS_STATUS || type == MSG_GPS_LBS_1 || type == MSG_GPS_LBS_2 - || type == MSG_GPS_LBS_STATUS_1 || type == MSG_GPS_LBS_STATUS_2 || type == MSG_GPS_LBS_STATUS_3; - } - - private static boolean hasStatus(int type) { - return type == MSG_STATUS || type == MSG_LBS_STATUS - || type == MSG_GPS_LBS_STATUS_1 || type == MSG_GPS_LBS_STATUS_2 || type == MSG_GPS_LBS_STATUS_3; - } - - private void sendResponse(Channel channel, boolean extended, int type, ChannelBuffer content) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - int length = 5 + (content != null ? content.readableBytes() : 0); - if (extended) { - response.writeShort(0x7979); - response.writeShort(length); - } else { - response.writeShort(0x7878); - response.writeByte(length); - } - response.writeByte(type); - if (content != null) { - response.writeBytes(content); - } - response.writeShort(++serverIndex); - response.writeShort(Checksum.crc16(Checksum.CRC16_X25, - response.toByteBuffer(2, response.writerIndex() - 2))); - response.writeByte('\r'); response.writeByte('\n'); // ending - channel.write(response); - } - } - - private void sendPhotoRequest(Channel channel, int pictureId) { - ChannelBuffer photo = photos.get(pictureId); - ChannelBuffer content = ChannelBuffers.dynamicBuffer(); - content.writeInt(pictureId); - content.writeInt(photo.writerIndex()); - content.writeShort(Math.min(photo.writableBytes(), 1024)); - sendResponse(channel, false, MSG_X1_PHOTO_DATA, content); - } - - private boolean decodeGps(Position position, ChannelBuffer buf, boolean hasLength) { - - DateBuilder dateBuilder = new DateBuilder(timeZone) - .setDate(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - position.setTime(dateBuilder.getDate()); - - if (hasLength && buf.readUnsignedByte() == 0) { - return false; - } - - position.set(Position.KEY_SATELLITES, BitUtil.to(buf.readUnsignedByte(), 4)); - - double latitude = buf.readUnsignedInt() / 60.0 / 30000.0; - double longitude = buf.readUnsignedInt() / 60.0 / 30000.0; - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - - int flags = buf.readUnsignedShort(); - position.setCourse(BitUtil.to(flags, 10)); - position.setValid(BitUtil.check(flags, 12)); - - if (!BitUtil.check(flags, 10)) { - latitude = -latitude; - } - if (BitUtil.check(flags, 11)) { - longitude = -longitude; - } - - position.setLatitude(latitude); - position.setLongitude(longitude); - - if (BitUtil.check(flags, 14)) { - position.set(Position.KEY_IGNITION, BitUtil.check(flags, 15)); - } - - return true; - } - - private boolean decodeLbs(Position position, ChannelBuffer buf, boolean hasLength) { - - int length = 0; - if (hasLength) { - length = buf.readUnsignedByte(); - if (length == 0) { - return false; - } - } - - position.setNetwork(new Network(CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedByte(), buf.readUnsignedShort(), buf.readUnsignedMedium()))); - - if (length > 0) { - buf.skipBytes(length - (hasLength ? 9 : 8)); - } - - return true; - } - - private boolean decodeStatus(Position position, ChannelBuffer buf) { - - int status = buf.readUnsignedByte(); - - position.set(Position.KEY_STATUS, status); - position.set(Position.KEY_IGNITION, BitUtil.check(status, 1)); - position.set(Position.KEY_CHARGE, BitUtil.check(status, 2)); - position.set(Position.KEY_BLOCKED, BitUtil.check(status, 7)); - - switch (BitUtil.between(status, 3, 6)) { - case 1: - position.set(Position.KEY_ALARM, Position.ALARM_SHOCK); - break; - case 2: - position.set(Position.KEY_ALARM, Position.ALARM_POWER_CUT); - break; - case 3: - position.set(Position.KEY_ALARM, Position.ALARM_LOW_BATTERY); - break; - case 4: - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - break; - default: - break; - } - - position.set(Position.KEY_BATTERY, buf.readUnsignedByte()); - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - position.set(Position.KEY_ALARM, decodeAlarm(buf.readUnsignedByte())); - - return true; - } - - private String decodeAlarm(short value) { - switch (value) { - case 0x01: - return Position.ALARM_SOS; - case 0x02: - return Position.ALARM_POWER_CUT; - case 0x03: - case 0x09: - return Position.ALARM_VIBRATION; - case 0x04: - return Position.ALARM_GEOFENCE_ENTER; - case 0x05: - return Position.ALARM_GEOFENCE_EXIT; - case 0x06: - return Position.ALARM_OVERSPEED; - case 0x0E: - case 0x0F: - return Position.ALARM_LOW_BATTERY; - case 0x11: - return Position.ALARM_POWER_OFF; - default: - return null; - } - } - - private static final Pattern PATTERN_FUEL = new PatternBuilder() - .text("!AIOIL,") - .number("d+,") // device address - .number("d+.d+,") // output value - .number("(d+.d+),") // temperature - .expression("[^,]+,") // version - .number("dd") // back wave - .number("d") // software status code - .number("d,") // hardware status code - .number("(d+.d+),") // measured value - .expression("[01],") // movement status - .number("d+,") // excited wave times - .number("xx") // checksum - .compile(); - - private Position decodeFuelData(Position position, String sentence) { - Parser parser = new Parser(PATTERN_FUEL, sentence); - if (!parser.matches()) { - return null; - } - - position.set(Position.PREFIX_TEMP + 1, parser.nextDouble(0)); - position.set(Position.KEY_FUEL_LEVEL, parser.nextDouble(0)); - - return position; - } - - private static final Pattern PATTERN_LOCATION = new PatternBuilder() - .text("Current position!") - .number("Lat:([NS])(d+.d+),") // latitude - .number("Lon:([EW])(d+.d+),") // longitude - .text("Course:").number("(d+.d+),") // course - .text("Speed:").number("(d+.d+),") // speed - .text("DateTime:") - .number("(dddd)-(dd)-(dd) ") // date - .number("(dd):(dd):(dd)") // time - .compile(); - - private Position decodeLocationString(Position position, String sentence) { - Parser parser = new Parser(PATTERN_LOCATION, sentence); - if (!parser.matches()) { - return null; - } - - position.setValid(true); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG)); - position.setCourse(parser.nextDouble()); - position.setSpeed(parser.nextDouble()); - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.YMD_HMS)); - - return position; - } - - private Object decodeBasic(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) throws Exception { - - int length = buf.readUnsignedByte(); - int dataLength = length - 5; - int type = buf.readUnsignedByte(); - - DeviceSession deviceSession = null; - if (type != MSG_LOGIN) { - deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - } - - if (type == MSG_LOGIN) { - - String imei = ChannelBuffers.hexDump(buf.readBytes(8)).substring(1); - buf.readUnsignedShort(); // type - - if (dataLength > 10) { - int extensionBits = buf.readUnsignedShort(); - int hours = (extensionBits >> 4) / 100; - int minutes = (extensionBits >> 4) % 100; - int offset = (hours * 60 + minutes) * 60; - if ((extensionBits & 0x8) != 0) { - offset = -offset; - } - if (!forceTimeZone) { - timeZone.setRawOffset(offset * 1000); - } - } - - if (getDeviceSession(channel, remoteAddress, imei) != null) { - sendResponse(channel, false, type, null); - } - - } else if (type == MSG_X1_GPS) { - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - buf.readUnsignedInt(); // data and alarm - - decodeGps(position, buf, false); - - buf.readUnsignedShort(); // terminal info - - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - - position.setNetwork(new Network(CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedByte(), - buf.readUnsignedShort(), buf.readUnsignedInt()))); - - return position; - - } else if (type == MSG_X1_PHOTO_INFO) { - - buf.skipBytes(6); // time - buf.readUnsignedByte(); // fix status - buf.readUnsignedInt(); // latitude - buf.readUnsignedInt(); // longitude - buf.readUnsignedByte(); // camera id - buf.readUnsignedByte(); // photo source - buf.readUnsignedByte(); // picture format - - ChannelBuffer photo = ChannelBuffers.buffer(buf.readInt()); - int pictureId = buf.readInt(); - photos.put(pictureId, photo); - sendPhotoRequest(channel, pictureId); - - } else if (type == MSG_WIFI || type == MSG_WIFI_2) { - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - DateBuilder dateBuilder = new DateBuilder() - .setYear(BcdUtil.readInteger(buf, 2)) - .setMonth(BcdUtil.readInteger(buf, 2)) - .setDay(BcdUtil.readInteger(buf, 2)) - .setHour(BcdUtil.readInteger(buf, 2)) - .setMinute(BcdUtil.readInteger(buf, 2)) - .setSecond(BcdUtil.readInteger(buf, 2)); - getLastLocation(position, dateBuilder.getDate()); - - Network network = new Network(); - - int wifiCount = buf.getByte(2); - for (int i = 0; i < wifiCount; i++) { - String mac = String.format("%02x:%02x:%02x:%02x:%02x:%02x", - buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte(), - buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - network.addWifiAccessPoint(WifiAccessPoint.from(mac, buf.readUnsignedByte())); - } - - int cellCount = buf.readUnsignedByte(); - int mcc = buf.readUnsignedShort(); - int mnc = buf.readUnsignedByte(); - for (int i = 0; i < cellCount; i++) { - network.addCellTower(CellTower.from( - mcc, mnc, buf.readUnsignedShort(), buf.readUnsignedShort(), buf.readUnsignedByte())); - } - - position.setNetwork(network); - - return position; - - } else { - - return decodeBasicOther(channel, buf, deviceSession, type, dataLength); - - } - - return null; - } - - private Object decodeBasicOther(Channel channel, ChannelBuffer buf, - DeviceSession deviceSession, int type, int dataLength) throws Exception { - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - if (type == MSG_LBS_MULTIPLE || type == MSG_LBS_EXTEND || type == MSG_LBS_WIFI) { - - DateBuilder dateBuilder = new DateBuilder(timeZone) - .setDate(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - - getLastLocation(position, dateBuilder.getDate()); - - int mcc = buf.readUnsignedShort(); - int mnc = buf.readUnsignedByte(); - Network network = new Network(); - for (int i = 0; i < 7; i++) { - int lac = buf.readUnsignedShort(); - int cid = buf.readUnsignedMedium(); - int rssi = -buf.readUnsignedByte(); - if (lac > 0) { - network.addCellTower(CellTower.from(mcc, mnc, lac, cid, rssi)); - } - } - - buf.readUnsignedByte(); // time leads - - if (type != MSG_LBS_MULTIPLE) { - int wifiCount = buf.readUnsignedByte(); - for (int i = 0; i < wifiCount; i++) { - String mac = ChannelBuffers.hexDump(buf.readBytes(6)).replaceAll("(..)", "$1:"); - network.addWifiAccessPoint(WifiAccessPoint.from( - mac.substring(0, mac.length() - 1), buf.readUnsignedByte())); - } - } - - position.setNetwork(network); - - } else if (type == MSG_STRING) { - - getLastLocation(position, null); - - int commandLength = buf.readUnsignedByte(); - - if (commandLength > 0) { - buf.readUnsignedByte(); // server flag (reserved) - position.set(Position.KEY_RESULT, - buf.readBytes(commandLength - 1).toString(StandardCharsets.US_ASCII)); - } - - } else if (isSupported(type)) { - - if (hasGps(type)) { - decodeGps(position, buf, false); - } else { - getLastLocation(position, null); - } - - if (hasLbs(type)) { - decodeLbs(position, buf, hasStatus(type)); - } - - if (hasStatus(type)) { - decodeStatus(position, buf); - } - - if (type == MSG_GPS_LBS_1 && buf.readableBytes() >= 4 + 6) { - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - } - - if (type == MSG_GPS_LBS_2 && buf.readableBytes() >= 3 + 6) { - position.set(Position.KEY_IGNITION, buf.readUnsignedByte() > 0); - position.set(Position.KEY_EVENT, buf.readUnsignedByte()); // reason - position.set(Position.KEY_ARCHIVE, buf.readUnsignedByte() > 0); - } - - } else { - - buf.skipBytes(dataLength); - if (type != MSG_COMMAND_0 && type != MSG_COMMAND_1 && type != MSG_COMMAND_2) { - sendResponse(channel, false, type, null); - } - return null; - - } - - sendResponse(channel, false, type, null); - - return position; - } - - private Object decodeExtended(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) throws Exception { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - buf.readUnsignedShort(); // length - int type = buf.readUnsignedByte(); - - if (type == MSG_STRING_INFO) { - - buf.readUnsignedInt(); // server flag - String data; - if (buf.readUnsignedByte() == 1) { - data = buf.readBytes(buf.readableBytes() - 6).toString(StandardCharsets.US_ASCII); - } else { - data = buf.readBytes(buf.readableBytes() - 6).toString(StandardCharsets.UTF_16BE); - } - - if (decodeLocationString(position, data) == null) { - getLastLocation(position, null); - position.set(Position.KEY_RESULT, data); - } - - return position; - - } else if (type == MSG_INFO) { - - int subType = buf.readUnsignedByte(); - - getLastLocation(position, null); - - if (subType == 0x00) { - - position.set(Position.KEY_POWER, buf.readUnsignedShort() * 0.01); - return position; - - } else if (subType == 0x05) { - - int flags = buf.readUnsignedByte(); - position.set(Position.KEY_DOOR, BitUtil.check(flags, 0)); - position.set(Position.PREFIX_IO + 1, BitUtil.check(flags, 2)); - return position; - - } else if (subType == 0x0d) { - - buf.skipBytes(6); - return decodeFuelData(position, buf.toString( - buf.readerIndex(), buf.readableBytes() - 4 - 2, StandardCharsets.US_ASCII)); - - } - - } else if (type == MSG_X1_PHOTO_DATA) { - - int pictureId = buf.readInt(); - - ChannelBuffer photo = photos.get(pictureId); - - buf.readUnsignedInt(); // offset - buf.readBytes(photo, buf.readUnsignedShort()); - - if (photo.writableBytes() > 0) { - sendPhotoRequest(channel, pictureId); - } else { - Device device = Context.getDeviceManager().getById(deviceSession.getDeviceId()); - Context.getMediaManager().writeFile(device.getUniqueId(), photo, "jpg"); - photos.remove(pictureId); - } - - } else if (type == MSG_AZ735_GPS || type == MSG_AZ735_ALARM) { - - if (!decodeGps(position, buf, true)) { - getLastLocation(position, position.getDeviceTime()); - } - - if (decodeLbs(position, buf, true)) { - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - } - - buf.skipBytes(buf.readUnsignedByte()); // additional cell towers - buf.skipBytes(buf.readUnsignedByte()); // wifi access point - - int status = buf.readUnsignedByte(); - position.set(Position.KEY_STATUS, status); - - if (type == MSG_AZ735_ALARM) { - switch (status) { - case 0xA0: - position.set(Position.KEY_ARMED, true); - break; - case 0xA1: - position.set(Position.KEY_ARMED, false); - break; - case 0xA2: - case 0xA3: - position.set(Position.KEY_ALARM, Position.ALARM_LOW_BATTERY); - break; - case 0xA4: - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - break; - case 0xA5: - position.set(Position.KEY_ALARM, Position.ALARM_DOOR); - break; - default: - break; - } - } - - buf.skipBytes(buf.readUnsignedByte()); // reserved extension - - sendResponse(channel, true, type, null); - - return position; - - } - - return null; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - int header = buf.readShort(); - - if (header == 0x7878) { - return decodeBasic(channel, remoteAddress, buf); - } else if (header == 0x7979) { - return decodeExtended(channel, remoteAddress, buf); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Gt06ProtocolEncoder.java b/src/org/traccar/protocol/Gt06ProtocolEncoder.java deleted file mode 100644 index a3e0a2264..000000000 --- a/src/org/traccar/protocol/Gt06ProtocolEncoder.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2015 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.Context; -import org.traccar.helper.Checksum; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import java.nio.charset.StandardCharsets; - -public class Gt06ProtocolEncoder extends BaseProtocolEncoder { - - private ChannelBuffer encodeContent(String content) { - - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); - - buf.writeByte(0x78); - buf.writeByte(0x78); - - buf.writeByte(1 + 1 + 4 + content.length() + 2 + 2); // message length - - buf.writeByte(0x80); // message type - - buf.writeByte(4 + content.length()); // command length - buf.writeInt(0); - buf.writeBytes(content.getBytes(StandardCharsets.US_ASCII)); // command - - buf.writeShort(0); // message index - - buf.writeShort(Checksum.crc16(Checksum.CRC16_X25, buf.toByteBuffer(2, buf.writerIndex() - 2))); - - buf.writeByte('\r'); - buf.writeByte('\n'); - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - - boolean alternative = Context.getIdentityManager().lookupAttributeBoolean( - command.getDeviceId(), "gt06.alternative", false, true); - - switch (command.getType()) { - case Command.TYPE_ENGINE_STOP: - return encodeContent(alternative ? "DYD,123456#" : "Relay,1#"); - case Command.TYPE_ENGINE_RESUME: - return encodeContent(alternative ? "HFYD,123456#" : "Relay,0#"); - case Command.TYPE_CUSTOM: - return encodeContent(command.getString(Command.KEY_DATA)); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Gt30Protocol.java b/src/org/traccar/protocol/Gt30Protocol.java deleted file mode 100644 index 186002a35..000000000 --- a/src/org/traccar/protocol/Gt30Protocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class Gt30Protocol extends BaseProtocol { - - public Gt30Protocol() { - super("gt30"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new Gt30ProtocolDecoder(Gt30Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Gt30ProtocolDecoder.java b/src/org/traccar/protocol/Gt30ProtocolDecoder.java deleted file mode 100644 index 51135c80a..000000000 --- a/src/org/traccar/protocol/Gt30ProtocolDecoder.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class Gt30ProtocolDecoder extends BaseProtocolDecoder { - - public Gt30ProtocolDecoder(Gt30Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$$") - .number("x{4}") // length - .expression("(.{14})") // device id - .number("x{4}") // type - .expression("(.)?") // alarm - .number("(dd)(dd)(dd).(ddd),") // time (hhmmss.sss) - .expression("([AV]),") // validity - .number("(d+)(dd.d+),") // latitude - .expression("([NS]),") - .number("(d+)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.d+)?,") // speed - .number("(d+.d+)?,") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .expression("[^\\|]*") - .number("|(d+.d+)") // hdop - .number("|(-?d+)") // altitude - .number("x{4}") // checksum - .compile(); - - private String decodeAlarm(int value) { - switch (value) { - case 0x01: - case 0x02: - case 0x03: - return Position.ALARM_SOS; - case 0x10: - return Position.ALARM_LOW_BATTERY; - case 0x11: - return Position.ALARM_OVERSPEED; - case 0x12: - return Position.ALARM_GEOFENCE; - default: - return null; - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next().trim()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - if (parser.hasNext()) { - position.set(Position.KEY_ALARM, decodeAlarm(parser.next().charAt(0))); - } - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.set(Position.KEY_HDOP, parser.nextDouble()); - - position.setAltitude(parser.nextDouble(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/H02FrameDecoder.java b/src/org/traccar/protocol/H02FrameDecoder.java deleted file mode 100644 index 391fccc87..000000000 --- a/src/org/traccar/protocol/H02FrameDecoder.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class H02FrameDecoder extends FrameDecoder { - - private static final int MESSAGE_SHORT = 32; - private static final int MESSAGE_LONG = 45; - - private int messageLength; - - public H02FrameDecoder(int messageLength) { - this.messageLength = messageLength; - } - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - char marker = (char) buf.getByte(buf.readerIndex()); - - while (marker != '*' && marker != '$' && marker != 'X' && buf.readableBytes() > 0) { - buf.skipBytes(1); - if (buf.readableBytes() > 0) { - marker = (char) buf.getByte(buf.readerIndex()); - } - } - - switch (marker) { - case '*': - - // Return text message - int index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '#'); - if (index != -1) { - ChannelBuffer result = buf.readBytes(index + 1 - buf.readerIndex()); - while (buf.readable() - && (buf.getByte(buf.readerIndex()) == '\r' || buf.getByte(buf.readerIndex()) == '\n')) { - buf.readByte(); // skip new line - } - return result; - } - - break; - - case '$': - - if (messageLength == 0) { - if (buf.readableBytes() == MESSAGE_LONG) { - messageLength = MESSAGE_LONG; - } else { - messageLength = MESSAGE_SHORT; - } - } - - if (buf.readableBytes() >= messageLength) { - return buf.readBytes(messageLength); - } - - break; - - case 'X': - - if (buf.readableBytes() >= MESSAGE_SHORT) { - return buf.readBytes(MESSAGE_SHORT); - } - - break; - - default: - - return null; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/H02Protocol.java b/src/org/traccar/protocol/H02Protocol.java deleted file mode 100644 index 66965e9db..000000000 --- a/src/org/traccar/protocol/H02Protocol.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2015 - 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.bootstrap.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.string.StringEncoder; -import org.traccar.BaseProtocol; -import org.traccar.Context; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class H02Protocol extends BaseProtocol { - - public H02Protocol() { - super("h02"); - setSupportedDataCommands( - Command.TYPE_ALARM_ARM, - Command.TYPE_ALARM_DISARM, - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME, - Command.TYPE_POSITION_PERIODIC - ); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - int messageLength = Context.getConfig().getInteger(getName() + ".messageLength"); - pipeline.addLast("frameDecoder", new H02FrameDecoder(messageLength)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new H02ProtocolEncoder()); - pipeline.addLast("objectDecoder", new H02ProtocolDecoder(H02Protocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new H02ProtocolEncoder()); - pipeline.addLast("objectDecoder", new H02ProtocolDecoder(H02Protocol.this)); - } - }); - } -} diff --git a/src/org/traccar/protocol/H02ProtocolDecoder.java b/src/org/traccar/protocol/H02ProtocolDecoder.java deleted file mode 100644 index 4414870d2..000000000 --- a/src/org/traccar/protocol/H02ProtocolDecoder.java +++ /dev/null @@ -1,490 +0,0 @@ -/* - * Copyright 2012 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BcdUtil; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.regex.Pattern; - -public class H02ProtocolDecoder extends BaseProtocolDecoder { - - public H02ProtocolDecoder(H02Protocol protocol) { - super(protocol); - } - - private static double readCoordinate(ChannelBuffer buf, boolean lon) { - - int degrees = BcdUtil.readInteger(buf, 2); - if (lon) { - degrees = degrees * 10 + (buf.getUnsignedByte(buf.readerIndex()) >> 4); - } - - double result = 0; - if (lon) { - result = buf.readUnsignedByte() & 0x0f; - } - - int length = 6; - if (lon) { - length = 5; - } - - result = result * 10 + BcdUtil.readInteger(buf, length) * 0.0001; - - result /= 60; - result += degrees; - - return result; - } - - private void processStatus(Position position, long status) { - - if (!BitUtil.check(status, 0)) { - position.set(Position.KEY_ALARM, Position.ALARM_VIBRATION); - } else if (!BitUtil.check(status, 1)) { - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - } else if (!BitUtil.check(status, 2)) { - position.set(Position.KEY_ALARM, Position.ALARM_OVERSPEED); - } else if (!BitUtil.check(status, 19)) { - position.set(Position.KEY_ALARM, Position.ALARM_POWER_CUT); - } - - position.set(Position.KEY_IGNITION, BitUtil.check(status, 10)); - position.set(Position.KEY_STATUS, status); - - } - - private Integer decodeBattery(int value) { - switch (value) { - case 6: - return 100; - case 5: - return 80; - case 4: - return 60; - case 3: - return 20; - case 2: - return 10; - default: - return null; - } - } - - private Position decodeBinary(ChannelBuffer buf, Channel channel, SocketAddress remoteAddress) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - buf.readByte(); // marker - - DeviceSession deviceSession = getDeviceSession( - channel, remoteAddress, ChannelBuffers.hexDump(buf.readBytes(5))); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setHour(BcdUtil.readInteger(buf, 2)) - .setMinute(BcdUtil.readInteger(buf, 2)) - .setSecond(BcdUtil.readInteger(buf, 2)) - .setDay(BcdUtil.readInteger(buf, 2)) - .setMonth(BcdUtil.readInteger(buf, 2)) - .setYear(BcdUtil.readInteger(buf, 2)); - position.setTime(dateBuilder.getDate()); - - double latitude = readCoordinate(buf, false); - position.set(Position.KEY_BATTERY_LEVEL, decodeBattery(buf.readUnsignedByte())); - double longitude = readCoordinate(buf, true); - - int flags = buf.readUnsignedByte() & 0x0f; - position.setValid((flags & 0x02) != 0); - if ((flags & 0x04) == 0) { - latitude = -latitude; - } - if ((flags & 0x08) == 0) { - longitude = -longitude; - } - - position.setLatitude(latitude); - position.setLongitude(longitude); - - position.setSpeed(BcdUtil.readInteger(buf, 3)); - position.setCourse((buf.readUnsignedByte() & 0x0f) * 100.0 + BcdUtil.readInteger(buf, 2)); - - processStatus(position, buf.readUnsignedInt()); - - return position; - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("*") - .expression("..,") // manufacturer - .number("(d+),") // imei - .groupBegin() - .text("VP1,") - .or() - .groupBegin() - .text("V4,") - .expression("(.*),") // response - .or() - .expression("V[^,]*,") - .groupEnd() - .number("(?:(dd)(dd)(dd))?,") // time (hhmmss) - .groupEnd() - .groupBegin() - .expression("([ABV])?,") // validity - .or() - .number("(d+),") // coding scheme - .groupEnd() - .groupBegin() - .number("-(d+)-(d+.d+),") // latitude - .or() - .number("(d+)(dd.d+),") // latitude - .groupEnd() - .expression("([NS]),") - .groupBegin() - .number("-(d+)-(d+.d+),") // longitude - .or() - .number("(d+)(dd.d+),") // longitude - .groupEnd() - .expression("([EW]),") - .number("(d+.?d*),") // speed - .number("(d+.?d*)?,") // course - .number("(?:(dd)(dd)(dd))?") // date (ddmmyy) - .groupBegin() - .expression(",[^,]*,") - .expression("[^,]*,") - .expression("[^,]*") // sim info - .groupEnd("?") - .groupBegin() - .number(",(x{8})") - .groupBegin() - .number(",(d+),") // odometer - .number("(-?d+),") // temperature - .number("(d+.d+),") // fuel - .number("(-?d+),") // altitude - .number("(x+),") // lac - .number("(x+)") // cid - .or() - .text(",") - .expression("(.*)") // data - .or() - .groupEnd() - .or() - .groupEnd() - .text("#") - .compile(); - - private static final Pattern PATTERN_NBR = new PatternBuilder() - .text("*") - .expression("..,") // manufacturer - .number("(d+),") // imei - .text("NBR,") - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(d+),") // mcc - .number("(d+),") // mnc - .number("d+,") // gsm delay time - .number("d+,") // count - .number("((?:d+,d+,d+,)+)") // cells - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(x{8})") // status - .any() - .compile(); - - private static final Pattern PATTERN_LINK = new PatternBuilder() - .text("*") - .expression("..,") // manufacturer - .number("(d+),") // imei - .text("LINK,") - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(d+),") // rssi - .number("(d+),") // satellites - .number("(d+),") // battery - .number("(d+),") // steps - .number("(d+),") // turnovers - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(x{8})") // status - .any() - .compile(); - - private static final Pattern PATTERN_V3 = new PatternBuilder() - .text("*") - .expression("..,") // manufacturer - .number("(d+),") // imei - .text("V3,") - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(ddd)") // mcc - .number("(d+),") // mnc - .number("(d+),") // count - .expression("(.*),") // cell info - .number("(x{4}),") // battery - .number("d+,") // reboot info - .text("X,") - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(x{8})") // status - .text("#").optional() - .compile(); - - private Position decodeText(String sentence, Channel channel, SocketAddress remoteAddress) { - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - if (parser.hasNext()) { - position.set(Position.KEY_RESULT, parser.next()); - } - - DateBuilder dateBuilder = new DateBuilder(); - if (parser.hasNext(3)) { - dateBuilder.setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - } - - if (parser.hasNext()) { - position.setValid(parser.next().equals("A")); - } - if (parser.hasNext()) { - parser.nextInt(); // coding scheme - position.setValid(true); - } - - if (parser.hasNext(2)) { - position.setLatitude(-parser.nextCoordinate()); - } - if (parser.hasNext(2)) { - position.setLatitude(parser.nextCoordinate()); - } - - if (parser.hasNext(2)) { - position.setLongitude(-parser.nextCoordinate()); - } - if (parser.hasNext(2)) { - position.setLongitude(parser.nextCoordinate()); - } - - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - if (parser.hasNext(3)) { - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - } else { - position.setTime(new Date()); - } - - if (parser.hasNext()) { - processStatus(position, parser.nextLong(16, 0)); - } - - if (parser.hasNext(6)) { - position.set(Position.KEY_ODOMETER, parser.nextInt(0)); - position.set(Position.PREFIX_TEMP + 1, parser.nextInt(0)); - position.set(Position.KEY_FUEL_LEVEL, parser.nextDouble(0)); - - position.setAltitude(parser.nextInt(0)); - - position.setNetwork(new Network(CellTower.fromLacCid(parser.nextHexInt(0), parser.nextHexInt(0)))); - } - - if (parser.hasNext(4)) { - String[] values = parser.next().split(","); - for (int i = 0; i < values.length; i++) { - position.set(Position.PREFIX_IO + (i + 1), values[i].trim()); - } - } - - return position; - } - - private Position decodeLbs(String sentence, Channel channel, SocketAddress remoteAddress) { - - Parser parser = new Parser(PATTERN_NBR, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - Network network = new Network(); - int mcc = parser.nextInt(0); - int mnc = parser.nextInt(0); - - String[] cells = parser.next().split(","); - for (int i = 0; i < cells.length / 3; i++) { - network.addCellTower(CellTower.from(mcc, mnc, Integer.parseInt(cells[i * 3]), - Integer.parseInt(cells[i * 3 + 1]), Integer.parseInt(cells[i * 3 + 2]))); - } - - position.setNetwork(network); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - getLastLocation(position, dateBuilder.getDate()); - - processStatus(position, parser.nextLong(16, 0)); - - return position; - } - - private Position decodeLink(String sentence, Channel channel, SocketAddress remoteAddress) { - - Parser parser = new Parser(PATTERN_LINK, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.set(Position.KEY_RSSI, parser.nextInt()); - position.set(Position.KEY_SATELLITES, parser.nextInt()); - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt()); - position.set(Position.KEY_STEPS, parser.nextInt()); - position.set("turnovers", parser.nextInt()); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - getLastLocation(position, dateBuilder.getDate()); - - processStatus(position, parser.nextLong(16, 0)); - - return position; - } - - private Position decodeV3(String sentence, Channel channel, SocketAddress remoteAddress) { - - Parser parser = new Parser(PATTERN_V3, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - int mcc = parser.nextInt(); - int mnc = parser.nextInt(); - - int count = parser.nextInt(); - Network network = new Network(); - String[] values = parser.next().split(","); - for (int i = 0; i < count; i++) { - network.addCellTower(CellTower.from( - mcc, mnc, Integer.parseInt(values[i * 4]), Integer.parseInt(values[i * 4 + 1]))); - } - position.setNetwork(network); - - position.set(Position.KEY_BATTERY, parser.nextHexInt()); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - getLastLocation(position, dateBuilder.getDate()); - - processStatus(position, parser.nextLong(16, 0)); - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - String marker = buf.toString(0, 1, StandardCharsets.US_ASCII); - - switch (marker) { - case "*": - String sentence = buf.toString(StandardCharsets.US_ASCII); - int typeStart = sentence.indexOf(',', sentence.indexOf(',') + 1) + 1; - int typeEnd = sentence.indexOf(',', typeStart); - if (typeEnd > 0) { - String type = sentence.substring(typeStart, typeEnd); - switch (type) { - case "NBR": - return decodeLbs(sentence, channel, remoteAddress); - case "LINK": - return decodeLink(sentence, channel, remoteAddress); - case "V3": - return decodeV3(sentence, channel, remoteAddress); - default: - return decodeText(sentence, channel, remoteAddress); - } - } else { - return null; - } - case "$": - return decodeBinary(buf, channel, remoteAddress); - case "X": - default: - return null; - } - } - -} diff --git a/src/org/traccar/protocol/H02ProtocolEncoder.java b/src/org/traccar/protocol/H02ProtocolEncoder.java deleted file mode 100644 index 7b5ff13bb..000000000 --- a/src/org/traccar/protocol/H02ProtocolEncoder.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2016 Gabor Somogyi (gabor.g.somogyi@gmail.com) - * 2016 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.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class H02ProtocolEncoder extends StringProtocolEncoder { - - private static final String MARKER = "HQ"; - - private Object formatCommand(DateTime time, String uniqueId, String type, String... params) { - - StringBuilder result = new StringBuilder(String.format("*%s,%s,%s,%02d%02d%02d", - MARKER, uniqueId, type, time.getHourOfDay(), time.getMinuteOfHour(), time.getSecondOfMinute())); - - for (String param : params) { - result.append(",").append(param); - } - - result.append("#"); - - return result.toString(); - } - - protected Object encodeCommand(Command command, DateTime time) { - String uniqueId = getUniqueId(command.getDeviceId()); - - switch (command.getType()) { - case Command.TYPE_ALARM_ARM: - return formatCommand(time, uniqueId, "SCF", "0", "0"); - case Command.TYPE_ALARM_DISARM: - return formatCommand(time, uniqueId, "SCF", "1", "1"); - case Command.TYPE_ENGINE_STOP: - return formatCommand( - time, uniqueId, "S20", "1", "3", "10", "3", "5", "5", "3", "5", "3", "5", "3", "5"); - case Command.TYPE_ENGINE_RESUME: - return formatCommand(time, uniqueId, "S20", "0", "0"); - case Command.TYPE_POSITION_PERIODIC: - return formatCommand( - time, uniqueId, "S71", "22", command.getAttributes().get(Command.KEY_FREQUENCY).toString()); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - - @Override - protected Object encodeCommand(Command command) { - return encodeCommand(command, new DateTime(DateTimeZone.UTC)); - } - -} diff --git a/src/org/traccar/protocol/HaicomProtocol.java b/src/org/traccar/protocol/HaicomProtocol.java deleted file mode 100644 index 4380dd2cc..000000000 --- a/src/org/traccar/protocol/HaicomProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class HaicomProtocol extends BaseProtocol { - - public HaicomProtocol() { - super("haicom"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '*')); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new HaicomProtocolDecoder(HaicomProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/HaicomProtocolDecoder.java b/src/org/traccar/protocol/HaicomProtocolDecoder.java deleted file mode 100644 index 37898a9bc..000000000 --- a/src/org/traccar/protocol/HaicomProtocolDecoder.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2014 - 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class HaicomProtocolDecoder extends BaseProtocolDecoder { - - public HaicomProtocolDecoder(HaicomProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$GPRS") - .number("(d+),") // imei - .expression("([^,]+),") // version - .number("(dd)(dd)(dd),") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(d)") // flags - .number("(dd)(d{5})") // latitude - .number("(ddd)(d{5}),") // longitude - .number("(d+),") // speed - .number("(d+),") // course - .number("(d+),") // status - .number("(d+)?,") // gprs counting value - .number("(d+)?,") // gps power saving counting value - .number("(d+),") // switch status - .number("(d+)") // relay status - .expression("(?:[LH]{2})?") // power status - .number("#V(d+)") // battery - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_VERSION_FW, parser.next()); - - position.setTime(parser.nextDateTime()); - - int flags = parser.nextInt(0); - - position.setValid(BitUtil.check(flags, 0)); - - double latitude = parser.nextDouble(0) + parser.nextDouble(0) / 60000; - if (BitUtil.check(flags, 2)) { - position.setLatitude(latitude); - } else { - position.setLatitude(-latitude); - } - - double longitude = parser.nextDouble(0) + parser.nextDouble(0) / 60000; - if (BitUtil.check(flags, 1)) { - position.setLongitude(longitude); - } else { - position.setLongitude(-longitude); - } - - position.setSpeed(parser.nextDouble(0) / 10); - position.setCourse(parser.nextDouble(0) / 10); - - position.set(Position.KEY_STATUS, parser.next()); - position.set("gprsCount", parser.next()); - position.set("powersaveCountdown", parser.next()); - position.set(Position.KEY_INPUT, parser.next()); - position.set(Position.KEY_OUTPUT, parser.next()); - position.set(Position.KEY_BATTERY, parser.nextDouble(0) * 0.1); - - return position; - } - -} diff --git a/src/org/traccar/protocol/HomtecsProtocol.java b/src/org/traccar/protocol/HomtecsProtocol.java deleted file mode 100644 index a9ea19c51..000000000 --- a/src/org/traccar/protocol/HomtecsProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2016 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.ConnectionlessBootstrap; -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 java.util.List; - -public class HomtecsProtocol extends BaseProtocol { - - public HomtecsProtocol() { - super("homtecs"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new HomtecsProtocolDecoder(HomtecsProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/HomtecsProtocolDecoder.java b/src/org/traccar/protocol/HomtecsProtocolDecoder.java deleted file mode 100644 index 508de173c..000000000 --- a/src/org/traccar/protocol/HomtecsProtocolDecoder.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2016 - 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class HomtecsProtocolDecoder extends BaseProtocolDecoder { - - public HomtecsProtocolDecoder(HomtecsProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .expression("([^_]+)") // id - .text("_R") - .number("(x{8}),") // mac ending - .number("(dd)(dd)(dd),") // date (yymmdd) - .number("(dd)(dd)(dd).d+,") // time (hhmmss) - .number("(d+),") // satellites - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*)?,") // speed - .number("(d+.?d*)?,") // course - .number("(d),") // fix status - .number("(d+.?d*)?,") // hdop - .number("(d+.?d*)?") // altitude - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - String id = parser.next(); - String mac = parser.next(); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id, id + "_R" + mac); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.YMD_HMS)); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.setValid(parser.nextInt(0) > 0); - - position.set(Position.KEY_HDOP, parser.nextDouble(0)); - - position.setAltitude(parser.nextDouble(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/HuaShengFrameDecoder.java b/src/org/traccar/protocol/HuaShengFrameDecoder.java deleted file mode 100644 index 4c29b7915..000000000 --- a/src/org/traccar/protocol/HuaShengFrameDecoder.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class HuaShengFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 2) { - return null; - } - - int index = buf.indexOf(buf.readerIndex() + 1, buf.writerIndex(), (byte) 0xC0); - if (index != -1) { - ChannelBuffer result = ChannelBuffers.buffer(index + 1 - buf.readerIndex()); - - while (buf.readerIndex() <= index) { - int b = buf.readUnsignedByte(); - if (b == 0xDB) { - int ext = buf.readUnsignedByte(); - if (ext == 0xDC) { - result.writeByte(0xC0); - } else if (ext == 0xDD) { - result.writeByte(0xDB); - } - } else { - result.writeByte(b); - } - } - - return result; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/HuaShengProtocol.java b/src/org/traccar/protocol/HuaShengProtocol.java deleted file mode 100644 index e0fddae20..000000000 --- a/src/org/traccar/protocol/HuaShengProtocol.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2016 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class HuaShengProtocol extends BaseProtocol { - - public HuaShengProtocol() { - super("huasheng"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new HuaShengFrameDecoder()); - pipeline.addLast("objectDecoder", new HuaShengProtocolDecoder(HuaShengProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/HuaShengProtocolDecoder.java b/src/org/traccar/protocol/HuaShengProtocolDecoder.java deleted file mode 100644 index a0a1eb0ab..000000000 --- a/src/org/traccar/protocol/HuaShengProtocolDecoder.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; - -public class HuaShengProtocolDecoder extends BaseProtocolDecoder { - - public HuaShengProtocolDecoder(HuaShengProtocol protocol) { - super(protocol); - } - - public static final int MSG_POSITION = 0xAA00; - public static final int MSG_POSITION_RSP = 0xFF01; - public static final int MSG_LOGIN = 0xAA02; - public static final int MSG_LOGIN_RSP = 0xFF03; - - private static void sendResponse(Channel channel, int type, int index, ChannelBuffer content) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeByte(0xC0); - response.writeShort(0x0100); - response.writeShort(12 + content.readableBytes()); - response.writeShort(type); - response.writeShort(0); - response.writeInt(index); - response.writeBytes(content); - response.writeByte(0xC0); - channel.write(response); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(1); // start marker - buf.readUnsignedByte(); // flag - buf.readUnsignedByte(); // reserved - buf.readUnsignedShort(); // length - - int type = buf.readUnsignedShort(); - - buf.readUnsignedShort(); // checksum - int index = buf.readInt(); - - if (type == MSG_LOGIN) { - - while (buf.readableBytes() > 4) { - int subtype = buf.readUnsignedShort(); - int length = buf.readUnsignedShort() - 4; - if (subtype == 0x0003) { - String imei = buf.readBytes(length).toString(StandardCharsets.US_ASCII); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession != null && channel != null) { - ChannelBuffer content = ChannelBuffers.dynamicBuffer(); - content.writeByte(0); // success - sendResponse(channel, MSG_LOGIN_RSP, index, content); - } - } else { - buf.skipBytes(length); - } - } - - } else if (type == MSG_POSITION) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - int status = buf.readUnsignedShort(); - - position.setValid(BitUtil.check(status, 15)); - - position.set(Position.KEY_STATUS, status); - position.set(Position.KEY_IGNITION, BitUtil.check(status, 14)); - position.set(Position.KEY_EVENT, buf.readUnsignedShort()); - - String time = buf.readBytes(12).toString(StandardCharsets.US_ASCII); - - DateBuilder dateBuilder = new DateBuilder() - .setYear(Integer.parseInt(time.substring(0, 2))) - .setMonth(Integer.parseInt(time.substring(2, 4))) - .setDay(Integer.parseInt(time.substring(4, 6))) - .setHour(Integer.parseInt(time.substring(6, 8))) - .setMinute(Integer.parseInt(time.substring(8, 10))) - .setSecond(Integer.parseInt(time.substring(10, 12))); - position.setTime(dateBuilder.getDate()); - - position.setLongitude(buf.readInt() * 0.00001); - position.setLatitude(buf.readInt() * 0.00001); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort())); - position.setCourse(buf.readUnsignedShort()); - position.setAltitude(buf.readUnsignedShort()); - - position.set(Position.KEY_ODOMETER, buf.readUnsignedShort() * 1000); - - while (buf.readableBytes() > 4) { - buf.readUnsignedShort(); // subtype - int length = buf.readUnsignedShort() - 4; - buf.skipBytes(length); - } - - sendResponse(channel, MSG_POSITION_RSP, index, ChannelBuffers.dynamicBuffer()); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/HuabaoFrameDecoder.java b/src/org/traccar/protocol/HuabaoFrameDecoder.java deleted file mode 100644 index 8e9c9fe72..000000000 --- a/src/org/traccar/protocol/HuabaoFrameDecoder.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class HuabaoFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 2) { - return null; - } - - int index = buf.indexOf(buf.readerIndex() + 1, buf.writerIndex(), (byte) 0x7e); - if (index != -1) { - ChannelBuffer result = ChannelBuffers.buffer(index + 1 - buf.readerIndex()); - - while (buf.readerIndex() <= index) { - int b = buf.readUnsignedByte(); - if (b == 0x7d) { - int ext = buf.readUnsignedByte(); - if (ext == 0x01) { - result.writeByte(0x7d); - } else if (ext == 0x02) { - result.writeByte(0x7e); - } - } else { - result.writeByte(b); - } - } - - return result; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/HuabaoProtocol.java b/src/org/traccar/protocol/HuabaoProtocol.java deleted file mode 100644 index c74cb58c7..000000000 --- a/src/org/traccar/protocol/HuabaoProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2015 - 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class HuabaoProtocol extends BaseProtocol { - - public HuabaoProtocol() { - super("huabao"); - setSupportedDataCommands( - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new HuabaoFrameDecoder()); - pipeline.addLast("objectEncoder", new HuabaoProtocolEncoder()); - pipeline.addLast("objectDecoder", new HuabaoProtocolDecoder(HuabaoProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/HuabaoProtocolDecoder.java b/src/org/traccar/protocol/HuabaoProtocolDecoder.java deleted file mode 100644 index c31c6af1c..000000000 --- a/src/org/traccar/protocol/HuabaoProtocolDecoder.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright 2015 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BcdUtil; -import org.traccar.helper.BitUtil; -import org.traccar.helper.Checksum; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.TimeZone; - -public class HuabaoProtocolDecoder extends BaseProtocolDecoder { - - public HuabaoProtocolDecoder(HuabaoProtocol protocol) { - super(protocol); - } - - public static final int MSG_GENERAL_RESPONSE = 0x8001; - public static final int MSG_TERMINAL_REGISTER = 0x0100; - public static final int MSG_TERMINAL_REGISTER_RESPONSE = 0x8100; - public static final int MSG_TERMINAL_AUTH = 0x0102; - public static final int MSG_LOCATION_REPORT = 0x0200; - public static final int MSG_OIL_CONTROL = 0XA006; - - public static final int RESULT_SUCCESS = 0; - - public static ChannelBuffer formatMessage(int type, ChannelBuffer id, ChannelBuffer data) { - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); - buf.writeByte(0x7e); - buf.writeShort(type); - buf.writeShort(data.readableBytes()); - buf.writeBytes(id); - buf.writeShort(1); // index - buf.writeBytes(data); - buf.writeByte(Checksum.xor(buf.toByteBuffer(1, buf.readableBytes() - 1))); - buf.writeByte(0x7e); - return buf; - } - - private void sendGeneralResponse( - Channel channel, SocketAddress remoteAddress, ChannelBuffer id, int type, int index) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeShort(index); - response.writeShort(type); - response.writeByte(RESULT_SUCCESS); - channel.write(formatMessage(MSG_GENERAL_RESPONSE, id, response), remoteAddress); - } - } - - private String decodeAlarm(long value) { - if (BitUtil.check(value, 0)) { - return Position.ALARM_SOS; - } - if (BitUtil.check(value, 1)) { - return Position.ALARM_OVERSPEED; - } - if (BitUtil.check(value, 5)) { - return Position.ALARM_GPS_ANTENNA_CUT; - } - if (BitUtil.check(value, 4) || BitUtil.check(value, 9) - || BitUtil.check(value, 10) || BitUtil.check(value, 11)) { - return Position.ALARM_FAULT; - } - if (BitUtil.check(value, 8)) { - return Position.ALARM_POWER_OFF; - } - if (BitUtil.check(value, 20)) { - return Position.ALARM_GEOFENCE; - } - if (BitUtil.check(value, 29)) { - return Position.ALARM_ACCIDENT; - } - return null; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.readUnsignedByte(); // start marker - int type = buf.readUnsignedShort(); - buf.readUnsignedShort(); // body length - ChannelBuffer id = buf.readBytes(6); // phone number - int index = buf.readUnsignedShort(); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, ChannelBuffers.hexDump(id)); - if (deviceSession == null) { - return null; - } - - if (type == MSG_TERMINAL_REGISTER) { - - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeShort(index); - response.writeByte(RESULT_SUCCESS); - response.writeBytes("authentication".getBytes(StandardCharsets.US_ASCII)); - channel.write(formatMessage(MSG_TERMINAL_REGISTER_RESPONSE, id, response), remoteAddress); - } - - } else if (type == MSG_TERMINAL_AUTH) { - - sendGeneralResponse(channel, remoteAddress, id, type, index); - - } else if (type == MSG_LOCATION_REPORT) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_ALARM, decodeAlarm(buf.readUnsignedInt())); - - int flags = buf.readInt(); - - position.set(Position.KEY_IGNITION, BitUtil.check(flags, 0)); - - position.setValid(BitUtil.check(flags, 1)); - - double lat = buf.readUnsignedInt() * 0.000001; - double lon = buf.readUnsignedInt() * 0.000001; - - if (BitUtil.check(flags, 2)) { - position.setLatitude(-lat); - } else { - position.setLatitude(lat); - } - - if (BitUtil.check(flags, 3)) { - position.setLongitude(-lon); - } else { - position.setLongitude(lon); - } - - position.setAltitude(buf.readShort()); - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort() * 0.1)); - position.setCourse(buf.readUnsignedShort()); - - DateBuilder dateBuilder = new DateBuilder(TimeZone.getTimeZone("GMT+8")) - .setYear(BcdUtil.readInteger(buf, 2)) - .setMonth(BcdUtil.readInteger(buf, 2)) - .setDay(BcdUtil.readInteger(buf, 2)) - .setHour(BcdUtil.readInteger(buf, 2)) - .setMinute(BcdUtil.readInteger(buf, 2)) - .setSecond(BcdUtil.readInteger(buf, 2)); - position.setTime(dateBuilder.getDate()); - - // additional information - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/HuabaoProtocolEncoder.java b/src/org/traccar/protocol/HuabaoProtocolEncoder.java deleted file mode 100644 index 7d6f0510d..000000000 --- a/src/org/traccar/protocol/HuabaoProtocolEncoder.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import javax.xml.bind.DatatypeConverter; -import java.text.SimpleDateFormat; -import java.util.Date; - -public class HuabaoProtocolEncoder extends BaseProtocolEncoder { - - @Override - protected Object encodeCommand(Command command) { - - ChannelBuffer id = ChannelBuffers.wrappedBuffer( - DatatypeConverter.parseHexBinary(getUniqueId(command.getDeviceId()))); - - ChannelBuffer data = ChannelBuffers.dynamicBuffer(); - byte[] time = DatatypeConverter.parseHexBinary(new SimpleDateFormat("yyMMddHHmmss").format(new Date())); - - switch (command.getType()) { - case Command.TYPE_ENGINE_STOP: - data.writeByte(0x01); - data.writeBytes(time); - return HuabaoProtocolDecoder.formatMessage(HuabaoProtocolDecoder.MSG_OIL_CONTROL, id, data); - case Command.TYPE_ENGINE_RESUME: - data.writeByte(0x00); - data.writeBytes(time); - return HuabaoProtocolDecoder.formatMessage(HuabaoProtocolDecoder.MSG_OIL_CONTROL, id, data); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - return null; - } - } - -} diff --git a/src/org/traccar/protocol/HunterProProtocol.java b/src/org/traccar/protocol/HunterProProtocol.java deleted file mode 100644 index 17352a0f3..000000000 --- a/src/org/traccar/protocol/HunterProProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class HunterProProtocol extends BaseProtocol { - - public HunterProProtocol() { - super("hunterpro"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "\r")); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new HunterProProtocolDecoder(HunterProProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/HunterProProtocolDecoder.java b/src/org/traccar/protocol/HunterProProtocolDecoder.java deleted file mode 100644 index b1e3f84a2..000000000 --- a/src/org/traccar/protocol/HunterProProtocolDecoder.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2016 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class HunterProProtocolDecoder extends BaseProtocolDecoder { - - public HunterProProtocolDecoder(HunterProProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number(">(d+)<") // identifier - .text("$GPRMC,") - .number("(dd)(dd)(dd).?d*,") // time (hhmmss) - .expression("([AV]),") // validity - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*)?,") // speed - .number("(d+.?d*)?,") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder(); - dateBuilder.setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/IdplProtocol.java b/src/org/traccar/protocol/IdplProtocol.java deleted file mode 100644 index f90d3fe7f..000000000 --- a/src/org/traccar/protocol/IdplProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 - 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 java.util.List; - -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; -import org.jboss.netty.handler.codec.string.StringDecoder; -import org.jboss.netty.handler.codec.string.StringEncoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -public class IdplProtocol extends BaseProtocol { - - public IdplProtocol() { - super("idpl"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new IdplProtocolDecoder(IdplProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/IdplProtocolDecoder.java b/src/org/traccar/protocol/IdplProtocolDecoder.java deleted file mode 100644 index e56a0f022..000000000 --- a/src/org/traccar/protocol/IdplProtocolDecoder.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2016 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 java.net.SocketAddress; -import java.util.regex.Pattern; - -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.Protocol; -import org.traccar.helper.Parser; -import org.traccar.helper.Parser.CoordinateFormat; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -public class IdplProtocolDecoder extends BaseProtocolDecoder { - - public IdplProtocolDecoder(Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("*ID") // start of frame - .number("(d+),") // command code - .number("(d+),") // imei - .number("(dd)(dd)(dd),") // current date (ddmmyy) - .number("(dd)(dd)(dd),") // current time (hhmmss) - .expression("([A|V]),") // gps fix - .number("(dd)(dd).?(d+),([NS]),") // latitude - .number("(ddd)(dd).?(d+),([EW]),") // longitude - .number("(d{1,3}.dd),") // speed - .number("(d{1,3}.dd),") // course - .number("(d{1,2}),") // sats - .number("(d{1,3}),") // gsm signal strength - .expression("([A|N|S]),") // vehicle status - .expression("([0|1]),") // main power status - .number("(d.dd),") // internal battery voltage - .expression("([0|1]),") // sos alert - .expression("([0|1]),") // body tamper - .expression("([0|1])([0|1]),") // ac status + ign status - .expression("([0|1|2]),") // output1 status - .number("(d{1,3}),") // adc1 - .number("(d{1,3}),") // adc2 - .expression("([0-9A-Z]{3}),") // software version - .expression("([L|R]),") // message type - .number("(x{4})#") // crc - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.set(Position.KEY_TYPE, parser.nextInt(0)); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate(CoordinateFormat.DEG_MIN_MIN_HEM)); - position.setLongitude(parser.nextCoordinate(CoordinateFormat.DEG_MIN_MIN_HEM)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - position.set(Position.KEY_RSSI, parser.nextInt(0)); - position.set("vehicleStatus", parser.next()); - position.set(Position.KEY_POWER, parser.nextInt(0)); - position.set(Position.KEY_BATTERY, parser.nextDouble(0)); - if (parser.nextInt(0) == 1) { - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - } - parser.nextInt(0); // body tamper - position.set("acStatus", parser.nextInt(0)); - position.set(Position.KEY_IGNITION, parser.nextInt(0) == 1); - position.set(Position.KEY_OUTPUT, parser.nextInt(0)); - position.set(Position.PREFIX_ADC + 1, parser.nextInt(0)); - position.set(Position.PREFIX_ADC + 2, parser.nextInt(0)); - position.set(Position.KEY_VERSION_FW, parser.next()); - position.set(Position.KEY_ARCHIVE, parser.next().equals("R")); - - parser.next(); // checksum - - return position; - } - -} diff --git a/src/org/traccar/protocol/IntellitracFrameDecoder.java b/src/org/traccar/protocol/IntellitracFrameDecoder.java deleted file mode 100644 index 49f8b4a5d..000000000 --- a/src/org/traccar/protocol/IntellitracFrameDecoder.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; - -public class IntellitracFrameDecoder extends LineBasedFrameDecoder { - - private static final int MESSAGE_MINIMUM_LENGTH = 0; - - public IntellitracFrameDecoder(int maxFrameLength) { - super(maxFrameLength); - } - - // example of sync header: 0xFA 0xF8 0x1B 0x01 0x81 0x60 0x33 0x3C - - @Override - protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - // Check minimum length - if (buf.readableBytes() < MESSAGE_MINIMUM_LENGTH) { - return null; - } - - // Check for sync packet - if (buf.getUnsignedShort(buf.readerIndex()) == 0xFAF8) { - ChannelBuffer syncMessage = buf.readBytes(8); - if (channel != null) { - channel.write(syncMessage); - } - } - - return super.decode(ctx, channel, buf); - } - -} diff --git a/src/org/traccar/protocol/IntellitracProtocol.java b/src/org/traccar/protocol/IntellitracProtocol.java deleted file mode 100644 index 2d9421636..000000000 --- a/src/org/traccar/protocol/IntellitracProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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 java.util.List; - -public class IntellitracProtocol extends BaseProtocol { - - public IntellitracProtocol() { - super("intellitrac"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new IntellitracFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new IntellitracProtocolDecoder(IntellitracProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/IntellitracProtocolDecoder.java b/src/org/traccar/protocol/IntellitracProtocolDecoder.java deleted file mode 100644 index 8f4e4c0d6..000000000 --- a/src/org/traccar/protocol/IntellitracProtocolDecoder.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2013 - 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class IntellitracProtocolDecoder extends BaseProtocolDecoder { - - public IntellitracProtocolDecoder(IntellitracProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .expression(".+,").optional() - .number("(d+),") // identifier - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(-?d+.d+),") // longitude - .number("(-?d+.d+),") // latitude - .number("(d+.?d*),") // speed - .number("(d+.?d*),") // course - .number("(-?d+.?d*),") // altitude - .number("(d+),") // satellites - .number("(d+),") // index - .number("(d+),") // input - .number("(d+),?") // output - .number("(d+.d+)?,?") // adc1 - .number("(d+.d+)?,?") // adc2 - .groupBegin() - .number("d{14},d+,") - .number("(d+),") // vss - .number("(d+),") // rpm - .number("(-?d+),") // coolant - .number("(d+),") // fuel - .number("(d+),") // fuel consumption - .number("(-?d+),") // fuel temperature - .number("(d+),") // charger pressure - .number("(d+),") // tpl - .number("(d+),") // axle weight - .number("(d+)") // odometer - .groupEnd("?") - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime()); - - position.setLongitude(parser.nextDouble(0)); - position.setLatitude(parser.nextDouble(0)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - int satellites = parser.nextInt(0); - position.setValid(satellites >= 3); - position.set(Position.KEY_SATELLITES, satellites); - - position.set(Position.KEY_INDEX, parser.nextLong(0)); - position.set(Position.KEY_INPUT, parser.nextInt(0)); - position.set(Position.KEY_OUTPUT, parser.nextInt(0)); - - position.set(Position.PREFIX_ADC + 1, parser.nextDouble(0)); - position.set(Position.PREFIX_ADC + 2, parser.nextDouble(0)); - - // J1939 data - position.set(Position.KEY_OBD_SPEED, parser.nextInt(0)); - position.set(Position.KEY_RPM, parser.nextInt(0)); - position.set("coolant", parser.nextInt(0)); - position.set(Position.KEY_FUEL_LEVEL, parser.nextInt(0)); - position.set(Position.KEY_FUEL_CONSUMPTION, parser.nextInt(0)); - position.set(Position.PREFIX_TEMP + 1, parser.nextInt(0)); - position.set("chargerPressure", parser.nextInt(0)); - position.set("tpl", parser.nextInt(0)); - position.set("axle", parser.nextInt(0)); - position.set(Position.KEY_OBD_ODOMETER, parser.nextInt(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/JpKorjarFrameDecoder.java b/src/org/traccar/protocol/JpKorjarFrameDecoder.java deleted file mode 100644 index 33a1b3f36..000000000 --- a/src/org/traccar/protocol/JpKorjarFrameDecoder.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2016 Nyash (nyashh@gmail.com) - * - * 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class JpKorjarFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 80) { - return null; - } - - int spaceIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) ' '); - if (spaceIndex == -1) { - return null; - } - - int endIndex = buf.indexOf(spaceIndex, buf.writerIndex(), (byte) ','); - if (endIndex == -1) { - return null; - } - - return buf.readBytes(endIndex + 1); - } - -} diff --git a/src/org/traccar/protocol/JpKorjarProtocol.java b/src/org/traccar/protocol/JpKorjarProtocol.java deleted file mode 100644 index c54994708..000000000 --- a/src/org/traccar/protocol/JpKorjarProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2016 Nyash (nyashh@gmail.com) - * - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class JpKorjarProtocol extends BaseProtocol { - - public JpKorjarProtocol() { - super("jpkorjar"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), this.getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - - pipeline.addLast("frameDecoder", new JpKorjarFrameDecoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new JpKorjarProtocolDecoder(JpKorjarProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/JpKorjarProtocolDecoder.java b/src/org/traccar/protocol/JpKorjarProtocolDecoder.java deleted file mode 100644 index 654b3e3d0..000000000 --- a/src/org/traccar/protocol/JpKorjarProtocolDecoder.java +++ /dev/null @@ -1,89 +0,0 @@ -/*
- * Copyright 2016 Nyash (nyashh@gmail.com)
- * Copyright 2016 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.helper.Parser;
-import org.traccar.helper.PatternBuilder;
-import org.traccar.model.CellTower;
-import org.traccar.model.Network;
-import org.traccar.model.Position;
-
-import java.net.SocketAddress;
-import java.util.regex.Pattern;
-
-public class JpKorjarProtocolDecoder extends BaseProtocolDecoder {
-
- public JpKorjarProtocolDecoder(JpKorjarProtocol protocol) {
- super(protocol);
- }
-
- private static final Pattern PATTERN = new PatternBuilder()
- .text("KORJAR.PL,")
- .number("(d+),") // imei
- .number("(dd)(dd)(dd)") // date (yymmdd)
- .number("(dd)(dd)(dd),") // time (hhmmss)
- .number("(d+.d+)([NS]),") // latitude
- .number("(d+.d+)([EW]),") // longitude
- .number("(d+.d+),") // speed
- .number("(d+),") // course
- .number("[FL]:(d+.d+)V,") // battery
- .number("([01]) ") // valid
- .number("(d+) ") // mcc
- .number("(d+) ") // mnc
- .number("(x+) ") // lac
- .number("(x+),") // cid
- .compile();
-
- @Override
- protected Object decode(
- Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
-
- Parser parser = new Parser(PATTERN, (String) msg);
- if (!parser.matches()) {
- return null;
- }
-
- Position position = new Position();
- position.setProtocol(getProtocolName());
-
- DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next());
- if (deviceSession == null) {
- return null;
- }
- position.setDeviceId(deviceSession.getDeviceId());
-
- position.setTime(parser.nextDateTime());
-
- position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM));
- position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM));
- position.setSpeed(parser.nextDouble(0));
- position.setCourse(parser.nextDouble(0));
-
- position.set(Position.KEY_BATTERY, parser.nextDouble(0));
-
- position.setValid(parser.nextInt(0) == 1);
-
- position.setNetwork(new Network(CellTower.from(
- parser.nextInt(0), parser.nextInt(0), parser.nextHexInt(0), parser.nextHexInt(0))));
-
- return position;
- }
-
-}
diff --git a/src/org/traccar/protocol/Jt600FrameDecoder.java b/src/org/traccar/protocol/Jt600FrameDecoder.java deleted file mode 100644 index 5606ae1fc..000000000 --- a/src/org/traccar/protocol/Jt600FrameDecoder.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2012 - 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -import java.text.ParseException; - -public class Jt600FrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 10) { - return null; - } - - char type = (char) buf.getByte(buf.readerIndex()); - - if (type == '$') { - boolean longFormat = buf.getUnsignedByte(buf.readerIndex() + 1) == 0x75; - int length = buf.getUnsignedShort(buf.readerIndex() + (longFormat ? 8 : 7)) + 10; - if (length >= buf.readableBytes()) { - return buf.readBytes(length); - } - } else if (type == '(') { - int endIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) ')'); - if (endIndex != -1) { - return buf.readBytes(endIndex + 1); - } - } else { - throw new ParseException(null, 0); // unknown message - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Jt600Protocol.java b/src/org/traccar/protocol/Jt600Protocol.java deleted file mode 100644 index 8c71ca4f6..000000000 --- a/src/org/traccar/protocol/Jt600Protocol.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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.StringEncoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class Jt600Protocol extends BaseProtocol { - - public Jt600Protocol() { - super("jt600"); - setSupportedDataCommands( - Command.TYPE_ENGINE_RESUME, - Command.TYPE_ENGINE_STOP, - Command.TYPE_SET_TIMEZONE, - Command.TYPE_REBOOT_DEVICE); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new Jt600FrameDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new Jt600ProtocolEncoder()); - pipeline.addLast("objectDecoder", new Jt600ProtocolDecoder(Jt600Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Jt600ProtocolDecoder.java b/src/org/traccar/protocol/Jt600ProtocolDecoder.java deleted file mode 100644 index f76fd8069..000000000 --- a/src/org/traccar/protocol/Jt600ProtocolDecoder.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright 2012 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BcdUtil; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.LinkedList; -import java.util.List; -import java.util.regex.Pattern; - -public class Jt600ProtocolDecoder extends BaseProtocolDecoder { - - public Jt600ProtocolDecoder(Jt600Protocol protocol) { - super(protocol); - } - - private static double convertCoordinate(int raw) { - int degrees = raw / 1000000; - double minutes = (raw % 1000000) / 10000.0; - return degrees + minutes / 60; - } - - private List<Position> decodeBinary(ChannelBuffer buf, Channel channel, SocketAddress remoteAddress) { - - List<Position> positions = new LinkedList<>(); - - buf.readByte(); // header - - boolean longFormat = buf.getUnsignedByte(buf.readerIndex()) == 0x75; - - String id = String.valueOf(Long.parseLong(ChannelBuffers.hexDump(buf.readBytes(5)))); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id); - if (deviceSession == null) { - return null; - } - - if (longFormat) { - buf.readUnsignedByte(); // protocol - } - - int version = BitUtil.from(buf.readUnsignedByte(), 4); - buf.readUnsignedShort(); // length - - while (buf.readableBytes() > 1) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setDay(BcdUtil.readInteger(buf, 2)) - .setMonth(BcdUtil.readInteger(buf, 2)) - .setYear(BcdUtil.readInteger(buf, 2)) - .setHour(BcdUtil.readInteger(buf, 2)) - .setMinute(BcdUtil.readInteger(buf, 2)) - .setSecond(BcdUtil.readInteger(buf, 2)); - position.setTime(dateBuilder.getDate()); - - double latitude = convertCoordinate(BcdUtil.readInteger(buf, 8)); - double longitude = convertCoordinate(BcdUtil.readInteger(buf, 9)); - - byte flags = buf.readByte(); - position.setValid((flags & 0x1) == 0x1); - if ((flags & 0x2) == 0) { - latitude = -latitude; - } - position.setLatitude(latitude); - if ((flags & 0x4) == 0) { - longitude = -longitude; - } - position.setLongitude(longitude); - - position.setSpeed(BcdUtil.readInteger(buf, 2)); - position.setCourse(buf.readUnsignedByte() * 2.0); - - if (longFormat) { - - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt() * 1000); - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - - buf.readUnsignedInt(); // vehicle id combined - - position.set(Position.KEY_STATUS, buf.readUnsignedShort()); - - int battery = buf.readUnsignedByte(); - if (battery == 0xff) { - position.set(Position.KEY_CHARGE, true); - } else { - position.set(Position.KEY_BATTERY_LEVEL, battery); - } - - CellTower cellTower = CellTower.fromCidLac(buf.readUnsignedShort(), buf.readUnsignedShort()); - cellTower.setSignalStrength((int) buf.readUnsignedByte()); - position.setNetwork(new Network(cellTower)); - - } else if (version == 1) { - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - position.set(Position.KEY_POWER, buf.readUnsignedByte()); - - buf.readByte(); // other flags and sensors - - position.setAltitude(buf.readUnsignedShort()); - - int cid = buf.readUnsignedShort(); - int lac = buf.readUnsignedShort(); - int rssi = buf.readUnsignedByte(); - - if (cid != 0 && lac != 0) { - CellTower cellTower = CellTower.fromCidLac(cid, lac); - cellTower.setSignalStrength(rssi); - position.setNetwork(new Network(cellTower)); - } else { - position.set(Position.KEY_RSSI, rssi); - } - - } else if (version == 2) { - - int fuel = buf.readUnsignedByte() << 8; - - position.set(Position.KEY_STATUS, buf.readUnsignedInt()); - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt() * 1000); - - fuel += buf.readUnsignedByte(); - position.set(Position.KEY_FUEL_LEVEL, fuel); - - } - - positions.add(position); - - } - - buf.readUnsignedByte(); // index - - return positions; - } - - private static final Pattern PATTERN_W01 = new PatternBuilder() - .text("(") - .number("(d+),") // id - .text("W01,") // type - .number("(ddd)(dd.dddd),") // longitude - .expression("([EW]),") - .number("(dd)(dd.dddd),") // latitude - .expression("([NS]),") - .expression("([AV]),") // validity - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(d+),") // speed - .number("(d+),") // course - .number("(d+),") // power - .number("(d+),") // gps signal - .number("(d+),") // gsm signal - .number("(d+),") // alert type - .any() - .compile(); - - private Position decodeW01(String sentence, Channel channel, SocketAddress remoteAddress) { - - Parser parser = new Parser(PATTERN_W01, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setLongitude(parser.nextCoordinate()); - position.setLatitude(parser.nextCoordinate()); - position.setValid(parser.next().equals("A")); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_POWER, parser.nextDouble(0)); - position.set(Position.KEY_GPS, parser.nextInt(0)); - position.set(Position.KEY_RSSI, parser.nextInt(0)); - position.set("alertType", parser.nextInt(0)); - - return position; - } - - private static final Pattern PATTERN_U01 = new PatternBuilder() - .text("(") - .number("(d+),") // id - .number("(Udd),") // type - .number("d+,").optional() // alarm - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(dd)(dd)(dd),") // time (hhmmss) - .expression("([TF]),") // validity - .number("(d+.d+),([NS]),") // latitude - .number("(d+.d+),([EW]),") // longitude - .number("(d+.?d*),") // speed - .number("(d+),") // course - .number("(d+),") // satellites - .number("(d+)%,") // battery - .expression("([01]+),") // status - .number("(d+),") // cid - .number("(d+),") // lac - .number("(d+),") // gsm signal - .number("(d+),") // odometer - .number("(d+)") // serial number - .number(",(xx)").optional() // checksum - .any() - .compile(); - - private Position decodeU01(String sentence, Channel channel, SocketAddress remoteAddress) { - - Parser parser = new Parser(PATTERN_U01, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - String type = parser.next(); - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setValid(parser.next().equals("T")); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM)); - - position.setSpeed(UnitsConverter.knotsFromMph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt(0)); - position.set(Position.KEY_STATUS, parser.nextBinInt(0)); - - CellTower cellTower = CellTower.fromCidLac(parser.nextInt(0), parser.nextInt(0)); - cellTower.setSignalStrength(parser.nextInt(0)); - position.setNetwork(new Network(cellTower)); - - position.set(Position.KEY_ODOMETER, parser.nextLong(0) * 1000); - position.set(Position.KEY_INDEX, parser.nextInt(0)); - - if (channel != null) { - if (type.equals("U01") || type.equals("U02") || type.equals("U03")) { - channel.write("(S39)"); - } else if (type.equals("U06")) { - channel.write("(S20)"); - } - } - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - char first = (char) buf.getByte(0); - - if (first == '$') { - return decodeBinary(buf, channel, remoteAddress); - } else if (first == '(') { - String sentence = buf.toString(StandardCharsets.US_ASCII); - if (sentence.contains("W01")) { - return decodeW01(sentence, channel, remoteAddress); - } else { - return decodeU01(sentence, channel, remoteAddress); - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Jt600ProtocolEncoder.java b/src/org/traccar/protocol/Jt600ProtocolEncoder.java deleted file mode 100644 index 377f104a3..000000000 --- a/src/org/traccar/protocol/Jt600ProtocolEncoder.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2016 - 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 java.util.TimeZone; - -import org.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class Jt600ProtocolEncoder extends StringProtocolEncoder { - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_ENGINE_STOP: - return "(S07,0)"; - case Command.TYPE_ENGINE_RESUME: - return "(S07,1)"; - case Command.TYPE_SET_TIMEZONE: - int offset = TimeZone.getTimeZone(command.getString(Command.KEY_TIMEZONE)).getRawOffset() / 60000; - return "(S09,1," + offset + ")"; - case Command.TYPE_REBOOT_DEVICE: - return "(S17)"; - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } -} diff --git a/src/org/traccar/protocol/KenjiProtocol.java b/src/org/traccar/protocol/KenjiProtocol.java deleted file mode 100644 index 8b196a9ed..000000000 --- a/src/org/traccar/protocol/KenjiProtocol.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2016 by Carlos Alvarez (carlos.alvarez.rozas@gmail.com) - * - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class KenjiProtocol extends BaseProtocol { - - public KenjiProtocol() { - super("kenji"); - } - - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new KenjiProtocolDecoder(KenjiProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/KenjiProtocolDecoder.java b/src/org/traccar/protocol/KenjiProtocolDecoder.java deleted file mode 100644 index 4216da0c3..000000000 --- a/src/org/traccar/protocol/KenjiProtocolDecoder.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2016 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.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class KenjiProtocolDecoder extends BaseProtocolDecoder { - - public KenjiProtocolDecoder(KenjiProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text(">") - .number("C(d{6}),") // device id - .number("M(x{6}),") // alarm - .number("O(x{4}),") // output - .number("I(x{4}),") // input - .number("D(dd)(dd)(dd),") // time (hhmmss) - .expression("([AV]),") // valid - .number("([NS])(dd)(dd.d+),") // latitude - .number("([EW])(ddd)(dd.d+),") // longitude - .number("T(d+.d+),") // speed - .number("H(d+.d+),") // course - .number("Y(dd)(dd)(dd),") // date (ddmmyy) - .number("G(d+)") // satellites - .any() - .compile(); - - private String decodeAlarm(int value) { - if (BitUtil.check(value, 2)) { - return Position.ALARM_SOS; - } - if (BitUtil.check(value, 4)) { - return Position.ALARM_LOW_BATTERY; - } - if (BitUtil.check(value, 6)) { - return Position.ALARM_MOVEMENT; - } - if (BitUtil.check(value, 1) || BitUtil.check(value, 10) || BitUtil.check(value, 11)) { - return Position.ALARM_VIBRATION; - } - - return null; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_ALARM, decodeAlarm(parser.nextHexInt(0))); - position.set(Position.KEY_OUTPUT, parser.nextHexInt(0)); - position.set(Position.KEY_INPUT, parser.nextHexInt(0)); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/KhdProtocol.java b/src/org/traccar/protocol/KhdProtocol.java deleted file mode 100644 index 167727191..000000000 --- a/src/org/traccar/protocol/KhdProtocol.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class KhdProtocol extends BaseProtocol { - - public KhdProtocol() { - super("khd"); - setSupportedDataCommands( - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(512, 3, 2)); - pipeline.addLast("objectEncoder", new KhdProtocolEncoder()); - pipeline.addLast("objectDecoder", new KhdProtocolDecoder(KhdProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/KhdProtocolDecoder.java b/src/org/traccar/protocol/KhdProtocolDecoder.java deleted file mode 100644 index d63219736..000000000 --- a/src/org/traccar/protocol/KhdProtocolDecoder.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright 2014 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BcdUtil; -import org.traccar.helper.Checksum; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; - -public class KhdProtocolDecoder extends BaseProtocolDecoder { - - public KhdProtocolDecoder(KhdProtocol protocol) { - super(protocol); - } - - private String readSerialNumber(ChannelBuffer buf) { - int b1 = buf.readUnsignedByte(); - int b2 = buf.readUnsignedByte(); - if (b2 > 0x80) { - b2 -= 0x80; - } - int b3 = buf.readUnsignedByte(); - if (b3 > 0x80) { - b3 -= 0x80; - } - int b4 = buf.readUnsignedByte(); - String serialNumber = String.format("%02d%02d%02d%02d", b1, b2, b3, b4); - return String.valueOf(Long.parseLong(serialNumber)); - } - - public static final int MSG_LOGIN = 0xB1; - public static final int MSG_CONFIRMATION = 0x21; - public static final int MSG_ON_DEMAND = 0x81; - public static final int MSG_POSITION_UPLOAD = 0x80; - public static final int MSG_POSITION_REUPLOAD = 0x8E; - public static final int MSG_ALARM = 0x82; - public static final int MSG_REPLY = 0x85; - public static final int MSG_PERIPHERAL = 0xA3; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - int type = buf.readUnsignedByte(); - buf.readUnsignedShort(); // size - - if (type == MSG_ON_DEMAND || type == MSG_POSITION_UPLOAD || type == MSG_POSITION_REUPLOAD - || type == MSG_ALARM || type == MSG_REPLY || type == MSG_PERIPHERAL) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, readSerialNumber(buf)); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setYear(BcdUtil.readInteger(buf, 2)) - .setMonth(BcdUtil.readInteger(buf, 2)) - .setDay(BcdUtil.readInteger(buf, 2)) - .setHour(BcdUtil.readInteger(buf, 2)) - .setMinute(BcdUtil.readInteger(buf, 2)) - .setSecond(BcdUtil.readInteger(buf, 2)); - position.setTime(dateBuilder.getDate()); - - position.setLatitude(BcdUtil.readCoordinate(buf)); - position.setLongitude(BcdUtil.readCoordinate(buf)); - position.setSpeed(UnitsConverter.knotsFromKph(BcdUtil.readInteger(buf, 4))); - position.setCourse(BcdUtil.readInteger(buf, 4)); - position.setValid((buf.readUnsignedByte() & 0x80) != 0); - - if (type != MSG_ALARM) { - - position.set(Position.KEY_ODOMETER, buf.readUnsignedMedium()); - position.set(Position.KEY_STATUS, buf.readUnsignedInt()); - position.set(Position.KEY_HDOP, buf.readUnsignedByte()); - position.set(Position.KEY_VDOP, buf.readUnsignedByte()); - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - - buf.skipBytes(5); // other location data - - if (type == MSG_PERIPHERAL) { - - buf.readUnsignedShort(); // data length - - int dataType = buf.readUnsignedByte(); - - buf.readUnsignedByte(); // content length - - switch (dataType) { - case 0x01: - position.set(Position.KEY_FUEL_LEVEL, - buf.readUnsignedByte() * 100 + buf.readUnsignedByte()); - break; - case 0x02: - position.set(Position.PREFIX_TEMP + 1, - buf.readUnsignedByte() * 100 + buf.readUnsignedByte()); - break; - default: - break; - } - - } - - } - - return position; - - } else if (type == MSG_LOGIN && channel != null) { - - buf.skipBytes(4); // serial number - buf.readByte(); // reserved - - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeByte(0x29); response.writeByte(0x29); // header - response.writeByte(MSG_CONFIRMATION); - response.writeShort(5); // size - response.writeByte(buf.readUnsignedByte()); - response.writeByte(type); - response.writeByte(0); // reserved - response.writeByte(Checksum.xor(response.toByteBuffer())); - response.writeByte(0x0D); // ending - channel.write(response); - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/KhdProtocolEncoder.java b/src/org/traccar/protocol/KhdProtocolEncoder.java deleted file mode 100644 index 618e43dad..000000000 --- a/src/org/traccar/protocol/KhdProtocolEncoder.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Checksum; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class KhdProtocolEncoder extends BaseProtocolEncoder { - - public static final int MSG_CUT_OIL = 0x39; - public static final int MSG_RESUME_OIL = 0x38; - - private ChannelBuffer encodeCommand(int command) { - - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); - - buf.writeByte(0x29); - buf.writeByte(0x29); - - buf.writeByte(command); - buf.writeShort(6); // size - - buf.writeInt(0); // terminal id - - buf.writeByte(Checksum.xor(buf.toByteBuffer())); - buf.writeByte(0x0D); // ending - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_ENGINE_STOP: - return encodeCommand(MSG_CUT_OIL); - case Command.TYPE_ENGINE_RESUME: - return encodeCommand(MSG_RESUME_OIL); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/L100FrameDecoder.java b/src/org/traccar/protocol/L100FrameDecoder.java deleted file mode 100644 index a597cbd7d..000000000 --- a/src/org/traccar/protocol/L100FrameDecoder.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class L100FrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 80) { - return null; - } - - int index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) 0x02); - if (index == -1) { - index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) 0x04); - if (index == -1) { - return null; - } - } - - index += 2; // checksum - - if (buf.readableBytes() >= index - buf.readerIndex()) { - return buf.readBytes(index - buf.readerIndex()); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/L100Protocol.java b/src/org/traccar/protocol/L100Protocol.java deleted file mode 100644 index 2bcef4caa..000000000 --- a/src/org/traccar/protocol/L100Protocol.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2016 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class L100Protocol extends BaseProtocol { - - public L100Protocol() { - super("l100"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new L100FrameDecoder()); - pipeline.addLast("objectDecoder", new L100ProtocolDecoder(L100Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/L100ProtocolDecoder.java b/src/org/traccar/protocol/L100ProtocolDecoder.java deleted file mode 100644 index 618448080..000000000 --- a/src/org/traccar/protocol/L100ProtocolDecoder.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.regex.Pattern; - -public class L100ProtocolDecoder extends BaseProtocolDecoder { - - public L100ProtocolDecoder(L100Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("ATL") - .number("(d{15}),") // imei - .text("$GPRMC,") - .number("(dd)(dd)(dd)") // time (hhmmss.sss) - .number(".(ddd)").optional() - .expression(",([AV]),") // validity - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*)?,") // speed - .number("(d+.?d*)?,") // course - .number("(dd)(dd)(dd),") // date (ddmmyy) - .any() - .text("#") - .number("([01]+),") // io status - .number("(d+.?d*|N.C),") // adc - .expression("[^,]*,") // reserved - .expression("[^,]*,") // reserved - .number("(d+.d+),") // odometer - .number("(d+.d+),") // temperature - .number("(d+.d+),") // battery - .number("(d+),") // gsm - .number("(d+),") // mcc - .number("(d+),") // mnc - .number("(x+),") // lac - .number("(x+)") // cid - .text("ATL") - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.readUnsignedByte(); // start marker - buf.readUnsignedByte(); // type - - String sentence = buf.readBytes(buf.readableBytes() - 2).toString(StandardCharsets.US_ASCII); - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.set(Position.KEY_STATUS, parser.next()); - position.set(Position.PREFIX_ADC + 1, parser.next()); - position.set(Position.KEY_ODOMETER, parser.nextDouble(0)); - position.set(Position.PREFIX_TEMP + 1, parser.nextDouble(0)); - position.set(Position.KEY_BATTERY, parser.nextDouble(0)); - - int rssi = parser.nextInt(0); - position.setNetwork(new Network(CellTower.from( - parser.nextInt(0), parser.nextInt(0), parser.nextHexInt(0), parser.nextHexInt(0), rssi))); - - return position; - } - -} diff --git a/src/org/traccar/protocol/LaipacProtocol.java b/src/org/traccar/protocol/LaipacProtocol.java deleted file mode 100644 index 45b803a0f..000000000 --- a/src/org/traccar/protocol/LaipacProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class LaipacProtocol extends BaseProtocol { - - public LaipacProtocol() { - super("laipac"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new LaipacProtocolDecoder(LaipacProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/LaipacProtocolDecoder.java b/src/org/traccar/protocol/LaipacProtocolDecoder.java deleted file mode 100644 index 32d4ff0e6..000000000 --- a/src/org/traccar/protocol/LaipacProtocolDecoder.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * 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.helper.Checksum; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class LaipacProtocolDecoder extends BaseProtocolDecoder { - - public LaipacProtocolDecoder(LaipacProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$AVRMC,") - .expression("([^,]+),") // identifier - .number("(dd)(dd)(dd),") // time (hhmmss) - .expression("([AVRPavrp]),") // validity - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .number("([EW]),") - .number("(d+.d+),") // speed - .number("(d+.d+),") // course - .number("(dd)(dd)(dd),") // date (ddmmyy) - .expression("(.),") // type - .expression("[^*]+").text("*") - .number("(xx)") // checksum - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.startsWith("$ECHK") && channel != null) { - channel.write(sentence + "\r\n"); // heartbeat - return null; - } - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - String status = parser.next(); - position.setValid(status.toUpperCase().equals("A")); - - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - String type = parser.next(); - String checksum = parser.next(); - - if (channel != null) { - - if (Character.isLowerCase(status.charAt(0))) { - String response = "$EAVACK," + type + "," + checksum; - response += Checksum.nmea(response); - channel.write(response); - } - - if (type.equals("S") || type.equals("T")) { - channel.write("$AVCFG,00000000,t*21"); - } else if (type.equals("3")) { - channel.write("$AVCFG,00000000,d*31"); - } else if (type.equals("X") || type.equals("4")) { - channel.write("$AVCFG,00000000,x*2D"); - } - - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/M2mProtocol.java b/src/org/traccar/protocol/M2mProtocol.java deleted file mode 100644 index 09393fed0..000000000 --- a/src/org/traccar/protocol/M2mProtocol.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.frame.FixedLengthFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class M2mProtocol extends BaseProtocol { - - public M2mProtocol() { - super("m2m"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new FixedLengthFrameDecoder(23)); - pipeline.addLast("objectDecoder", new M2mProtocolDecoder(M2mProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/M2mProtocolDecoder.java b/src/org/traccar/protocol/M2mProtocolDecoder.java deleted file mode 100644 index a3c2ada2f..000000000 --- a/src/org/traccar/protocol/M2mProtocolDecoder.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; - -public class M2mProtocolDecoder extends BaseProtocolDecoder { - - public M2mProtocolDecoder(M2mProtocol protocol) { - super(protocol); - } - - private boolean firstPacket = true; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - // Remove offset - for (int i = 0; i < buf.readableBytes(); i++) { - int b = buf.getByte(i); - if (b != 0x0b) { - buf.setByte(i, b - 0x20); - } - } - - if (firstPacket) { - - firstPacket = false; - - StringBuilder imei = new StringBuilder(); - for (int i = 0; i < 8; i++) { - int b = buf.readByte(); - if (i != 0) { - imei.append(b / 10); - } - imei.append(b % 10); - } - - getDeviceSession(channel, remoteAddress, imei.toString()); - - } else { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setDay(buf.readUnsignedByte() & 0x3f) - .setMonth(buf.readUnsignedByte() & 0x3f) - .setYear(buf.readUnsignedByte()) - .setHour(buf.readUnsignedByte() & 0x3f) - .setMinute(buf.readUnsignedByte() & 0x7f) - .setSecond(buf.readUnsignedByte() & 0x7f); - position.setTime(dateBuilder.getDate()); - - int degrees = buf.readUnsignedByte(); - double latitude = buf.readUnsignedByte(); - latitude += buf.readUnsignedByte() / 100.0; - latitude += buf.readUnsignedByte() / 10000.0; - latitude /= 60; - latitude += degrees; - - int b = buf.readUnsignedByte(); - - degrees = (b & 0x7f) * 100 + buf.readUnsignedByte(); - double longitude = buf.readUnsignedByte(); - longitude += buf.readUnsignedByte() / 100.0; - longitude += buf.readUnsignedByte() / 10000.0; - longitude /= 60; - longitude += degrees; - - if ((b & 0x80) != 0) { - longitude = -longitude; - } - if ((b & 0x40) != 0) { - latitude = -latitude; - } - - position.setValid(true); - position.setLatitude(latitude); - position.setLongitude(longitude); - position.setSpeed(buf.readUnsignedByte()); - - int satellites = buf.readUnsignedByte(); - if (satellites == 0) { - return null; // cell information - } - position.set(Position.KEY_SATELLITES, satellites); - - // decode other data - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/MaestroProtocol.java b/src/org/traccar/protocol/MaestroProtocol.java deleted file mode 100644 index 5e0b69916..000000000 --- a/src/org/traccar/protocol/MaestroProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.frame.FixedLengthFrameDecoder; -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 java.util.List; - -public class MaestroProtocol extends BaseProtocol { - - public MaestroProtocol() { - super("maestro"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new FixedLengthFrameDecoder(160)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new MaestroProtocolDecoder(MaestroProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/MaestroProtocolDecoder.java b/src/org/traccar/protocol/MaestroProtocolDecoder.java deleted file mode 100644 index 7d779a0a0..000000000 --- a/src/org/traccar/protocol/MaestroProtocolDecoder.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2016 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.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 MaestroProtocolDecoder extends BaseProtocolDecoder { - - public MaestroProtocolDecoder(MaestroProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("@") - .number("(d+),") // imei - .number("d+,") // index - .expression("[^,]+,") // profile - .expression("([01]),") // validity - .number("(d+.d+),") // battery - .number("(d+),") // gsm - .expression("([01]),") // starter - .expression("([01]),") // ignition - .number("(dd)/(dd)/(dd),") // date (yy/mm/dd) - .number("(dd):(dd):(dd),") // time (hh:mm:ss) - .number("(-?d+.d+),") // longitude - .number("(-?d+.d+),") // latitude - .number("(d+.?d*),") // altitude - .number("(d+.?d*),") // speed - .number("(d+.?d*),") // course - .number("(d+),") // satellites - .number("(d+.?d*),") // hdop - .number("(d+.?d*)") // odometer - .number(",(d+)").optional() // adc - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(parser.nextInt(0) == 1); - - position.set(Position.KEY_BATTERY, parser.nextDouble(0)); - position.set(Position.KEY_RSSI, parser.nextInt(0)); - position.set(Position.KEY_CHARGE, parser.nextInt(0) == 1); - position.set(Position.KEY_IGNITION, parser.nextInt(0) == 1); - - 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(0)); - position.set(Position.KEY_HDOP, parser.nextDouble(0)); - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1609.34); - - if (parser.hasNext()) { - position.set(Position.PREFIX_ADC + 1, parser.nextInt(0)); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/ManPowerProtocol.java b/src/org/traccar/protocol/ManPowerProtocol.java deleted file mode 100644 index 60ce8b282..000000000 --- a/src/org/traccar/protocol/ManPowerProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class ManPowerProtocol extends BaseProtocol { - - public ManPowerProtocol() { - super("manpower"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, ';')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new ManPowerProtocolDecoder(ManPowerProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/ManPowerProtocolDecoder.java b/src/org/traccar/protocol/ManPowerProtocolDecoder.java deleted file mode 100644 index 6cff8b961..000000000 --- a/src/org/traccar/protocol/ManPowerProtocolDecoder.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2013 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class ManPowerProtocolDecoder extends BaseProtocolDecoder { - - public ManPowerProtocolDecoder(ManPowerProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("simei:") - .number("(d+),") // imei - .expression("[^,]*,[^,]*,") - .expression("([^,]*),") // status - .number("d+,d+,d+.?d*,") - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .expression("([AV]),") // validity - .number("(dd)(dd.dddd),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.dddd),") // longitude - .expression("([EW])?,") - .number("(d+.?d*),") // speed - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_STATUS, parser.next()); - - position.setTime(parser.nextDateTime()); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/MegastekFrameDecoder.java b/src/org/traccar/protocol/MegastekFrameDecoder.java deleted file mode 100644 index d9cb07108..000000000 --- a/src/org/traccar/protocol/MegastekFrameDecoder.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2015 - 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; -import org.traccar.helper.StringFinder; - -import java.nio.charset.StandardCharsets; - -public class MegastekFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 10) { - return null; - } - - if (Character.isDigit(buf.getByte(buf.readerIndex()))) { - int length = 4 + Integer.parseInt(buf.toString(buf.readerIndex(), 4, StandardCharsets.US_ASCII)); - if (buf.readableBytes() >= length) { - return buf.readBytes(length); - } - } else { - while (buf.getByte(buf.readerIndex()) == '\r' || buf.getByte(buf.readerIndex()) == '\n') { - buf.skipBytes(1); - } - int delimiter = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new StringFinder("\r\n")); - if (delimiter == -1) { - delimiter = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '!'); - } - if (delimiter != -1) { - ChannelBuffer result = buf.readBytes(delimiter - buf.readerIndex()); - buf.skipBytes(1); - return result; - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/MegastekProtocol.java b/src/org/traccar/protocol/MegastekProtocol.java deleted file mode 100644 index b28a05b92..000000000 --- a/src/org/traccar/protocol/MegastekProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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 java.util.List; - -public class MegastekProtocol extends BaseProtocol { - - public MegastekProtocol() { - super("megastek"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new MegastekFrameDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new MegastekProtocolDecoder(MegastekProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/MegastekProtocolDecoder.java b/src/org/traccar/protocol/MegastekProtocolDecoder.java deleted file mode 100644 index 3ef52acd1..000000000 --- a/src/org/traccar/protocol/MegastekProtocolDecoder.java +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright 2013 - 2016 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class MegastekProtocolDecoder extends BaseProtocolDecoder { - - public MegastekProtocolDecoder(MegastekProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN_GPRMC = new PatternBuilder() - .text("$GPRMC,") - .number("(dd)(dd)(dd).(ddd),") // time (hhmmss.sss) - .expression("([AV]),") // validity - .number("(d+)(dd.d+),([NS]),") // latitude - .number("(d+)(dd.d+),([EW]),") // longitude - .number("(d+.d+)?,") // speed - .number("(d+.d+)?,") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .any() // checksum - .compile(); - - private static final Pattern PATTERN_SIMPLE = new PatternBuilder() - .expression("[FL],") // flag - .expression("([^,]*),") // alarm - .number("imei:(d+),") // imei - .number("(d+/?d*)?,") // satellites - .number("(d+.d+)?,") // altitude - .number("Battery=(d+)%,,?") // battery - .number("(d)?,") // charger - .number("(d+)?,") // mcc - .number("(d+)?,") // mnc - .number("(xxxx),") // lac - .number("(xxxx);") // cid - .any() // checksum - .compile(); - - private static final Pattern PATTERN_ALTERNATIVE = new PatternBuilder() - .number("(d+),") // mcc - .number("(d+),") // mnc - .number("(xxxx),") // lac - .number("(xxxx),") // cid - .number("(d+),") // gsm signal - .number("(d+),") // battery - .number("(d+),") // flags - .number("(d+),") // inputs - .number("(?:(d+),)?") // outputs - .number("(d.?d*),") // adc 1 - .groupBegin() - .number("(d.dd),") // adc 2 - .number("(d.dd),") // adc 3 - .groupEnd("?") - .expression("([^;]+);") // alarm - .any() // checksum - .compile(); - - private boolean parseLocation(String location, Position position) { - - Parser parser = new Parser(PATTERN_GPRMC, location); - if (!parser.matches()) { - return false; - } - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return true; - } - - private Position decodeOld(Channel channel, SocketAddress remoteAddress, String sentence) { - - // Detect type - boolean simple = sentence.charAt(3) == ',' || sentence.charAt(6) == ','; - - // Split message - String id; - String location; - String status; - if (simple) { - - int beginIndex = sentence.indexOf(',') + 1; - int endIndex = sentence.indexOf(',', beginIndex); - id = sentence.substring(beginIndex, endIndex); - - beginIndex = endIndex + 1; - endIndex = sentence.indexOf('*', beginIndex); - if (endIndex != -1) { - endIndex += 3; - } else { - endIndex = sentence.length(); - } - location = sentence.substring(beginIndex, endIndex); - - beginIndex = endIndex + 1; - if (beginIndex > sentence.length()) { - beginIndex = endIndex; - } - status = sentence.substring(beginIndex); - - } else { - - int beginIndex = 3; - int endIndex = beginIndex + 16; - id = sentence.substring(beginIndex, endIndex).trim(); - - beginIndex = endIndex + 2; - endIndex = sentence.indexOf('*', beginIndex) + 3; - location = sentence.substring(beginIndex, endIndex); - - beginIndex = endIndex + 1; - status = sentence.substring(beginIndex); - - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - if (!parseLocation(location, position)) { - return null; - } - - if (simple) { - - Parser parser = new Parser(PATTERN_SIMPLE, status); - if (parser.matches()) { - - position.set(Position.KEY_ALARM, decodeAlarm(parser.next())); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next(), id); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - String sat = parser.next(); - if (sat.contains("/")) { - position.set(Position.KEY_SATELLITES, Integer.parseInt(sat.split("/")[0])); - position.set(Position.KEY_SATELLITES_VISIBLE, Integer.parseInt(sat.split("/")[1])); - } else { - position.set(Position.KEY_SATELLITES, Integer.parseInt(sat)); - } - - position.setAltitude(parser.nextDouble(0)); - - position.set(Position.KEY_BATTERY_LEVEL, parser.nextDouble(0)); - - String charger = parser.next(); - if (charger != null) { - position.set(Position.KEY_CHARGE, Integer.parseInt(charger) == 1); - } - - if (parser.hasNext(4)) { - position.setNetwork(new Network(CellTower.from( - parser.nextInt(0), parser.nextInt(0), parser.nextHexInt(0), parser.nextHexInt(0)))); - } - - } else { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - } - - } else { - - Parser parser = new Parser(PATTERN_ALTERNATIVE, status); - if (parser.matches()) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setNetwork(new Network(CellTower.from(parser.nextInt(0), parser.nextInt(0), - parser.nextHexInt(0), parser.nextHexInt(0), parser.nextInt(0)))); - - position.set(Position.KEY_BATTERY_LEVEL, parser.nextDouble()); - - position.set(Position.KEY_FLAGS, parser.next()); - position.set(Position.KEY_INPUT, parser.next()); - position.set(Position.KEY_OUTPUT, parser.next()); - position.set(Position.PREFIX_ADC + 1, parser.next()); - position.set(Position.PREFIX_ADC + 2, parser.next()); - position.set(Position.PREFIX_ADC + 3, parser.next()); - position.set(Position.KEY_ALARM, decodeAlarm(parser.next())); - - } - } - - return position; - } - - private static final Pattern PATTERN_NEW = new PatternBuilder() - .number("dddd").optional() - .text("$MGV") - .number("ddd,") - .number("(d+),") // imei - .expression("[^,]*,") // name - .expression("([RS]),") - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(dd)(dd)(dd),") // time (hhmmss) - .expression("([AV]),") // validity - .number("(d+)(dd.d+),([NS]),") // latitude - .number("(d+)(dd.d+),([EW]),") // longitude - .number("dd,") - .number("(dd),") // satellites - .number("dd,") - .number("(d+.d+),") // hdop - .number("(d+.d+)?,") // speed - .number("(d+.d+)?,") // course - .number("(-?d+.d+),") // altitude - .number("(d+.d+)?,") // odometer - .number("(d+),") // mcc - .number("(d+),") // mnc - .number("(xxxx),") // lac - .number("(xxxx),") // cid - .number("(d+)?,") // gsm - .expression("([01]+)?,") // input - .expression("([01]+)?,") // output - .number("(d+)?,") // adc1 - .number("(d+)?,") // adc2 - .number("(d+)?,") // adc3 - .groupBegin() - .number("(-?d+.?d*)") // temperature 1 - .or().text(" ") - .groupEnd("?").text(",") - .groupBegin() - .number("(-?d+.?d*)") // temperature 2 - .or().text(" ") - .groupEnd("?").text(",") - .number("(d+)?,") // rfid - .expression("[^,]*,") - .number("(d+)?,") // battery - .expression("([^,]*);") // alert - .any() - .compile(); - - private Position decodeNew(Channel channel, SocketAddress remoteAddress, String sentence) { - - Parser parser = new Parser(PATTERN_NEW, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - if (parser.next().equals("S")) { - position.set(Position.KEY_ARCHIVE, true); - } - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - position.set(Position.KEY_HDOP, parser.nextDouble(0)); - - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - if (parser.hasNext()) { - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - } - - position.setNetwork(new Network(CellTower.from( - parser.nextInt(0), parser.nextInt(0), parser.nextHexInt(0), parser.nextHexInt(0), parser.nextInt(0)))); - - position.set(Position.KEY_INPUT, parser.nextBinInt(0)); - position.set(Position.KEY_OUTPUT, parser.nextBinInt(0)); - - for (int i = 1; i <= 3; i++) { - position.set(Position.PREFIX_ADC + i, parser.nextInt(0)); - } - - for (int i = 1; i <= 2; i++) { - String adc = parser.next(); - if (adc != null) { - position.set(Position.PREFIX_TEMP + i, Double.parseDouble(adc)); - } - } - - position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next()); - - String battery = parser.next(); - if (battery != null) { - position.set(Position.KEY_BATTERY, Integer.parseInt(battery)); - } - - position.set(Position.KEY_ALARM, decodeAlarm(parser.next())); - - return position; - } - - private String decodeAlarm(String value) { - switch (value) { - case "SOS": - case "Help": - return Position.ALARM_SOS; - case "Over Speed": - case "OverSpeed": - return Position.ALARM_OVERSPEED; - case "LowSpeed": - return Position.ALARM_LOW_SPEED; - case "Low Battery": - case "LowBattery": - return Position.ALARM_LOW_BATTERY; - case "VIB": - return Position.ALARM_VIBRATION; - case "Move in": - case "Geo in": - case "Geo1 in": - case "Geo2 in": - return Position.ALARM_GEOFENCE_ENTER; - case "Move out": - case "Geo out": - case "Geo1 out": - case "Geo2 out": - return Position.ALARM_GEOFENCE_EXIT; - default: - return null; - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.contains("$MG")) { - return decodeNew(channel, remoteAddress, sentence); - } else { - return decodeOld(channel, remoteAddress, sentence); - } - } - -} diff --git a/src/org/traccar/protocol/MeiligaoFrameDecoder.java b/src/org/traccar/protocol/MeiligaoFrameDecoder.java deleted file mode 100644 index 9340b6198..000000000 --- a/src/org/traccar/protocol/MeiligaoFrameDecoder.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class MeiligaoFrameDecoder extends FrameDecoder { - - private static final int MESSAGE_HEADER = 4; - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - // Strip not '$' (0x24) bytes from the beginning - while (buf.readable() && buf.getUnsignedByte(buf.readerIndex()) != 0x24) { - buf.readByte(); - } - - // Check length and return buffer - if (buf.readableBytes() >= MESSAGE_HEADER) { - int length = buf.getUnsignedShort(buf.readerIndex() + 2); - if (buf.readableBytes() >= length) { - return buf.readBytes(length); - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/MeiligaoProtocol.java b/src/org/traccar/protocol/MeiligaoProtocol.java deleted file mode 100644 index dbdd2619a..000000000 --- a/src/org/traccar/protocol/MeiligaoProtocol.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class MeiligaoProtocol extends BaseProtocol { - - public MeiligaoProtocol() { - super("meiligao"); - setSupportedDataCommands( - Command.TYPE_POSITION_SINGLE, - Command.TYPE_POSITION_PERIODIC, - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME, - Command.TYPE_ALARM_GEOFENCE, - Command.TYPE_SET_TIMEZONE, - Command.TYPE_REBOOT_DEVICE); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new MeiligaoFrameDecoder()); - pipeline.addLast("objectEncoder", new MeiligaoProtocolEncoder()); - pipeline.addLast("objectDecoder", new MeiligaoProtocolDecoder(MeiligaoProtocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectEncoder", new MeiligaoProtocolEncoder()); - pipeline.addLast("objectDecoder", new MeiligaoProtocolDecoder(MeiligaoProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/MeiligaoProtocolDecoder.java b/src/org/traccar/protocol/MeiligaoProtocolDecoder.java deleted file mode 100644 index b0793037f..000000000 --- a/src/org/traccar/protocol/MeiligaoProtocolDecoder.java +++ /dev/null @@ -1,448 +0,0 @@ -/* - * Copyright 2012 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.Checksum; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.LinkedList; -import java.util.List; -import java.util.regex.Pattern; - -public class MeiligaoProtocolDecoder extends BaseProtocolDecoder { - - public MeiligaoProtocolDecoder(MeiligaoProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("(dd)(dd)(dd).?d*,") // time (hhmmss) - .expression("([AV]),") // validity - .number("(d+)(dd.d+),") // latitude - .expression("([NS]),") - .number("(d+)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*)?,") // speed - .number("(d+.?d*)?,") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .expression("[^\\|]*") - .groupBegin() - .number("|(d+.d+)?") // hdop - .number("|(-?d+.?d*)?") // altitude - .number("|(xxxx)?") // state - .groupBegin() - .number("|(xxxx),(xxxx)") // adc - .number(",(xxxx)").optional() - .number(",(xxxx)").optional() - .number(",(xxxx)").optional() - .number(",(xxxx)").optional() - .number(",(xxxx)").optional() - .number(",(xxxx)").optional() - .groupBegin() - .number("|x{16,20}") // cell - .number("|(xx)") // rssi - .number("|(x{8})") // odometer - .groupBegin() - .number("|(xx)") // satellites - .groupEnd("?") - .or() - .number("|(x{9})") // odometer - .groupBegin() - .number("|(x{5,})") // rfid - .groupEnd("?") - .groupEnd("?") - .groupEnd("?") - .groupEnd("?") - .any() - .compile(); - - private static final Pattern PATTERN_RFID = new PatternBuilder() - .number("|(dd)(dd)(dd),") // time (hhmmss) - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(d+)(dd.d+),") // latitude - .expression("([NS]),") - .number("(d+)(dd.d+),") // longitude - .expression("([EW])") - .compile(); - - private static final Pattern PATTERN_OBD = new PatternBuilder() - .number("(d+.d+),") // battery - .number("(d+),") // rpm - .number("(d+),") // speed - .number("(d+.d+),") // throttle - .number("(d+.d+),") // engine load - .number("(-?d+),") // coolant temp - .number("(d+.d+),") // instantaneous fuel - .number("(d+.d+),") // average fuel - .number("(d+.d+),") // driving range - .number("(d+.?d*),") // odometer - .number("(d+.d+),") // single fuel consumption - .number("(d+.d+),") // total fuel consumption - .number("(d+),") // error code count - .number("(d+),") // hard acceleration count - .number("(d+)") // hard brake count - .compile(); - - private static final Pattern PATTERN_OBDA = new PatternBuilder() - .number("(d+),") // total ignition - .number("(d+.d+),") // total driving time - .number("(d+.d+),") // total idling time - .number("(d+),") // average hot start time - .number("(d+),") // average speed - .number("(d+),") // history highest speed - .number("(d+),") // history highest rpm - .number("(d+),") // total hard acceleration - .number("(d+)") // total hard brake - .compile(); - - public static final int MSG_HEARTBEAT = 0x0001; - public static final int MSG_SERVER = 0x0002; - public static final int MSG_LOGIN = 0x5000; - public static final int MSG_LOGIN_RESPONSE = 0x4000; - public static final int MSG_POSITION = 0x9955; - public static final int MSG_POSITION_LOGGED = 0x9016; - public static final int MSG_ALARM = 0x9999; - public static final int MSG_RFID = 0x9966; - public static final int MSG_RETRANSMISSION = 0x6688; - - public static final int MSG_OBD_RT = 0x9901; - public static final int MSG_OBD_RTA = 0x9902; - - private DeviceSession identify(ChannelBuffer buf, Channel channel, SocketAddress remoteAddress) { - StringBuilder builder = new StringBuilder(); - - for (int i = 0; i < 7; i++) { - int b = buf.readUnsignedByte(); - - // First digit - int d1 = (b & 0xf0) >> 4; - if (d1 == 0xf) { - break; - } - builder.append(d1); - - // Second digit - int d2 = b & 0x0f; - if (d2 == 0xf) { - break; - } - builder.append(d2); - } - - String id = builder.toString(); - - if (id.length() == 14) { - return getDeviceSession(channel, remoteAddress, id, id + Checksum.luhn(Long.parseLong(id))); - } else { - return getDeviceSession(channel, remoteAddress, id); - } - } - - private static void sendResponse( - Channel channel, SocketAddress remoteAddress, ChannelBuffer id, int type, ChannelBuffer msg) { - - if (channel != null) { - ChannelBuffer buf = ChannelBuffers.buffer( - 2 + 2 + id.readableBytes() + 2 + msg.readableBytes() + 2 + 2); - - buf.writeByte('@'); - buf.writeByte('@'); - buf.writeShort(buf.capacity()); - buf.writeBytes(id); - buf.writeShort(type); - buf.writeBytes(msg); - buf.writeShort(Checksum.crc16(Checksum.CRC16_CCITT_FALSE, buf.toByteBuffer())); - buf.writeByte('\r'); - buf.writeByte('\n'); - - channel.write(buf, remoteAddress); - } - } - - private String getServer(Channel channel) { - String server = Context.getConfig().getString(getProtocolName() + ".server"); - if (server == null) { - InetSocketAddress address = (InetSocketAddress) channel.getLocalAddress(); - server = address.getAddress().getHostAddress() + ":" + address.getPort(); - } - return server; - } - - private String decodeAlarm(short value) { - switch (value) { - case 0x01: - return Position.ALARM_SOS; - case 0x10: - return Position.ALARM_LOW_BATTERY; - case 0x11: - return Position.ALARM_OVERSPEED; - case 0x12: - return Position.ALARM_MOVEMENT; - case 0x13: - return Position.ALARM_GEOFENCE_ENTER; - case 0x14: - return Position.ALARM_ACCIDENT; - case 0x50: - return Position.ALARM_POWER_OFF; - case 0x53: - return Position.ALARM_GPS_ANTENNA_CUT; - case 0x72: - return Position.ALARM_BRAKING; - case 0x73: - return Position.ALARM_ACCELERATION; - default: - return null; - } - } - - private Position decodeRegular(Position position, String sentence) { - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - - if (parser.hasNext()) { - position.setSpeed(parser.nextDouble(0)); - } - - if (parser.hasNext()) { - position.setCourse(parser.nextDouble(0)); - } - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.set(Position.KEY_HDOP, parser.nextDouble()); - - if (parser.hasNext()) { - position.setAltitude(parser.nextDouble(0)); - } - - position.set(Position.KEY_STATUS, parser.next()); - - for (int i = 1; i <= 8; i++) { - position.set(Position.PREFIX_ADC + i, parser.nextHexInt()); - } - - position.set(Position.KEY_RSSI, parser.nextHexInt()); - position.set(Position.KEY_ODOMETER, parser.nextHexLong()); - position.set(Position.KEY_SATELLITES, parser.nextHexInt()); - position.set(Position.KEY_ODOMETER, parser.nextHexLong()); - position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next()); - - return position; - } - - private Position decodeRfid(Position position, String sentence) { - Parser parser = new Parser(PATTERN_RFID, sentence); - if (!parser.matches()) { - return null; - } - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY)); - - position.setValid(true); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - - return position; - } - - private Position decodeObd(Position position, String sentence) { - Parser parser = new Parser(PATTERN_OBD, sentence); - if (!parser.matches()) { - return null; - } - - getLastLocation(position, null); - - position.set(Position.KEY_BATTERY, parser.nextDouble()); - position.set(Position.KEY_RPM, parser.nextInt()); - position.set(Position.KEY_OBD_SPEED, parser.nextInt()); - position.set(Position.KEY_THROTTLE, parser.nextDouble()); - position.set(Position.KEY_ENGINE_LOAD, parser.nextDouble()); - position.set(Position.KEY_COOLANT_TEMP, parser.nextInt()); - position.set(Position.KEY_FUEL_CONSUMPTION, parser.nextDouble()); - position.set("averageFuelConsumption", parser.nextDouble()); - position.set("drivingRange", parser.nextDouble()); - position.set(Position.KEY_ODOMETER, parser.nextDouble()); - position.set("singleFuelConsumption", parser.nextDouble()); - position.set("totalFuelConsumption", parser.nextDouble()); - position.set(Position.KEY_DTCS, parser.nextInt()); - position.set("hardAccelerationCount", parser.nextInt()); - position.set("hardBrakingCount", parser.nextInt()); - - return position; - } - - private Position decodeObdA(Position position, String sentence) { - Parser parser = new Parser(PATTERN_OBDA, sentence); - if (!parser.matches()) { - return null; - } - - getLastLocation(position, null); - - position.set("totalIgnitionNo", parser.nextInt(0)); - position.set("totalDrivingTime", parser.nextDouble(0)); - position.set("totalIdlingTime", parser.nextDouble(0)); - position.set("averageHotStartTime", parser.nextInt(0)); - position.set("averageSpeed", parser.nextInt(0)); - position.set("historyHighestSpeed", parser.nextInt(0)); - position.set("historyHighestRpm", parser.nextInt(0)); - position.set("totalHarshAccerleration", parser.nextInt(0)); - position.set("totalHarshBrake", parser.nextInt(0)); - - return position; - } - - private List<Position> decodeRetransmission(ChannelBuffer buf, DeviceSession deviceSession) { - List<Position> positions = new LinkedList<>(); - - int count = buf.readUnsignedByte(); - for (int i = 0; i < count; i++) { - - buf.readUnsignedByte(); // alarm - - int endIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '\\'); - if (endIndex < 0) { - endIndex = buf.writerIndex() - 4; - } - - String sentence = buf.readBytes(endIndex - buf.readerIndex()).toString(StandardCharsets.US_ASCII); - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position = decodeRegular(position, sentence); - - if (position != null) { - positions.add(position); - } - - if (buf.readableBytes() > 4) { - buf.readUnsignedByte(); // delimiter - } - - } - - return positions; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - buf.skipBytes(2); // header - buf.readShort(); // length - ChannelBuffer id = buf.readBytes(7); - int command = buf.readUnsignedShort(); - ChannelBuffer response; - - if (channel != null) { - if (command == MSG_LOGIN) { - response = ChannelBuffers.wrappedBuffer(new byte[]{0x01}); - sendResponse(channel, remoteAddress, id, MSG_LOGIN_RESPONSE, response); - return null; - } else if (command == MSG_HEARTBEAT) { - response = ChannelBuffers.wrappedBuffer(new byte[]{0x01}); - sendResponse(channel, remoteAddress, id, MSG_HEARTBEAT, response); - return null; - } else if (command == MSG_SERVER) { - response = ChannelBuffers.copiedBuffer(getServer(channel), StandardCharsets.US_ASCII); - sendResponse(channel, remoteAddress, id, MSG_SERVER, response); - return null; - } - } - - DeviceSession deviceSession = identify(id, channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - if (command == MSG_RETRANSMISSION) { - - return decodeRetransmission(buf, deviceSession); - - } else { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - if (command == MSG_ALARM) { - short alarmCode = buf.readUnsignedByte(); - position.set(Position.KEY_ALARM, decodeAlarm(alarmCode)); - if (alarmCode >= 0x02 && alarmCode <= 0x05) { - position.set(Position.PREFIX_IN + alarmCode, 1); - } else if (alarmCode >= 0x32 && alarmCode <= 0x35) { - position.set(Position.PREFIX_IN + (alarmCode - 0x30), 0); - } - } else if (command == MSG_POSITION_LOGGED) { - buf.skipBytes(6); - } - - position.setDeviceId(deviceSession.getDeviceId()); - - if (command == MSG_RFID) { - for (int i = 0; i < 15; i++) { - long rfid = buf.readUnsignedInt(); - if (rfid != 0) { - String card = String.format("%010d", rfid); - position.set("card" + (i + 1), card); - position.set(Position.KEY_DRIVER_UNIQUE_ID, card); - } - } - } - - String sentence = buf.toString(buf.readerIndex(), buf.readableBytes() - 4, StandardCharsets.US_ASCII); - - if (command == MSG_POSITION || command == MSG_POSITION_LOGGED || command == MSG_ALARM) { - return decodeRegular(position, sentence); - } else if (command == MSG_RFID) { - return decodeRfid(position, sentence); - } else if (command == MSG_OBD_RT) { - return decodeObd(position, sentence); - } else if (command == MSG_OBD_RTA) { - return decodeObdA(position, sentence); - } - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/MeiligaoProtocolEncoder.java b/src/org/traccar/protocol/MeiligaoProtocolEncoder.java deleted file mode 100644 index 2e0a1e84c..000000000 --- a/src/org/traccar/protocol/MeiligaoProtocolEncoder.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2015 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Checksum; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import javax.xml.bind.DatatypeConverter; -import java.nio.charset.StandardCharsets; -import java.util.TimeZone; - -public class MeiligaoProtocolEncoder extends BaseProtocolEncoder { - - public static final int MSG_TRACK_ON_DEMAND = 0x4101; - public static final int MSG_TRACK_BY_INTERVAL = 0x4102; - public static final int MSG_MOVEMENT_ALARM = 0x4106; - public static final int MSG_OUTPUT_CONTROL = 0x4115; - public static final int MSG_TIME_ZONE = 0x4132; - public static final int MSG_REBOOT_GPS = 0x4902; - - private ChannelBuffer encodeContent(long deviceId, int type, ChannelBuffer content) { - - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); - - buf.writeByte('@'); - buf.writeByte('@'); - - buf.writeShort(2 + 2 + 7 + 2 + content.readableBytes() + 2 + 2); // message length - - buf.writeBytes(DatatypeConverter.parseHexBinary((getUniqueId(deviceId) + "FFFFFFFFFFFFFF").substring(0, 14))); - - buf.writeShort(type); - - buf.writeBytes(content); - - buf.writeShort(Checksum.crc16(Checksum.CRC16_CCITT_FALSE, buf.toByteBuffer())); - - buf.writeByte('\r'); - buf.writeByte('\n'); - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - - ChannelBuffer content = ChannelBuffers.dynamicBuffer(); - - switch (command.getType()) { - case Command.TYPE_POSITION_SINGLE: - return encodeContent(command.getDeviceId(), MSG_TRACK_ON_DEMAND, content); - case Command.TYPE_POSITION_PERIODIC: - content.writeShort(command.getInteger(Command.KEY_FREQUENCY) / 10); - return encodeContent(command.getDeviceId(), MSG_TRACK_BY_INTERVAL, content); - case Command.TYPE_ENGINE_STOP: - content.writeByte(0x01); - return encodeContent(command.getDeviceId(), MSG_OUTPUT_CONTROL, content); - case Command.TYPE_ENGINE_RESUME: - content.writeByte(0x00); - return encodeContent(command.getDeviceId(), MSG_OUTPUT_CONTROL, content); - case Command.TYPE_ALARM_GEOFENCE: - content.writeShort(command.getInteger(Command.KEY_RADIUS)); - return encodeContent(command.getDeviceId(), MSG_MOVEMENT_ALARM, content); - case Command.TYPE_SET_TIMEZONE: - int offset = TimeZone.getTimeZone(command.getString(Command.KEY_TIMEZONE)).getRawOffset() / 60000; - content.writeBytes(String.valueOf(offset).getBytes(StandardCharsets.US_ASCII)); - return encodeContent(command.getDeviceId(), MSG_TIME_ZONE, content); - case Command.TYPE_REBOOT_DEVICE: - return encodeContent(command.getDeviceId(), MSG_REBOOT_GPS, content); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/MeitrackFrameDecoder.java b/src/org/traccar/protocol/MeitrackFrameDecoder.java deleted file mode 100644 index 1eb0dae0f..000000000 --- a/src/org/traccar/protocol/MeitrackFrameDecoder.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2014 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -import java.nio.charset.StandardCharsets; - -public class MeitrackFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 10) { - return null; - } - - int index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) ','); - if (index != -1) { - int length = index - buf.readerIndex() + Integer.parseInt( - buf.toString(buf.readerIndex() + 3, index - buf.readerIndex() - 3, StandardCharsets.US_ASCII)); - if (buf.readableBytes() >= length) { - return buf.readBytes(length); - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/MeitrackProtocol.java b/src/org/traccar/protocol/MeitrackProtocol.java deleted file mode 100644 index e89825da5..000000000 --- a/src/org/traccar/protocol/MeitrackProtocol.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2015 - 2016 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.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.string.StringEncoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.nio.ByteOrder; -import java.util.List; - -public class MeitrackProtocol extends BaseProtocol { - - public MeitrackProtocol() { - super("meitrack"); - setSupportedDataCommands( - Command.TYPE_POSITION_SINGLE, - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME, - Command.TYPE_ALARM_ARM, - Command.TYPE_ALARM_DISARM, - Command.TYPE_REQUEST_PHOTO, - Command.TYPE_SEND_SMS); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new MeitrackFrameDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new MeitrackProtocolEncoder()); - pipeline.addLast("objectDecoder", new MeitrackProtocolDecoder(MeitrackProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - server = new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new MeitrackProtocolEncoder()); - pipeline.addLast("objectDecoder", new MeitrackProtocolDecoder(MeitrackProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/MeitrackProtocolDecoder.java b/src/org/traccar/protocol/MeitrackProtocolDecoder.java deleted file mode 100644 index 5b67aebe3..000000000 --- a/src/org/traccar/protocol/MeitrackProtocolDecoder.java +++ /dev/null @@ -1,469 +0,0 @@ -/* - * Copyright 2012 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.Checksum; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.regex.Pattern; - -public class MeitrackProtocolDecoder extends BaseProtocolDecoder { - - private ChannelBuffer photo; - - public MeitrackProtocolDecoder(MeitrackProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$$").expression(".") // flag - .number("d+,") // length - .number("(d+),") // imei - .number("xxx,") // command - .number("d+,").optional() - .number("(d+),") // event - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("([AV]),") // validity - .number("(d+),") // satellites - .number("(d+),") // rssi - .number("(d+.?d*),") // speed - .number("(d+),") // course - .number("(d+.?d*),") // hdop - .number("(-?d+),") // altitude - .number("(d+),") // odometer - .number("(d+),") // runtime - .number("(d+)|") // mcc - .number("(d+)|") // mnc - .number("(x+)|") // lac - .number("(x+),") // cid - .number("(x+),") // state - .number("(x+)?|") // adc1 - .number("(x+)?|") // adc2 - .number("(x+)?|") // adc3 - .number("(x+)|") // battery - .number("(x+)?,") // power - .groupBegin() - .expression("([^,]+)?,") // event specific - .expression("[^,]*,") // reserved - .number("(d+)?,") // protocol - .number("(x{4})?") // fuel - .number("(?:,(x{6}(?:|x{6})*))?") // temperature - .groupEnd("?") - .any() - .text("*") - .number("xx") - .text("\r\n").optional() - .compile(); - - private String decodeAlarm(int event) { - switch (event) { - case 1: - return Position.ALARM_SOS; - case 17: - return Position.ALARM_LOW_BATTERY; - case 18: - return Position.ALARM_LOW_POWER; - case 19: - return Position.ALARM_OVERSPEED; - case 20: - return Position.ALARM_GEOFENCE_ENTER; - case 21: - return Position.ALARM_GEOFENCE_EXIT; - case 22: - return Position.ALARM_POWER_RESTORED; - case 23: - return Position.ALARM_POWER_CUT; - case 36: - return Position.ALARM_TOW; - default: - return null; - } - } - - private Position decodeRegular(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - - Parser parser = new Parser(PATTERN, buf.toString(StandardCharsets.US_ASCII)); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - int event = parser.nextInt(0); - position.set(Position.KEY_EVENT, event); - position.set(Position.KEY_ALARM, decodeAlarm(event)); - - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - - position.setTime(parser.nextDateTime()); - - position.setValid(parser.next().equals("A")); - - position.set(Position.KEY_SATELLITES, parser.nextInt()); - int rssi = parser.nextInt(0); - - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_HDOP, parser.nextDouble()); - - position.setAltitude(parser.nextDouble(0)); - - position.set(Position.KEY_ODOMETER, parser.nextInt(0)); - position.set("runtime", parser.next()); - - position.setNetwork(new Network(CellTower.from( - parser.nextInt(0), parser.nextInt(0), parser.nextHexInt(0), parser.nextHexInt(0), rssi))); - - position.set(Position.KEY_STATUS, parser.next()); - - for (int i = 1; i <= 3; i++) { - if (parser.hasNext()) { - position.set(Position.PREFIX_ADC + i, parser.nextHexInt(0)); - } - } - - String deviceModel = Context.getIdentityManager().getById(deviceSession.getDeviceId()).getModel(); - if (deviceModel == null) { - deviceModel = ""; - } - switch (deviceModel.toUpperCase()) { - case "MVT340": - case "MVT380": - position.set(Position.KEY_BATTERY, parser.nextHexInt(0) * 3.0 * 2.0 / 1024.0); - position.set(Position.KEY_POWER, parser.nextHexInt(0) * 3.0 * 16.0 / 1024.0); - break; - case "MT90": - position.set(Position.KEY_BATTERY, parser.nextHexInt(0) * 3.3 * 2.0 / 4096.0); - position.set(Position.KEY_POWER, parser.nextHexInt(0)); - break; - case "T1": - case "T3": - case "MVT100": - case "MVT600": - case "MVT800": - case "TC68": - case "TC68S": - position.set(Position.KEY_BATTERY, parser.nextHexInt(0) * 3.3 * 2.0 / 4096.0); - position.set(Position.KEY_POWER, parser.nextHexInt(0) * 3.3 * 16.0 / 4096.0); - break; - case "T311": - case "T322X": - case "T333": - case "T355": - position.set(Position.KEY_BATTERY, parser.nextHexInt(0) / 100.0); - position.set(Position.KEY_POWER, parser.nextHexInt(0) / 100.0); - break; - default: - position.set(Position.KEY_BATTERY, parser.nextHexInt(0)); - position.set(Position.KEY_POWER, parser.nextHexInt(0)); - break; - } - - String eventData = parser.next(); - if (eventData != null && !eventData.isEmpty()) { - switch (event) { - case 37: - position.set(Position.KEY_DRIVER_UNIQUE_ID, eventData); - break; - default: - position.set("eventData", eventData); - break; - } - } - - int protocol = parser.nextInt(0); - - if (parser.hasNext()) { - String fuel = parser.next(); - position.set(Position.KEY_FUEL_LEVEL, - Integer.parseInt(fuel.substring(0, 2), 16) + Integer.parseInt(fuel.substring(2), 16) * 0.01); - } - - if (parser.hasNext()) { - for (String temp : parser.next().split("\\|")) { - int index = Integer.parseInt(temp.substring(0, 2), 16); - if (protocol >= 3) { - double value = (short) Integer.parseInt(temp.substring(2), 16); - position.set(Position.PREFIX_TEMP + index, value * 0.01); - } else { - double value = Byte.parseByte(temp.substring(2, 4), 16); - value += (value < 0 ? -0.01 : 0.01) * Integer.parseInt(temp.substring(4), 16); - position.set(Position.PREFIX_TEMP + index, value); - } - } - } - - return position; - } - - private List<Position> decodeBinaryC(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - List<Position> positions = new LinkedList<>(); - - String flag = buf.toString(2, 1, StandardCharsets.US_ASCII); - int index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) ','); - - String imei = buf.toString(index + 1, 15, StandardCharsets.US_ASCII); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - - buf.skipBytes(index + 1 + 15 + 1 + 3 + 1 + 2 + 2 + 4); - - while (buf.readableBytes() >= 0x34) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_EVENT, buf.readUnsignedByte()); - - position.setLatitude(buf.readInt() * 0.000001); - position.setLongitude(buf.readInt() * 0.000001); - - position.setTime(new Date((946684800 + buf.readUnsignedInt()) * 1000)); // 946684800 = 2000-01-01 - - position.setValid(buf.readUnsignedByte() == 1); - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - int rssi = buf.readUnsignedByte(); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort())); - position.setCourse(buf.readUnsignedShort()); - - position.set(Position.KEY_HDOP, buf.readUnsignedShort() * 0.1); - - position.setAltitude(buf.readUnsignedShort()); - - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - position.set("runtime", buf.readUnsignedInt()); - - position.setNetwork(new Network(CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedShort(), - buf.readUnsignedShort(), buf.readUnsignedShort(), - rssi))); - - position.set(Position.KEY_STATUS, buf.readUnsignedShort()); - - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort()); - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.01); - position.set(Position.KEY_POWER, buf.readUnsignedShort()); - - buf.readUnsignedInt(); // geo-fence - - positions.add(position); - } - - if (channel != null) { - StringBuilder command = new StringBuilder("@@"); - command.append(flag).append(27 + positions.size() / 10).append(","); - command.append(imei).append(",CCC,").append(positions.size()).append("*"); - int checksum = 0; - for (int i = 0; i < command.length(); i += 1) { - checksum += command.charAt(i); - } - command.append(String.format("%02x", checksum & 0xff).toUpperCase()); - command.append("\r\n"); - channel.write(command.toString()); // delete processed data - } - - return positions; - } - - private List<Position> decodeBinaryE(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - List<Position> positions = new LinkedList<>(); - - buf.readerIndex(buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) ',') + 1); - String imei = buf.readBytes(15).toString(StandardCharsets.US_ASCII); - buf.skipBytes(1 + 3 + 1); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - - buf.readUnsignedInt(); // remaining cache - int count = buf.readUnsignedShort(); - - for (int i = 0; i < count; i++) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - buf.readUnsignedShort(); // length - buf.readUnsignedShort(); // index - - int paramCount = buf.readUnsignedByte(); - for (int j = 0; j < paramCount; j++) { - int id = buf.readUnsignedByte(); - switch (id) { - case 0x01: - position.set(Position.KEY_EVENT, buf.readUnsignedByte()); - break; - case 0x05: - position.setValid(buf.readUnsignedByte() > 0); - break; - case 0x06: - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - break; - default: - buf.readUnsignedByte(); - break; - } - } - - paramCount = buf.readUnsignedByte(); - for (int j = 0; j < paramCount; j++) { - int id = buf.readUnsignedByte(); - switch (id) { - case 0x08: - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort())); - break; - case 0x09: - position.setCourse(buf.readUnsignedShort() * 0.1); - break; - case 0x0B: - position.setAltitude(buf.readShort()); - break; - default: - buf.readUnsignedShort(); - break; - } - } - - paramCount = buf.readUnsignedByte(); - for (int j = 0; j < paramCount; j++) { - int id = buf.readUnsignedByte(); - switch (id) { - case 0x02: - position.setLatitude(buf.readInt() * 0.000001); - break; - case 0x03: - position.setLongitude(buf.readInt() * 0.000001); - break; - case 0x04: - position.setTime(new Date((946684800 + buf.readUnsignedInt()) * 1000)); // 2000-01-01 - break; - default: - buf.readUnsignedInt(); - break; - } - } - - paramCount = buf.readUnsignedByte(); - for (int j = 0; j < paramCount; j++) { - buf.readUnsignedByte(); // id - buf.skipBytes(buf.readUnsignedByte()); // value - } - - positions.add(position); - } - - return positions; - } - - private void requestPhotoPacket(Channel channel, String imei, int index) { - if (channel != null) { - String content = "D00,camera_picture.jpg," + index; - int length = 1 + imei.length() + 1 + content.length() + 5; - String response = String.format("@@O%02d,%s,%s*", length, imei, content); - response += Checksum.sum(response) + "\r\n"; - channel.write(response); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - int index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) ','); - String imei = buf.toString(index + 1, 15, StandardCharsets.US_ASCII); - index = buf.indexOf(index + 1, buf.writerIndex(), (byte) ','); - String type = buf.toString(index + 1, 3, StandardCharsets.US_ASCII); - - switch (type) { - case "D00": - index = buf.indexOf(index + 1 + type.length() + 1, buf.writerIndex(), (byte) ',') + 1; - int endIndex = buf.indexOf(index, buf.writerIndex(), (byte) ','); - int total = Integer.parseInt(buf.toString(index, endIndex - index, StandardCharsets.US_ASCII)); - index = endIndex + 1; - endIndex = buf.indexOf(index, buf.writerIndex(), (byte) ','); - int current = Integer.parseInt(buf.toString(index, endIndex - index, StandardCharsets.US_ASCII)); - - buf.readerIndex(endIndex + 1); - photo.writeBytes(buf.readBytes(buf.readableBytes() - 1 - 2 - 2)); - - if (current == total - 1) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(getDeviceSession(channel, remoteAddress, imei).getDeviceId()); - - getLastLocation(position, null); - - position.set(Position.KEY_IMAGE, Context.getMediaManager().writeFile(imei, photo, "jpg")); - photo = null; - - return position; - } else { - if ((current + 1) % 8 == 0) { - requestPhotoPacket(channel, imei, current + 1); - } - return null; - } - case "D03": - photo = ChannelBuffers.dynamicBuffer(); - requestPhotoPacket(channel, imei, 0); - return null; - case "CCC": - return decodeBinaryC(channel, remoteAddress, buf); - case "CCE": - return decodeBinaryE(channel, remoteAddress, buf); - default: - return decodeRegular(channel, remoteAddress, buf); - } - } - -} diff --git a/src/org/traccar/protocol/MeitrackProtocolEncoder.java b/src/org/traccar/protocol/MeitrackProtocolEncoder.java deleted file mode 100644 index b10a751c1..000000000 --- a/src/org/traccar/protocol/MeitrackProtocolEncoder.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2015 - 2016 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.traccar.StringProtocolEncoder; -import org.traccar.helper.Checksum; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import java.util.Map; - -public class MeitrackProtocolEncoder extends StringProtocolEncoder { - - private Object formatCommand(Command command, char dataId, String content) { - String uniqueId = getUniqueId(command.getDeviceId()); - int length = 1 + uniqueId.length() + 1 + content.length() + 5; - String result = String.format("@@%c%02d,%s,%s*", dataId, length, uniqueId, content); - result += Checksum.sum(result) + "\r\n"; - return result; - } - - @Override - protected Object encodeCommand(Command command) { - - Map<String, Object> attributes = command.getAttributes(); - - switch (command.getType()) { - case Command.TYPE_POSITION_SINGLE: - return formatCommand(command, 'Q', "A10"); - case Command.TYPE_ENGINE_STOP: - return formatCommand(command, 'M', "C01,0,12222"); - case Command.TYPE_ENGINE_RESUME: - return formatCommand(command, 'M', "C01,0,02222"); - case Command.TYPE_ALARM_ARM: - return formatCommand(command, 'M', "C01,0,22122"); - case Command.TYPE_ALARM_DISARM: - return formatCommand(command, 'M', "C01,0,22022"); - case Command.TYPE_REQUEST_PHOTO: - return formatCommand(command, 'D', "D03,1,camera_picture.jpg"); - case Command.TYPE_SEND_SMS: - return formatCommand(command, 'f', "C02,0," - + attributes.get(Command.KEY_PHONE) + "," + attributes.get(Command.KEY_MESSAGE)); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/MiniFinderProtocol.java b/src/org/traccar/protocol/MiniFinderProtocol.java deleted file mode 100644 index c36acb238..000000000 --- a/src/org/traccar/protocol/MiniFinderProtocol.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2015 - 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class MiniFinderProtocol extends BaseProtocol { - - public MiniFinderProtocol() { - super("minifinder"); - setSupportedDataCommands( - Command.TYPE_SET_TIMEZONE, - Command.TYPE_VOICE_MONITORING, - Command.TYPE_ALARM_SPEED, - Command.TYPE_ALARM_GEOFENCE, - Command.TYPE_ALARM_VIBRATION, - Command.TYPE_SET_AGPS, - Command.TYPE_ALARM_FALL, - Command.TYPE_MODE_POWER_SAVING, - Command.TYPE_MODE_DEEP_SLEEP, - Command.TYPE_SOS_NUMBER, - Command.TYPE_SET_INDICATOR); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, ';')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectEncoder", new MiniFinderProtocolEncoder()); - pipeline.addLast("objectDecoder", new MiniFinderProtocolDecoder(MiniFinderProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/MiniFinderProtocolDecoder.java b/src/org/traccar/protocol/MiniFinderProtocolDecoder.java deleted file mode 100644 index 05994b697..000000000 --- a/src/org/traccar/protocol/MiniFinderProtocolDecoder.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright 2014 - 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.helper.BitUtil; -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 MiniFinderProtocolDecoder extends BaseProtocolDecoder { - - public MiniFinderProtocolDecoder(MiniFinderProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN_FIX = new PatternBuilder() - .number("(d+)/(d+)/(d+),") // date (dd/mm/yy) - .number("(d+):(d+):(d+),") // time (hh:mm:ss) - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .compile(); - - private static final Pattern PATTERN_STATE = new PatternBuilder() - .number("(d+.?d*),") // speed (km/h) - .number("(d+.?d*),") // course - .number("(x+),") // flags - .number("(-?d+.d+),") // altitude (meters) - .number("(d+),") // battery (percentage) - .compile(); - - private static final Pattern PATTERN_A = new PatternBuilder() - .text("!A,") - .expression(PATTERN_FIX.pattern()) - .any() // unknown 3 fields - .compile(); - - private static final Pattern PATTERN_C = new PatternBuilder() - .text("!C,") - .expression(PATTERN_FIX.pattern()) - .expression(PATTERN_STATE.pattern()) - .any() // unknown 3 fields - .compile(); - - private static final Pattern PATTERN_BD = new PatternBuilder() - .expression("![BD],") // B - buffered, D - live - .expression(PATTERN_FIX.pattern()) - .expression(PATTERN_STATE.pattern()) - .number("(d+),") // satellites in use - .number("(d+),") // satellites in view - .number("(d+.?d*)") // hdop - .compile(); - - private void decodeFix(Position position, Parser parser) { - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - } - - private void decodeFlags(Position position, int flags) { - - position.setValid(BitUtil.to(flags, 2) > 0); - if (BitUtil.check(flags, 1)) { - position.set(Position.KEY_APPROXIMATE, true); - } - - if (BitUtil.check(flags, 2)) { - position.set(Position.KEY_ALARM, Position.ALARM_FAULT); - } - if (BitUtil.check(flags, 6)) { - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - } - if (BitUtil.check(flags, 7)) { - position.set(Position.KEY_ALARM, Position.ALARM_OVERSPEED); - } - if (BitUtil.check(flags, 8)) { - position.set(Position.KEY_ALARM, Position.ALARM_FALL_DOWN); - } - if (BitUtil.check(flags, 9) || BitUtil.check(flags, 10) || BitUtil.check(flags, 11)) { - position.set(Position.KEY_ALARM, Position.ALARM_GEOFENCE); - } - if (BitUtil.check(flags, 12)) { - position.set(Position.KEY_ALARM, Position.ALARM_LOW_BATTERY); - } - if (BitUtil.check(flags, 15) || BitUtil.check(flags, 14)) { - position.set(Position.KEY_ALARM, Position.ALARM_MOVEMENT); - } - - position.set(Position.KEY_RSSI, BitUtil.between(flags, 16, 21)); - position.set(Position.KEY_CHARGE, BitUtil.check(flags, 22)); - } - - private void decodeState(Position position, Parser parser) { - - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - - position.setCourse(parser.nextDouble(0)); - if (position.getCourse() > 360) { - position.setCourse(0); - } - - decodeFlags(position, parser.nextHexInt(0)); - - position.setAltitude(parser.nextDouble(0)); - - position.set(Position.KEY_BATTERY, parser.nextInt(0)); - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.startsWith("!1,")) { - int index = sentence.indexOf(',', 3); - if (index < 0) { - index = sentence.length(); - } - getDeviceSession(channel, remoteAddress, sentence.substring(3, index)); - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null || !sentence.matches("![A-D],.*")) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - String type = sentence.substring(1, 2); - position.set(Position.KEY_TYPE, type); - - if (type.equals("B") || type.equals("D")) { - - Parser parser = new Parser(PATTERN_BD, sentence); - if (!parser.matches()) { - return null; - } - - decodeFix(position, parser); - decodeState(position, parser); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - position.set(Position.KEY_SATELLITES_VISIBLE, parser.nextInt(0)); - position.set(Position.KEY_HDOP, parser.nextDouble(0)); - - return position; - - } else if (type.equals("C")) { - - Parser parser = new Parser(PATTERN_C, sentence); - if (!parser.matches()) { - return null; - } - - decodeFix(position, parser); - decodeState(position, parser); - - return position; - - } else if (type.equals("A")) { - - Parser parser = new Parser(PATTERN_A, sentence); - if (!parser.matches()) { - return null; - } - - decodeFix(position, parser); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/MiniFinderProtocolEncoder.java b/src/org/traccar/protocol/MiniFinderProtocolEncoder.java deleted file mode 100644 index 486f406a5..000000000 --- a/src/org/traccar/protocol/MiniFinderProtocolEncoder.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2016 - 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 java.util.TimeZone; - -import org.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class MiniFinderProtocolEncoder extends StringProtocolEncoder implements StringProtocolEncoder.ValueFormatter { - - @Override - public String formatValue(String key, Object value) { - - if (key.equals(Command.KEY_ENABLE)) { - return (Boolean) value ? "1" : "0"; - } else if (key.equals(Command.KEY_TIMEZONE)) { - return String.format("%+03d", TimeZone.getTimeZone((String) value).getRawOffset() / 3600000); - } else if (key.equals(Command.KEY_INDEX)) { - switch (((Number) value).intValue()) { - case 0: - return "A"; - case 1: - return "B"; - case 2: - return "C"; - default: - return null; - } - } - - return null; - } - - @Override - protected Object encodeCommand(Command command) { - - initDevicePassword(command, "123456"); - - switch (command.getType()) { - case Command.TYPE_SET_TIMEZONE: - return formatCommand(command, "{%s}L{%s}", this, Command.KEY_DEVICE_PASSWORD, Command.KEY_TIMEZONE); - case Command.TYPE_VOICE_MONITORING: - return formatCommand(command, "{%s}P{%s}", this, Command.KEY_DEVICE_PASSWORD, Command.KEY_ENABLE); - case Command.TYPE_ALARM_SPEED: - return formatCommand(command, "{%s}J1{%s}", Command.KEY_DEVICE_PASSWORD, Command.KEY_DATA); - case Command.TYPE_ALARM_GEOFENCE: - return formatCommand(command, "{%s}R1{%s}", Command.KEY_DEVICE_PASSWORD, Command.KEY_RADIUS); - case Command.TYPE_ALARM_VIBRATION: - return formatCommand(command, "{%s}W1,{%s}", Command.KEY_DEVICE_PASSWORD, Command.KEY_DATA); - case Command.TYPE_SET_AGPS: - return formatCommand(command, "{%s}AGPS{%s}", this, Command.KEY_DEVICE_PASSWORD, Command.KEY_ENABLE); - case Command.TYPE_ALARM_FALL: - return formatCommand(command, "{%s}F{%s}", this, Command.KEY_DEVICE_PASSWORD, Command.KEY_ENABLE); - case Command.TYPE_MODE_POWER_SAVING: - return formatCommand(command, "{%s}SP{%s}", this, Command.KEY_DEVICE_PASSWORD, Command.KEY_ENABLE); - case Command.TYPE_MODE_DEEP_SLEEP: - return formatCommand(command, "{%s}DS{%s}", this, Command.KEY_DEVICE_PASSWORD, Command.KEY_ENABLE); - case Command.TYPE_SOS_NUMBER: - return formatCommand(command, "{%s}{%s}1,{%s}", this, - Command.KEY_DEVICE_PASSWORD, Command.KEY_INDEX, Command.KEY_PHONE); - case Command.TYPE_SET_INDICATOR: - return formatCommand(command, "{%s}LED{%s}", Command.KEY_DEVICE_PASSWORD, Command.KEY_DATA); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - return null; - } - } - -} diff --git a/src/org/traccar/protocol/Mta6Protocol.java b/src/org/traccar/protocol/Mta6Protocol.java deleted file mode 100644 index 65a48808d..000000000 --- a/src/org/traccar/protocol/Mta6Protocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.http.HttpRequestDecoder; -import org.jboss.netty.handler.codec.http.HttpResponseEncoder; -import org.traccar.BaseProtocol; -import org.traccar.Context; -import org.traccar.TrackerServer; - -import java.util.List; - -public class Mta6Protocol extends BaseProtocol { - - public Mta6Protocol() { - super("mta6"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("httpEncoder", new HttpResponseEncoder()); - pipeline.addLast("httpDecoder", new HttpRequestDecoder()); - pipeline.addLast("objectDecoder", new Mta6ProtocolDecoder( - Mta6Protocol.this, !Context.getConfig().getBoolean(getName() + ".can"))); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Mta6ProtocolDecoder.java b/src/org/traccar/protocol/Mta6ProtocolDecoder.java deleted file mode 100644 index 0fda94eef..000000000 --- a/src/org/traccar/protocol/Mta6ProtocolDecoder.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.handler.codec.http.DefaultHttpResponse; -import org.jboss.netty.handler.codec.http.HttpRequest; -import org.jboss.netty.handler.codec.http.HttpResponse; -import org.jboss.netty.handler.codec.http.HttpResponseStatus; -import org.jboss.netty.handler.codec.http.HttpVersion; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.Protocol; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Log; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class Mta6ProtocolDecoder extends BaseProtocolDecoder { - - private final boolean simple; - - public Mta6ProtocolDecoder(Protocol protocol, boolean simple) { - super(protocol); - this.simple = simple; - } - - private void sendContinue(Channel channel) { - HttpResponse response = new DefaultHttpResponse( - HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE); - channel.write(response); - } - - private void sendResponse(Channel channel, short packetId, short packetCount) { - HttpResponse response = new DefaultHttpResponse( - HttpVersion.HTTP_1_1, HttpResponseStatus.OK); - - ChannelBuffer begin = ChannelBuffers.copiedBuffer("#ACK#", StandardCharsets.US_ASCII); - ChannelBuffer end = ChannelBuffers.directBuffer(3); - end.writeByte(packetId); - end.writeByte(packetCount); - end.writeByte(0); - - response.setContent(ChannelBuffers.wrappedBuffer(begin, end)); - channel.write(response); - } - - private static class FloatReader { - - private int previousFloat; - - public float readFloat(ChannelBuffer buf) { - switch (buf.getUnsignedByte(buf.readerIndex()) >> 6) { - case 0: - previousFloat = buf.readInt() << 2; - break; - case 1: - previousFloat = (previousFloat & 0xffffff00) + ((buf.readUnsignedByte() & 0x3f) << 2); - break; - case 2: - previousFloat = (previousFloat & 0xffff0000) + ((buf.readUnsignedShort() & 0x3fff) << 2); - break; - case 3: - previousFloat = (previousFloat & 0xff000000) + ((buf.readUnsignedMedium() & 0x3fffff) << 2); - break; - default: - Log.warning(new IllegalArgumentException()); - break; - } - return Float.intBitsToFloat(previousFloat); - } - - } - - private static class TimeReader extends FloatReader { - - private long weekNumber; - - public Date readTime(ChannelBuffer buf) { - long weekTime = (long) (readFloat(buf) * 1000); - if (weekNumber == 0) { - weekNumber = buf.readUnsignedShort(); - } - - DateBuilder dateBuilder = new DateBuilder().setDate(1980, 1, 6); - dateBuilder.addMillis(weekNumber * 7 * 24 * 60 * 60 * 1000 + weekTime); - - return dateBuilder.getDate(); - } - - } - - private List<Position> parseFormatA(DeviceSession deviceSession, ChannelBuffer buf) { - List<Position> positions = new LinkedList<>(); - - FloatReader latitudeReader = new FloatReader(); - FloatReader longitudeReader = new FloatReader(); - TimeReader timeReader = new TimeReader(); - - try { - while (buf.readable()) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - short flags = buf.readUnsignedByte(); - - short event = buf.readUnsignedByte(); - if (BitUtil.check(event, 7)) { - if (BitUtil.check(event, 6)) { - buf.skipBytes(8); - } else { - while (BitUtil.check(event, 7)) { - event = buf.readUnsignedByte(); - } - } - } - - position.setLatitude(latitudeReader.readFloat(buf) / Math.PI * 180); - position.setLongitude(longitudeReader.readFloat(buf) / Math.PI * 180); - position.setTime(timeReader.readTime(buf)); - - if (BitUtil.check(flags, 0)) { - buf.readUnsignedByte(); // status - } - - if (BitUtil.check(flags, 1)) { - position.setAltitude(buf.readUnsignedShort()); - } - - if (BitUtil.check(flags, 2)) { - position.setSpeed(buf.readUnsignedShort() & 0x03ff); - position.setCourse(buf.readUnsignedByte()); - } - - if (BitUtil.check(flags, 3)) { - position.set(Position.KEY_ODOMETER, buf.readUnsignedShort() * 1000); - } - - if (BitUtil.check(flags, 4)) { - position.set(Position.KEY_FUEL_CONSUMPTION + "Accumulator1", buf.readUnsignedInt()); - position.set(Position.KEY_FUEL_CONSUMPTION + "Accumulator2", buf.readUnsignedInt()); - position.set("hours1", buf.readUnsignedShort()); - position.set("hours2", buf.readUnsignedShort()); - } - - if (BitUtil.check(flags, 5)) { - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort() & 0x03ff); - position.set(Position.PREFIX_ADC + 2, buf.readUnsignedShort() & 0x03ff); - position.set(Position.PREFIX_ADC + 3, buf.readUnsignedShort() & 0x03ff); - position.set(Position.PREFIX_ADC + 4, buf.readUnsignedShort() & 0x03ff); - } - - if (BitUtil.check(flags, 6)) { - position.set(Position.PREFIX_TEMP + 1, buf.readByte()); - buf.getUnsignedByte(buf.readerIndex()); // control (>> 4) - position.set(Position.KEY_INPUT, buf.readUnsignedShort() & 0x0fff); - buf.readUnsignedShort(); // old sensor state (& 0x0fff) - } - - if (BitUtil.check(flags, 7)) { - position.set(Position.KEY_BATTERY, buf.getUnsignedByte(buf.readerIndex()) >> 2); - position.set(Position.KEY_POWER, buf.readUnsignedShort() & 0x03ff); - position.set(Position.KEY_DEVICE_TEMP, buf.readByte()); - - position.set(Position.KEY_RSSI, (buf.getUnsignedByte(buf.readerIndex()) >> 4) & 0x07); - - int satellites = buf.readUnsignedByte() & 0x0f; - position.setValid(satellites >= 3); - position.set(Position.KEY_SATELLITES, satellites); - } - positions.add(position); - } - } catch (IndexOutOfBoundsException error) { - Log.warning(error); - } - - return positions; - } - - private Position parseFormatA1(DeviceSession deviceSession, ChannelBuffer buf) { - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - short flags = buf.readUnsignedByte(); - - // Skip events - short event = buf.readUnsignedByte(); - if (BitUtil.check(event, 7)) { - if (BitUtil.check(event, 6)) { - buf.skipBytes(8); - } else { - while (BitUtil.check(event, 7)) { - event = buf.readUnsignedByte(); - } - } - } - - position.setLatitude(new FloatReader().readFloat(buf) / Math.PI * 180); - position.setLongitude(new FloatReader().readFloat(buf) / Math.PI * 180); - position.setTime(new TimeReader().readTime(buf)); - - position.set(Position.KEY_STATUS, buf.readUnsignedByte()); - - if (BitUtil.check(flags, 0)) { - position.setAltitude(buf.readUnsignedShort()); - position.setSpeed(buf.readUnsignedByte()); - position.setCourse(buf.readByte()); - position.set(Position.KEY_ODOMETER, new FloatReader().readFloat(buf)); - } - - if (BitUtil.check(flags, 1)) { - position.set(Position.KEY_FUEL_CONSUMPTION, new FloatReader().readFloat(buf)); - position.set(Position.KEY_HOURS, new FloatReader().readFloat(buf)); - position.set("tank", buf.readUnsignedByte() * 0.4); - } - - if (BitUtil.check(flags, 2)) { - position.set("engine", buf.readUnsignedShort() * 0.125); - position.set("pedals", buf.readUnsignedByte()); - position.set(Position.PREFIX_TEMP + 1, buf.readUnsignedByte() - 40); - position.set(Position.KEY_ODOMETER_SERVICE, buf.readUnsignedShort()); - } - - if (BitUtil.check(flags, 3)) { - position.set(Position.KEY_FUEL_LEVEL, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 2, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 3, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 4, buf.readUnsignedShort()); - } - - if (BitUtil.check(flags, 4)) { - position.set(Position.PREFIX_TEMP + 1, buf.readByte()); - buf.getUnsignedByte(buf.readerIndex()); // control (>> 4) - position.set(Position.KEY_INPUT, buf.readUnsignedShort() & 0x0fff); - buf.readUnsignedShort(); // old sensor state (& 0x0fff) - } - - if (BitUtil.check(flags, 5)) { - position.set(Position.KEY_BATTERY, buf.getUnsignedByte(buf.readerIndex()) >> 2); - position.set(Position.KEY_POWER, buf.readUnsignedShort() & 0x03ff); - position.set(Position.KEY_DEVICE_TEMP, buf.readByte()); - - position.set(Position.KEY_RSSI, buf.getUnsignedByte(buf.readerIndex()) >> 5); - - int satellites = buf.readUnsignedByte() & 0x1f; - position.setValid(satellites >= 3); - position.set(Position.KEY_SATELLITES, satellites); - } - - // other data - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - HttpRequest request = (HttpRequest) msg; - ChannelBuffer buf = request.getContent(); - - buf.skipBytes("id=".length()); - int index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '&'); - String uniqueId = buf.toString(buf.readerIndex(), index - buf.readerIndex(), StandardCharsets.US_ASCII); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, uniqueId); - if (deviceSession == null) { - return null; - } - buf.skipBytes(uniqueId.length()); - buf.skipBytes("&bin=".length()); - - short packetId = buf.readUnsignedByte(); - short offset = buf.readUnsignedByte(); // dataOffset - short packetCount = buf.readUnsignedByte(); - buf.readUnsignedByte(); // reserved - buf.readUnsignedByte(); // timezone - buf.skipBytes(offset - 5); - - if (channel != null) { - sendContinue(channel); - sendResponse(channel, packetId, packetCount); - } - - if (packetId == 0x31 || packetId == 0x32 || packetId == 0x36) { - if (simple) { - return parseFormatA1(deviceSession, buf); - } else { - return parseFormatA(deviceSession, buf); - } - } //else if (0x34 0x38 0x4F 0x59) - - return null; - } - -} diff --git a/src/org/traccar/protocol/MtxProtocol.java b/src/org/traccar/protocol/MtxProtocol.java deleted file mode 100644 index 58b2361cd..000000000 --- a/src/org/traccar/protocol/MtxProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class MtxProtocol extends BaseProtocol { - - public MtxProtocol() { - super("mtx"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new MtxProtocolDecoder(MtxProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/MtxProtocolDecoder.java b/src/org/traccar/protocol/MtxProtocolDecoder.java deleted file mode 100644 index d7b572670..000000000 --- a/src/org/traccar/protocol/MtxProtocolDecoder.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class MtxProtocolDecoder extends BaseProtocolDecoder { - - public MtxProtocolDecoder(MtxProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("#MTX,") - .number("(d+),") // imei - .number("(dddd)(dd)(dd),") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(d+.?d*),") // speed - .number("(d+),") // course - .number("(d+.?d*),") // odometer - .groupBegin() - .number("d+") - .or() - .text("X") - .groupEnd() - .text(",") - .expression("(?:[01]|X),") - .expression("([01]+),") // input - .expression("([01]+),") // output - .number("(d+),") // adc1 - .number("(d+)") // adc2 - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - if (channel != null) { - channel.write("#ACK"); - } - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime()); - - position.setValid(true); - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - position.set(Position.KEY_INPUT, parser.next()); - position.set(Position.KEY_OUTPUT, parser.next()); - position.set(Position.PREFIX_ADC + 1, parser.next()); - position.set(Position.PREFIX_ADC + 2, parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/MxtFrameDecoder.java b/src/org/traccar/protocol/MxtFrameDecoder.java deleted file mode 100644 index b2cd6de93..000000000 --- a/src/org/traccar/protocol/MxtFrameDecoder.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -import java.nio.ByteOrder; - -public class MxtFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 2) { - return null; - } - - int index = buf.indexOf(buf.readerIndex() + 1, buf.writerIndex(), (byte) 0x04); - if (index != -1) { - ChannelBuffer result = ChannelBuffers.buffer(ByteOrder.LITTLE_ENDIAN, index + 1 - buf.readerIndex()); - - while (buf.readerIndex() <= index) { - int b = buf.readUnsignedByte(); - if (b == 0x10) { - result.writeByte(buf.readUnsignedByte() - 0x20); - } else { - result.writeByte(b); - } - } - - return result; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/MxtProtocol.java b/src/org/traccar/protocol/MxtProtocol.java deleted file mode 100644 index 03c1da71e..000000000 --- a/src/org/traccar/protocol/MxtProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class MxtProtocol extends BaseProtocol { - - public MxtProtocol() { - super("mxt"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new MxtFrameDecoder()); - pipeline.addLast("objectDecoder", new MxtProtocolDecoder(MxtProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/MxtProtocolDecoder.java b/src/org/traccar/protocol/MxtProtocolDecoder.java deleted file mode 100644 index 6d82e4a4b..000000000 --- a/src/org/traccar/protocol/MxtProtocolDecoder.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright 2015 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.Checksum; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; - -public class MxtProtocolDecoder extends BaseProtocolDecoder { - - public MxtProtocolDecoder(MxtProtocol protocol) { - super(protocol); - } - - public static final int MSG_ACK = 0x02; - public static final int MSG_NACK = 0x03; - public static final int MSG_POSITION = 0x31; - - private static void sendResponse(Channel channel, int device, long id, int crc) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 0); - response.writeByte(device); - response.writeByte(MSG_ACK); - response.writeInt((int) id); - response.writeShort(crc); - response.writeShort(Checksum.crc16( - Checksum.CRC16_XMODEM, response.toByteBuffer())); - - ChannelBuffer encoded = ChannelBuffers.dynamicBuffer(); - encoded.writeByte(0x01); // header - while (response.readable()) { - int b = response.readByte(); - if (b == 0x01 || b == 0x04 || b == 0x10 || b == 0x11 || b == 0x13) { - encoded.writeByte(0x10); - b += 0x20; - } - encoded.writeByte(b); - } - encoded.writeByte(0x04); // ending - channel.write(encoded); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.readUnsignedByte(); // start - int device = buf.readUnsignedByte(); // device descriptor - int type = buf.readUnsignedByte(); - - long id = buf.readUnsignedInt(); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, String.valueOf(id)); - if (deviceSession == null) { - return null; - } - - if (type == MSG_POSITION) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - buf.readUnsignedByte(); // protocol - int infoGroups = buf.readUnsignedByte(); - - position.set(Position.KEY_INDEX, buf.readUnsignedShort()); - - DateBuilder dateBuilder = new DateBuilder().setDate(2000, 1, 1); - - long date = buf.readUnsignedInt(); - - long days = BitUtil.from(date, 6 + 6 + 5); - long hours = BitUtil.between(date, 6 + 6, 6 + 6 + 5); - long minutes = BitUtil.between(date, 6, 6 + 6); - long seconds = BitUtil.to(date, 6); - - dateBuilder.addMillis((((days * 24 + hours) * 60 + minutes) * 60 + seconds) * 1000); - - position.setTime(dateBuilder.getDate()); - - position.setValid(true); - position.setLatitude(buf.readInt() / 1000000.0); - position.setLongitude(buf.readInt() / 1000000.0); - - long flags = buf.readUnsignedInt(); - position.set(Position.KEY_IGNITION, BitUtil.check(flags, 0)); - if (BitUtil.check(flags, 1)) { - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - } - position.set(Position.KEY_INPUT, BitUtil.between(flags, 2, 7)); - position.set(Position.KEY_OUTPUT, BitUtil.between(flags, 7, 10)); - position.setCourse(BitUtil.between(flags, 10, 13) * 45); - //position.setValid(BitUtil.check(flags, 15)); - position.set(Position.KEY_CHARGE, BitUtil.check(flags, 20)); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - - buf.readUnsignedByte(); // input mask - - if (BitUtil.check(infoGroups, 0)) { - buf.skipBytes(8); // waypoints - } - - if (BitUtil.check(infoGroups, 1)) { - buf.skipBytes(8); // wireless accessory - } - - if (BitUtil.check(infoGroups, 2)) { - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - position.set(Position.KEY_HDOP, buf.readUnsignedByte()); - position.setAccuracy(buf.readUnsignedByte()); - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - buf.readUnsignedShort(); // time since boot - position.set(Position.KEY_POWER, buf.readUnsignedByte()); - position.set(Position.PREFIX_TEMP + 1, buf.readByte()); - } - - if (BitUtil.check(infoGroups, 3)) { - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - } - - if (BitUtil.check(infoGroups, 4)) { - position.set(Position.KEY_HOURS, buf.readUnsignedInt()); - } - - if (BitUtil.check(infoGroups, 5)) { - buf.readUnsignedInt(); // reason - } - - if (BitUtil.check(infoGroups, 6)) { - position.set(Position.KEY_POWER, buf.readUnsignedShort() * 0.001); - position.set(Position.KEY_BATTERY, buf.readUnsignedShort()); - } - - if (BitUtil.check(infoGroups, 7)) { - position.set(Position.KEY_DRIVER_UNIQUE_ID, String.valueOf(buf.readUnsignedInt())); - } - - buf.readerIndex(buf.writerIndex() - 3); - sendResponse(channel, device, id, buf.readUnsignedShort()); - - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/NavigilFrameDecoder.java b/src/org/traccar/protocol/NavigilFrameDecoder.java deleted file mode 100644 index 34eb28941..000000000 --- a/src/org/traccar/protocol/NavigilFrameDecoder.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class NavigilFrameDecoder extends FrameDecoder { - - private static final int MESSAGE_HEADER = 20; - private static final long PREAMBLE = 0x2477F5F6; - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - // Check minimum length - if (buf.readableBytes() < MESSAGE_HEADER) { - return null; - } - - // Check for preamble - boolean hasPreamble = false; - if (buf.getUnsignedInt(buf.readerIndex()) == PREAMBLE) { - hasPreamble = true; - } - - // Check length and return buffer - int length = buf.getUnsignedShort(buf.readerIndex() + 6); - if (buf.readableBytes() >= length) { - if (hasPreamble) { - buf.readUnsignedInt(); - length -= 4; - } - return buf.readBytes(length); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/NavigilProtocol.java b/src/org/traccar/protocol/NavigilProtocol.java deleted file mode 100644 index 6646c6cc6..000000000 --- a/src/org/traccar/protocol/NavigilProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class NavigilProtocol extends BaseProtocol { - - public NavigilProtocol() { - super("navigil"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new NavigilFrameDecoder()); - pipeline.addLast("objectDecoder", new NavigilProtocolDecoder(NavigilProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/NavigilProtocolDecoder.java b/src/org/traccar/protocol/NavigilProtocolDecoder.java deleted file mode 100644 index 360b9c81c..000000000 --- a/src/org/traccar/protocol/NavigilProtocolDecoder.java +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Copyright 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Checksum; -import org.traccar.helper.Log; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.util.Date; - -public class NavigilProtocolDecoder extends BaseProtocolDecoder { - - public NavigilProtocolDecoder(NavigilProtocol protocol) { - super(protocol); - } - - private static final int LEAP_SECONDS_DELTA = 25; - - public static final int MSG_ERROR = 2; - public static final int MSG_INDICATION = 4; - public static final int MSG_CONN_OPEN = 5; - public static final int MSG_CONN_CLOSE = 6; - public static final int MSG_SYSTEM_REPORT = 7; - public static final int MSG_UNIT_REPORT = 8; - public static final int MSG_GEOFENCE_ALARM = 10; - public static final int MSG_INPUT_ALARM = 11; - public static final int MSG_TG2_REPORT = 12; - public static final int MSG_POSITION_REPORT = 13; - public static final int MSG_POSITION_REPORT_2 = 15; - public static final int MSG_SNAPSHOT4 = 17; - public static final int MSG_TRACKING_DATA = 18; - public static final int MSG_MOTION_ALARM = 19; - public static final int MSG_ACKNOWLEDGEMENT = 255; - - private static Date convertTimestamp(long timestamp) { - return new Date((timestamp - LEAP_SECONDS_DELTA) * 1000); - } - - private int senderSequenceNumber = 1; - - private void sendAcknowledgment(Channel channel, int sequenceNumber) { - ChannelBuffer data = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, 4); - data.writeShort(sequenceNumber); - data.writeShort(0); // OK - - ChannelBuffer header = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, 20); - header.writeByte(1); header.writeByte(0); - header.writeShort(senderSequenceNumber++); - header.writeShort(MSG_ACKNOWLEDGEMENT); - header.writeShort(header.capacity() + data.capacity()); - header.writeShort(0); - header.writeShort(Checksum.crc16(Checksum.CRC16_CCITT_FALSE, data.toByteBuffer())); - header.writeInt(0); - header.writeInt((int) (System.currentTimeMillis() / 1000) + LEAP_SECONDS_DELTA); - - if (channel != null) { - channel.write(ChannelBuffers.copiedBuffer(header, data)); - } - } - - private Position parseUnitReport( - DeviceSession deviceSession, ChannelBuffer buf, int sequenceNumber) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.setValid(true); - position.set(Position.KEY_INDEX, sequenceNumber); - position.setDeviceId(deviceSession.getDeviceId()); - - buf.readUnsignedShort(); // report trigger - position.set(Position.KEY_FLAGS, buf.readUnsignedShort()); - - position.setLatitude(buf.readInt() * 0.0000001); - position.setLongitude(buf.readInt() * 0.0000001); - position.setAltitude(buf.readUnsignedShort()); - - position.set(Position.KEY_SATELLITES, buf.readUnsignedShort()); - position.set(Position.KEY_SATELLITES_VISIBLE, buf.readUnsignedShort()); - position.set("gpsAntennaState", buf.readUnsignedShort()); - - position.setSpeed(buf.readUnsignedShort() * 0.194384); - position.setCourse(buf.readUnsignedShort()); - - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - position.set(Position.KEY_DISTANCE, buf.readUnsignedInt()); - - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - - position.set(Position.KEY_CHARGE, buf.readUnsignedShort()); - - position.setTime(convertTimestamp(buf.readUnsignedInt())); - - return position; - } - - private Position parseTg2Report( - DeviceSession deviceSession, ChannelBuffer buf, int sequenceNumber) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.setValid(true); - position.set(Position.KEY_INDEX, sequenceNumber); - position.setDeviceId(deviceSession.getDeviceId()); - - buf.readUnsignedShort(); // report trigger - buf.readUnsignedByte(); // reserved - buf.readUnsignedByte(); // assisted GPS age - - position.setTime(convertTimestamp(buf.readUnsignedInt())); - - position.setLatitude(buf.readInt() * 0.0000001); - position.setLongitude(buf.readInt() * 0.0000001); - position.setAltitude(buf.readUnsignedShort()); - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - position.set(Position.KEY_SATELLITES_VISIBLE, buf.readUnsignedByte()); - - position.setSpeed(buf.readUnsignedShort() * 0.194384); - position.setCourse(buf.readUnsignedShort()); - - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - position.set("maximumSpeed", buf.readUnsignedShort()); - position.set("minimumSpeed", buf.readUnsignedShort()); - - position.set(Position.PREFIX_IO + 1, buf.readUnsignedShort()); // VSAUT1 voltage - position.set(Position.PREFIX_IO + 2, buf.readUnsignedShort()); // VSAUT2 voltage - position.set(Position.PREFIX_IO + 3, buf.readUnsignedShort()); // solar voltage - - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - - return position; - } - - private Position parsePositionReport( - DeviceSession deviceSession, ChannelBuffer buf, int sequenceNumber, long timestamp) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.set(Position.KEY_INDEX, sequenceNumber); - position.setDeviceId(deviceSession.getDeviceId()); - position.setTime(convertTimestamp(timestamp)); - - position.setLatitude(buf.readMedium() * 0.00002); - position.setLongitude(buf.readMedium() * 0.00002); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - position.setCourse(buf.readUnsignedByte() * 2); - - short flags = buf.readUnsignedByte(); - position.setValid((flags & 0x80) == 0x80 && (flags & 0x40) == 0x40); - - buf.readUnsignedByte(); // reserved - - return position; - } - - private Position parsePositionReport2( - DeviceSession deviceSession, ChannelBuffer buf, int sequenceNumber, long timestamp) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.set(Position.KEY_INDEX, sequenceNumber); - position.setDeviceId(deviceSession.getDeviceId()); - position.setTime(convertTimestamp(timestamp)); - - position.setLatitude(buf.readInt() * 0.0000001); - position.setLongitude(buf.readInt() * 0.0000001); - - buf.readUnsignedByte(); // report trigger - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - - short flags = buf.readUnsignedByte(); - position.setValid((flags & 0x80) == 0x80 && (flags & 0x40) == 0x40); - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - - return position; - } - - private Position parseSnapshot4( - DeviceSession deviceSession, ChannelBuffer buf, int sequenceNumber) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.set(Position.KEY_INDEX, sequenceNumber); - position.setDeviceId(deviceSession.getDeviceId()); - - buf.readUnsignedByte(); // report trigger - buf.readUnsignedByte(); // position fix source - buf.readUnsignedByte(); // GNSS fix quality - buf.readUnsignedByte(); // GNSS assistance age - - long flags = buf.readUnsignedInt(); - position.setValid((flags & 0x0400) == 0x0400); - - position.setTime(convertTimestamp(buf.readUnsignedInt())); - - position.setLatitude(buf.readInt() * 0.0000001); - position.setLongitude(buf.readInt() * 0.0000001); - position.setAltitude(buf.readUnsignedShort()); - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - position.set(Position.KEY_SATELLITES_VISIBLE, buf.readUnsignedByte()); - - position.setSpeed(buf.readUnsignedShort() * 0.194384); - position.setCourse(buf.readUnsignedShort() * 0.1); - - position.set("maximumSpeed", buf.readUnsignedByte()); - position.set("minimumSpeed", buf.readUnsignedByte()); - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - - position.set(Position.PREFIX_IO + 1, buf.readUnsignedByte()); // supply voltage 1 - position.set(Position.PREFIX_IO + 2, buf.readUnsignedByte()); // supply voltage 2 - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - - return position; - } - - private Position parseTrackingData( - DeviceSession deviceSession, ChannelBuffer buf, int sequenceNumber, long timestamp) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.set(Position.KEY_INDEX, sequenceNumber); - position.setDeviceId(deviceSession.getDeviceId()); - position.setTime(convertTimestamp(timestamp)); - - buf.readUnsignedByte(); // tracking mode - - short flags = buf.readUnsignedByte(); - position.setValid((flags & 0x01) == 0x01); - - buf.readUnsignedShort(); // duration - - position.setLatitude(buf.readInt() * 0.0000001); - position.setLongitude(buf.readInt() * 0.0000001); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - position.setCourse(buf.readUnsignedByte() * 2.0); - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.readUnsignedByte(); // protocol version - buf.readUnsignedByte(); // version id - int sequenceNumber = buf.readUnsignedShort(); - int messageId = buf.readUnsignedShort(); - buf.readUnsignedShort(); // length - int flags = buf.readUnsignedShort(); - buf.readUnsignedShort(); // checksum - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, String.valueOf(buf.readUnsignedInt())); - if (deviceSession == null) { - return null; - } - - long timestamp = buf.readUnsignedInt(); - - if ((flags & 0x1) == 0x0) { - sendAcknowledgment(channel, sequenceNumber); - } - - switch (messageId) { - case MSG_UNIT_REPORT: - return parseUnitReport(deviceSession, buf, sequenceNumber); - case MSG_TG2_REPORT: - return parseTg2Report(deviceSession, buf, sequenceNumber); - case MSG_POSITION_REPORT: - return parsePositionReport(deviceSession, buf, sequenceNumber, timestamp); - case MSG_POSITION_REPORT_2: - return parsePositionReport2(deviceSession, buf, sequenceNumber, timestamp); - case MSG_SNAPSHOT4: - return parseSnapshot4(deviceSession, buf, sequenceNumber); - case MSG_TRACKING_DATA: - return parseTrackingData(deviceSession, buf, sequenceNumber, timestamp); - default: - Log.warning(new UnsupportedOperationException(String.valueOf(messageId))); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/NavisProtocol.java b/src/org/traccar/protocol/NavisProtocol.java deleted file mode 100644 index 771c9d61d..000000000 --- a/src/org/traccar/protocol/NavisProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class NavisProtocol extends BaseProtocol { - - public NavisProtocol() { - super("navis"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(4 * 1024, 12, 2, 2, 0)); - pipeline.addLast("objectDecoder", new NavisProtocolDecoder(NavisProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/NavisProtocolDecoder.java b/src/org/traccar/protocol/NavisProtocolDecoder.java deleted file mode 100644 index 8d4e367ab..000000000 --- a/src/org/traccar/protocol/NavisProtocolDecoder.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright 2012 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.LinkedList; -import java.util.List; - -public class NavisProtocolDecoder extends BaseProtocolDecoder { - - private String prefix; - private long deviceUniqueId, serverId; - - public NavisProtocolDecoder(NavisProtocol protocol) { - super(protocol); - } - - public static final int F10 = 0x01; - public static final int F20 = 0x02; - public static final int F30 = 0x03; - public static final int F40 = 0x04; - public static final int F50 = 0x05; - public static final int F51 = 0x15; - public static final int F52 = 0x25; - - private static boolean isFormat(int type, int... types) { - for (int i : types) { - if (type == i) { - return true; - } - } - return false; - } - - private static final class ParseResult { - private final long id; - private final Position position; - - private ParseResult(long id, Position position) { - this.id = id; - this.position = position; - } - - public long getId() { - return id; - } - - public Position getPosition() { - return position; - } - } - - private ParseResult parsePosition(DeviceSession deviceSession, ChannelBuffer buf) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.setDeviceId(deviceSession.getDeviceId()); - - int format; - if (buf.getUnsignedByte(buf.readerIndex()) == 0) { - format = buf.readUnsignedShort(); - } else { - format = buf.readUnsignedByte(); - } - position.set("format", format); - - long index = buf.readUnsignedInt(); - position.set(Position.KEY_INDEX, index); - - position.set(Position.KEY_EVENT, buf.readUnsignedShort()); - - buf.skipBytes(6); // event time - - short armedStatus = buf.readUnsignedByte(); - position.set(Position.KEY_ARMED, armedStatus & 0x7F); - if (BitUtil.check(armedStatus, 7)) { - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - } - position.set(Position.KEY_STATUS, buf.readUnsignedByte()); - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - - if (isFormat(format, F10, F20, F30)) { - position.set(Position.KEY_OUTPUT, buf.readUnsignedShort()); - } else if (isFormat(format, F40, F50, F51, F52)) { - position.set(Position.KEY_OUTPUT, buf.readUnsignedByte()); - } - - if (isFormat(format, F10, F20, F30, F40)) { - position.set(Position.KEY_INPUT, buf.readUnsignedShort()); - } else if (isFormat(format, F50, F51, F52)) { - position.set(Position.KEY_INPUT, buf.readUnsignedByte()); - } - - position.set(Position.KEY_POWER, buf.readUnsignedShort() * 0.001); - position.set(Position.KEY_BATTERY, buf.readUnsignedShort()); - - if (isFormat(format, F10, F20, F30)) { - position.set(Position.PREFIX_TEMP + 1, buf.readShort()); - } - - if (isFormat(format, F10, F20, F50, F52)) { - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 2, buf.readUnsignedShort()); - } - - // Impulse counters - if (isFormat(format, F20, F50, F51, F52)) { - buf.readUnsignedInt(); - buf.readUnsignedInt(); - } - - if (isFormat(format, F20, F50, F51, F52)) { - int locationStatus = buf.readUnsignedByte(); - position.setValid(BitUtil.check(locationStatus, 1)); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setDateReverse(buf.readUnsignedByte(), buf.readUnsignedByte() + 1, buf.readUnsignedByte()); - position.setTime(dateBuilder.getDate()); - - position.setLatitude(buf.readFloat() / Math.PI * 180); - position.setLongitude(buf.readFloat() / Math.PI * 180); - position.setSpeed(UnitsConverter.knotsFromKph(buf.readFloat())); - position.setCourse(buf.readUnsignedShort()); - - position.set(Position.KEY_ODOMETER, buf.readFloat() * 1000); - position.set(Position.KEY_DISTANCE, buf.readFloat()); - - // Segment times - buf.readUnsignedShort(); - buf.readUnsignedShort(); - } - - // Other - if (isFormat(format, F51, F52)) { - buf.readUnsignedShort(); - buf.readByte(); - buf.readUnsignedShort(); - buf.readUnsignedShort(); - buf.readByte(); - buf.readUnsignedShort(); - buf.readUnsignedShort(); - buf.readByte(); - buf.readUnsignedShort(); - } - - // Four temperature sensors - if (isFormat(format, F40, F52)) { - buf.readByte(); - buf.readByte(); - buf.readByte(); - buf.readByte(); - } - - return new ParseResult(index, position); - } - - private Object processSingle(DeviceSession deviceSession, Channel channel, ChannelBuffer buf) { - ParseResult result = parsePosition(deviceSession, buf); - - ChannelBuffer response = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 8); - response.writeBytes(ChannelBuffers.copiedBuffer(ByteOrder.LITTLE_ENDIAN, "*<T", StandardCharsets.US_ASCII)); - response.writeInt((int) result.getId()); - sendReply(channel, response); - - if (result.getPosition().getFixTime() == null) { - return null; - } - - return result.getPosition(); - } - - private Object processArray(DeviceSession deviceSession, Channel channel, ChannelBuffer buf) { - List<Position> positions = new LinkedList<>(); - int count = buf.readUnsignedByte(); - - for (int i = 0; i < count; i++) { - Position position = parsePosition(deviceSession, buf).getPosition(); - if (position.getFixTime() != null) { - positions.add(position); - } - } - - ChannelBuffer response = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 8); - response.writeBytes(ChannelBuffers.copiedBuffer(ByteOrder.LITTLE_ENDIAN, "*<A", StandardCharsets.US_ASCII)); - response.writeByte(count); - sendReply(channel, response); - - if (positions.isEmpty()) { - return null; - } - - return positions; - } - - private Object processHandshake(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - buf.readByte(); // semicolon symbol - if (getDeviceSession(channel, remoteAddress, buf.toString(StandardCharsets.US_ASCII)) != null) { - sendReply(channel, ChannelBuffers.copiedBuffer(ByteOrder.LITTLE_ENDIAN, "*<S", StandardCharsets.US_ASCII)); - } - return null; - } - - private static short checksum(ChannelBuffer buf) { - short sum = 0; - for (int i = 0; i < buf.readableBytes(); i++) { - sum ^= buf.getUnsignedByte(i); - } - return sum; - } - - private void sendReply(Channel channel, ChannelBuffer data) { - ChannelBuffer header = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, 16); - header.writeBytes(ChannelBuffers.copiedBuffer(ByteOrder.LITTLE_ENDIAN, prefix, StandardCharsets.US_ASCII)); - header.writeInt((int) deviceUniqueId); - header.writeInt((int) serverId); - header.writeShort(data.readableBytes()); - header.writeByte(checksum(data)); - header.writeByte(checksum(header)); - - if (channel != null) { - channel.write(ChannelBuffers.copiedBuffer(header, data)); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - prefix = buf.toString(buf.readerIndex(), 4, StandardCharsets.US_ASCII); - buf.skipBytes(prefix.length()); // prefix @NTC by default - serverId = buf.readUnsignedInt(); - deviceUniqueId = buf.readUnsignedInt(); - int length = buf.readUnsignedShort(); - buf.skipBytes(2); // header and data XOR checksum - - if (length == 0) { - return null; // keep alive message - } - - String type = buf.toString(buf.readerIndex(), 3, StandardCharsets.US_ASCII); - buf.skipBytes(type.length()); - - if (type.equals("*>S")) { - return processHandshake(channel, remoteAddress, buf); - } else { - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession != null) { - if (type.equals("*>T")) { - return processSingle(deviceSession, channel, buf); - } else if (type.equals("*>A")) { - return processArray(deviceSession, channel, buf); - } - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/NoranProtocol.java b/src/org/traccar/protocol/NoranProtocol.java deleted file mode 100644 index 7d3dc4852..000000000 --- a/src/org/traccar/protocol/NoranProtocol.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.nio.ByteOrder; -import java.util.List; - -public class NoranProtocol extends BaseProtocol { - - public NoranProtocol() { - super("noran"); - setSupportedDataCommands( - Command.TYPE_POSITION_SINGLE, - Command.TYPE_POSITION_PERIODIC, - Command.TYPE_POSITION_STOP, - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectEncoder", new NoranProtocolEncoder()); - pipeline.addLast("objectDecoder", new NoranProtocolDecoder(NoranProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/NoranProtocolDecoder.java b/src/org/traccar/protocol/NoranProtocolDecoder.java deleted file mode 100644 index 990f50484..000000000 --- a/src/org/traccar/protocol/NoranProtocolDecoder.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright 2013 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.text.DateFormat; -import java.text.SimpleDateFormat; - -public class NoranProtocolDecoder extends BaseProtocolDecoder { - - public NoranProtocolDecoder(NoranProtocol protocol) { - super(protocol); - } - - public static final int MSG_UPLOAD_POSITION = 0x0008; - public static final int MSG_UPLOAD_POSITION_NEW = 0x0032; - public static final int MSG_CONTROL = 0x0002; - public static final int MSG_CONTROL_RESPONSE = 0x8009; - public static final int MSG_ALARM = 0x0003; - public static final int MSG_SHAKE_HAND = 0x0000; - public static final int MSG_SHAKE_HAND_RESPONSE = 0x8000; - public static final int MSG_IMAGE_SIZE = 0x0200; - public static final int MSG_IMAGE_PACKET = 0x0201; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.readUnsignedShort(); // length - int type = buf.readUnsignedShort(); - - if (type == MSG_SHAKE_HAND && channel != null) { - - ChannelBuffer response = ChannelBuffers.dynamicBuffer(ByteOrder.LITTLE_ENDIAN, 13); - response.writeBytes( - ChannelBuffers.copiedBuffer(ByteOrder.LITTLE_ENDIAN, "\r\n*KW", StandardCharsets.US_ASCII)); - response.writeByte(0); - response.writeShort(response.capacity()); - response.writeShort(MSG_SHAKE_HAND_RESPONSE); - response.writeByte(1); // status - response.writeBytes( - ChannelBuffers.copiedBuffer(ByteOrder.LITTLE_ENDIAN, "\r\n", StandardCharsets.US_ASCII)); - - channel.write(response, remoteAddress); - - } else if (type == MSG_UPLOAD_POSITION || type == MSG_UPLOAD_POSITION_NEW - || type == MSG_CONTROL_RESPONSE || type == MSG_ALARM) { - - boolean newFormat = false; - if (type == MSG_UPLOAD_POSITION && buf.readableBytes() == 48 - || type == MSG_ALARM && buf.readableBytes() == 48 - || type == MSG_CONTROL_RESPONSE && buf.readableBytes() == 57) { - newFormat = true; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - if (type == MSG_CONTROL_RESPONSE) { - buf.readUnsignedInt(); // GIS ip - buf.readUnsignedInt(); // GIS port - } - - position.setValid(BitUtil.check(buf.readUnsignedByte(), 0)); - - short alarm = buf.readUnsignedByte(); - switch (alarm) { - case 1: - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - break; - case 2: - position.set(Position.KEY_ALARM, Position.ALARM_OVERSPEED); - break; - case 3: - position.set(Position.KEY_ALARM, Position.ALARM_GEOFENCE_EXIT); - break; - case 9: - position.set(Position.KEY_ALARM, Position.ALARM_POWER_OFF); - break; - default: - break; - } - - if (newFormat) { - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedInt())); - position.setCourse(buf.readFloat()); - } else { - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - position.setCourse(buf.readUnsignedShort()); - } - position.setLongitude(buf.readFloat()); - position.setLatitude(buf.readFloat()); - - if (!newFormat) { - long timeValue = buf.readUnsignedInt(); - DateBuilder dateBuilder = new DateBuilder() - .setYear((int) BitUtil.from(timeValue, 26)) - .setMonth((int) BitUtil.between(timeValue, 22, 26)) - .setDay((int) BitUtil.between(timeValue, 17, 22)) - .setHour((int) BitUtil.between(timeValue, 12, 17)) - .setMinute((int) BitUtil.between(timeValue, 6, 12)) - .setSecond((int) BitUtil.to(timeValue, 6)); - position.setTime(dateBuilder.getDate()); - } - - ChannelBuffer rawId; - if (newFormat) { - rawId = buf.readBytes(12); - } else { - rawId = buf.readBytes(11); - } - String id = rawId.toString(StandardCharsets.US_ASCII).replaceAll("[^\\p{Print}]", ""); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - if (newFormat) { - DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); - position.setTime(dateFormat.parse(buf.readBytes(17).toString(StandardCharsets.US_ASCII))); - buf.readByte(); - } - - if (!newFormat) { - position.set(Position.PREFIX_IO + 1, buf.readUnsignedByte()); - position.set(Position.KEY_FUEL_LEVEL, buf.readUnsignedByte()); - } else if (type == MSG_UPLOAD_POSITION_NEW) { - position.set(Position.PREFIX_TEMP + 1, buf.readShort()); - position.set(Position.KEY_ODOMETER, buf.readFloat()); - } - - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/NoranProtocolEncoder.java b/src/org/traccar/protocol/NoranProtocolEncoder.java deleted file mode 100644 index 25b510a73..000000000 --- a/src/org/traccar/protocol/NoranProtocolEncoder.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; - -public class NoranProtocolEncoder extends BaseProtocolEncoder { - - private ChannelBuffer encodeContent(String content) { - - ChannelBuffer buf = ChannelBuffers.buffer(ByteOrder.LITTLE_ENDIAN, 12 + 56); - - buf.writeBytes( - ChannelBuffers.copiedBuffer(ByteOrder.LITTLE_ENDIAN, "\r\n*KW", StandardCharsets.US_ASCII)); - buf.writeByte(0); - buf.writeShort(buf.capacity()); - buf.writeShort(NoranProtocolDecoder.MSG_CONTROL); - buf.writeInt(0); // gis ip - buf.writeShort(0); // gis port - buf.writeBytes(content.getBytes(StandardCharsets.US_ASCII)); - buf.writerIndex(buf.writerIndex() + 50 - content.length()); - buf.writeBytes( - ChannelBuffers.copiedBuffer(ByteOrder.LITTLE_ENDIAN, "\r\n", StandardCharsets.US_ASCII)); - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_POSITION_SINGLE: - return encodeContent("*KW,000,000,000000#"); - case Command.TYPE_POSITION_PERIODIC: - int interval = command.getInteger(Command.KEY_FREQUENCY); - return encodeContent("*KW,000,002,000000," + interval + "#"); - case Command.TYPE_POSITION_STOP: - return encodeContent("*KW,000,002,000000,0#"); - case Command.TYPE_ENGINE_STOP: - return encodeContent("*KW,000,007,000000,0#"); - case Command.TYPE_ENGINE_RESUME: - return encodeContent("*KW,000,007,000000,1#"); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/NvsFrameDecoder.java b/src/org/traccar/protocol/NvsFrameDecoder.java deleted file mode 100644 index 598bb1e4c..000000000 --- a/src/org/traccar/protocol/NvsFrameDecoder.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class NvsFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 4 + 2) { - return null; - } - - int length; - if (buf.getUnsignedByte(buf.readerIndex()) == 0) { - length = 2 + buf.getUnsignedShort(buf.readerIndex()); - } else { - length = 4 + 2 + buf.getUnsignedShort(buf.readerIndex() + 4) + 2; - } - - if (buf.readableBytes() >= length) { - return buf.readBytes(length); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/NvsProtocol.java b/src/org/traccar/protocol/NvsProtocol.java deleted file mode 100644 index fdcb2bbcf..000000000 --- a/src/org/traccar/protocol/NvsProtocol.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2016 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class NvsProtocol extends BaseProtocol { - - public NvsProtocol() { - super("nvs"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new NvsFrameDecoder()); - pipeline.addLast("objectDecoder", new NvsProtocolDecoder(NvsProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/NvsProtocolDecoder.java b/src/org/traccar/protocol/NvsProtocolDecoder.java deleted file mode 100644 index 0e82fae69..000000000 --- a/src/org/traccar/protocol/NvsProtocolDecoder.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class NvsProtocolDecoder extends BaseProtocolDecoder { - - public NvsProtocolDecoder(NvsProtocol protocol) { - super(protocol); - } - - private void sendResponse(Channel channel, String response) { - if (channel != null) { - channel.write(ChannelBuffers.copiedBuffer(response, StandardCharsets.US_ASCII)); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - - if (buf.getUnsignedByte(buf.readerIndex()) == 0) { - - buf.readUnsignedShort(); // length - - String imei = buf.toString(buf.readerIndex(), 15, StandardCharsets.US_ASCII); - - if (getDeviceSession(channel, remoteAddress, imei) != null) { - sendResponse(channel, "OK"); - } else { - sendResponse(channel, "NO01"); - } - - } else { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - List<Position> positions = new LinkedList<>(); - - buf.skipBytes(4); // marker - buf.readUnsignedShort(); // length - buf.readLong(); // imei - buf.readUnsignedByte(); // codec - int count = buf.readUnsignedByte(); - - for (int i = 0; i < count; i++) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - - position.set("reason", buf.readUnsignedByte()); - - position.setLongitude(buf.readInt() / 10000000.0); - position.setLatitude(buf.readInt() / 10000000.0); - position.setAltitude(buf.readShort()); - position.setCourse(buf.readUnsignedShort()); - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort())); - position.setValid(buf.readUnsignedByte() != 0); - - buf.readUnsignedByte(); // used systems - - buf.readUnsignedByte(); // cause element id - - // Read 1 byte data - int cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - position.set(Position.PREFIX_IO + buf.readUnsignedByte(), buf.readUnsignedByte()); - } - - // Read 2 byte data - cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - position.set(Position.PREFIX_IO + buf.readUnsignedByte(), buf.readUnsignedShort()); - } - - // Read 4 byte data - cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - position.set(Position.PREFIX_IO + buf.readUnsignedByte(), buf.readUnsignedInt()); - } - - // Read 8 byte data - cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - position.set(Position.PREFIX_IO + buf.readUnsignedByte(), buf.readLong()); - } - - positions.add(position); - } - - return positions; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/ObdDongleProtocol.java b/src/org/traccar/protocol/ObdDongleProtocol.java deleted file mode 100644 index 6547a31ab..000000000 --- a/src/org/traccar/protocol/ObdDongleProtocol.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2016 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class ObdDongleProtocol extends BaseProtocol { - - public ObdDongleProtocol() { - super("obddongle"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1099, 20, 2, 3, 0)); - pipeline.addLast("objectDecoder", new ObdDongleProtocolDecoder(ObdDongleProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/ObdDongleProtocolDecoder.java b/src/org/traccar/protocol/ObdDongleProtocolDecoder.java deleted file mode 100644 index e5ae5e93f..000000000 --- a/src/org/traccar/protocol/ObdDongleProtocolDecoder.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; - -public class ObdDongleProtocolDecoder extends BaseProtocolDecoder { - - public ObdDongleProtocolDecoder(ObdDongleProtocol protocol) { - super(protocol); - } - - public static final int MSG_TYPE_CONNECT = 0x01; - public static final int MSG_TYPE_CONNACK = 0x02; - public static final int MSG_TYPE_PUBLISH = 0x03; - public static final int MSG_TYPE_PUBACK = 0x04; - public static final int MSG_TYPE_PINGREQ = 0x0C; - public static final int MSG_TYPE_PINGRESP = 0x0D; - public static final int MSG_TYPE_DISCONNECT = 0x0E; - - private static void sendResponse(Channel channel, int type, int index, String imei, ChannelBuffer content) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeShort(0x5555); // header - response.writeShort(index); - response.writeBytes(imei.getBytes(StandardCharsets.US_ASCII)); - response.writeByte(type); - response.writeShort(content.readableBytes()); - response.writeBytes(content); - response.writeByte(0); // checksum - response.writeShort(0xAAAA); - channel.write(response); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - int index = buf.readUnsignedShort(); - - String imei = buf.readBytes(15).toString(StandardCharsets.US_ASCII); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - - int type = buf.readUnsignedByte(); - - buf.readUnsignedShort(); // data length - - if (type == MSG_TYPE_CONNECT) { - - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeByte(1); - response.writeShort(0); - response.writeInt(0); - sendResponse(channel, MSG_TYPE_CONNACK, index, imei, response); - - } else if (type == MSG_TYPE_PUBLISH) { - - int typeMajor = buf.readUnsignedByte(); - int typeMinor = buf.readUnsignedByte(); - - buf.readUnsignedByte(); // event id - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - - int flags = buf.readUnsignedByte(); - - position.setValid(!BitUtil.check(flags, 6)); - - position.set(Position.KEY_SATELLITES, BitUtil.to(flags, 4)); - - double longitude = ((BitUtil.to(buf.readUnsignedShort(), 1) << 24) + buf.readUnsignedMedium()) * 0.00001; - position.setLongitude(BitUtil.check(flags, 5) ? longitude : -longitude); - - double latitude = buf.readUnsignedMedium() * 0.00001; - position.setLatitude(BitUtil.check(flags, 4) ? latitude : -latitude); - - int speedCourse = buf.readUnsignedMedium(); - position.setSpeed(UnitsConverter.knotsFromMph(BitUtil.from(speedCourse, 10) * 0.1)); - position.setCourse(BitUtil.to(speedCourse, 10)); - - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeByte(typeMajor); - response.writeByte(typeMinor); - sendResponse(channel, MSG_TYPE_PUBACK, index, imei, response); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/OigoProtocol.java b/src/org/traccar/protocol/OigoProtocol.java deleted file mode 100644 index 4b6ad0dd0..000000000 --- a/src/org/traccar/protocol/OigoProtocol.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2016 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.ConnectionlessBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class OigoProtocol extends BaseProtocol { - - public OigoProtocol() { - super("oigo"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectDecoder", new OigoProtocolDecoder(OigoProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/OigoProtocolDecoder.java b/src/org/traccar/protocol/OigoProtocolDecoder.java deleted file mode 100644 index 54360c932..000000000 --- a/src/org/traccar/protocol/OigoProtocolDecoder.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; - -public class OigoProtocolDecoder extends BaseProtocolDecoder { - - public OigoProtocolDecoder(OigoProtocol protocol) { - super(protocol); - } - - public static final int MSG_AR_LOCATION = 0x00; - public static final int MSG_AR_REMOTE_START = 0x10; - - public static final int MSG_ACKNOWLEDGEMENT = 0xE0; - - private Position decodeArMessage(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - - buf.skipBytes(1); // header - buf.readUnsignedShort(); // length - - int type = buf.readUnsignedByte(); - - int tag = buf.readUnsignedByte(); - - DeviceSession deviceSession; - switch (BitUtil.to(tag, 3)) { - case 0: - String imei = ChannelBuffers.hexDump(buf.readBytes(8)).substring(1); - deviceSession = getDeviceSession(channel, remoteAddress, imei); - break; - case 1: - buf.skipBytes(1); - String meid = buf.readBytes(14).toString(StandardCharsets.US_ASCII); - deviceSession = getDeviceSession(channel, remoteAddress, meid); - break; - default: - deviceSession = getDeviceSession(channel, remoteAddress); - break; - } - - if (deviceSession == null || type != MSG_AR_LOCATION) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_EVENT, buf.readUnsignedByte()); - - int mask = buf.readInt(); - - if (BitUtil.check(mask, 0)) { - position.set(Position.KEY_INDEX, buf.readUnsignedShort()); - } - - if (BitUtil.check(mask, 1)) { - int date = buf.readUnsignedByte(); - DateBuilder dateBuilder = new DateBuilder() - .setDate(BitUtil.between(date, 4, 8) + 2010, BitUtil.to(date, 4), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - position.setTime(dateBuilder.getDate()); - } - - if (BitUtil.check(mask, 2)) { - buf.skipBytes(5); // device time - } - - if (BitUtil.check(mask, 3)) { - position.setLatitude(buf.readUnsignedInt() * 0.000001 - 90); - position.setLongitude(buf.readUnsignedInt() * 0.000001 - 180.0); - } - - if (BitUtil.check(mask, 4)) { - int status = buf.readUnsignedByte(); - position.setValid(BitUtil.between(status, 4, 8) != 0); - position.set(Position.KEY_SATELLITES, BitUtil.to(status, 4)); - position.set(Position.KEY_HDOP, buf.readUnsignedByte() * 0.1); - } - - if (BitUtil.check(mask, 5)) { - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - } - - if (BitUtil.check(mask, 6)) { - position.setCourse(buf.readUnsignedShort()); - } - - if (BitUtil.check(mask, 7)) { - position.setAltitude(buf.readShort()); - } - - if (BitUtil.check(mask, 8)) { - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - } - - if (BitUtil.check(mask, 9)) { - position.set(Position.KEY_POWER, buf.readUnsignedShort() * 0.001); - } - - if (BitUtil.check(mask, 10)) { - position.set(Position.KEY_BATTERY, buf.readUnsignedShort() * 0.001); - } - - if (BitUtil.check(mask, 11)) { - buf.skipBytes(2); // gpio - } - - if (BitUtil.check(mask, 12)) { - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt() * 1000); - } - - if (BitUtil.check(mask, 13)) { - buf.skipBytes(6); // software version - } - - if (BitUtil.check(mask, 14)) { - buf.skipBytes(5); // hardware version - } - - if (BitUtil.check(mask, 15)) { - buf.readUnsignedShort(); // device config - } - - return position; - } - - private double convertCoordinate(long value) { - boolean negative = value < 0; - value = Math.abs(value); - double minutes = (value % 100000) * 0.001; - value /= 100000; - double degrees = value + minutes / 60; - return negative ? -degrees : degrees; - } - - private Position decodeMgMessage(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - - buf.readUnsignedByte(); // tag - int flags = buf.getUnsignedByte(buf.readerIndex()); - - DeviceSession deviceSession; - if (BitUtil.check(flags, 6)) { - buf.readUnsignedByte(); // flags - deviceSession = getDeviceSession(channel, remoteAddress); - } else { - String imei = ChannelBuffers.hexDump(buf.readBytes(8)).substring(1); - deviceSession = getDeviceSession(channel, remoteAddress, imei); - } - - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - buf.skipBytes(8); // imsi - - int date = buf.readUnsignedShort(); - - DateBuilder dateBuilder = new DateBuilder() - .setDate(2010 + BitUtil.from(date, 12), BitUtil.between(date, 8, 12), BitUtil.to(date, 8)) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), 0); - - position.setValid(true); - position.setLatitude(convertCoordinate(buf.readInt())); - position.setLongitude(convertCoordinate(buf.readInt())); - - position.setAltitude(UnitsConverter.metersFromFeet(buf.readShort())); - position.setCourse(buf.readUnsignedShort()); - position.setSpeed(UnitsConverter.knotsFromMph(buf.readUnsignedByte())); - - position.set(Position.KEY_POWER, buf.readUnsignedByte() * 0.1); - position.set(Position.PREFIX_IO + 1, buf.readUnsignedByte()); - - dateBuilder.setSecond(buf.readUnsignedByte()); - position.setTime(dateBuilder.getDate()); - - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - - int index = buf.readUnsignedByte(); - - position.set(Position.KEY_VERSION_FW, buf.readUnsignedByte()); - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - position.set(Position.KEY_ODOMETER, (long) (buf.readUnsignedInt() * 1609.34)); - - if (channel != null && BitUtil.check(flags, 7)) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeByte(MSG_ACKNOWLEDGEMENT); - response.writeByte(index); - response.writeByte(0x00); - channel.write(response, remoteAddress); - } - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - if (buf.getUnsignedByte(buf.readerIndex()) == 0x7e) { - return decodeArMessage(channel, remoteAddress, buf); - } else { - return decodeMgMessage(channel, remoteAddress, buf); - } - } - -} diff --git a/src/org/traccar/protocol/OrionFrameDecoder.java b/src/org/traccar/protocol/OrionFrameDecoder.java deleted file mode 100644 index f7371747a..000000000 --- a/src/org/traccar/protocol/OrionFrameDecoder.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2014 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class OrionFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - int length = 6; - - if (buf.readableBytes() >= length) { - - int type = buf.getUnsignedByte(buf.readerIndex() + 2) & 0x0f; - - if (type == OrionProtocolDecoder.MSG_USERLOG && buf.readableBytes() >= length + 5) { - - int index = buf.readerIndex() + 3; - int count = buf.getUnsignedByte(index) & 0x0f; - index += 5; - length += 5; - - for (int i = 0; i < count; i++) { - if (buf.readableBytes() < length) { - return null; - } - int logLength = buf.getUnsignedByte(index + 1); - index += logLength; - length += logLength; - } - - if (buf.readableBytes() >= length) { - return buf.readBytes(length); - } - - } else if (type == OrionProtocolDecoder.MSG_SYSLOG && buf.readableBytes() >= length + 12) { - - length += buf.getUnsignedShort(buf.readerIndex() + 8); - if (buf.readableBytes() >= length) { - return buf.readBytes(length); - } - - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/OrionProtocol.java b/src/org/traccar/protocol/OrionProtocol.java deleted file mode 100644 index f4bfef985..000000000 --- a/src/org/traccar/protocol/OrionProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class OrionProtocol extends BaseProtocol { - - public OrionProtocol() { - super("orion"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new OrionFrameDecoder()); - pipeline.addLast("objectDecoder", new OrionProtocolDecoder(OrionProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/OrionProtocolDecoder.java b/src/org/traccar/protocol/OrionProtocolDecoder.java deleted file mode 100644 index c65924337..000000000 --- a/src/org/traccar/protocol/OrionProtocolDecoder.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2014 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.LinkedList; -import java.util.List; - -public class OrionProtocolDecoder extends BaseProtocolDecoder { - - public OrionProtocolDecoder(OrionProtocol protocol) { - super(protocol); - } - - public static final int MSG_USERLOG = 0; - public static final int MSG_SYSLOG = 3; - - private static void sendResponse(Channel channel, ChannelBuffer buf) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.directBuffer(4); - response.writeByte('*'); - response.writeShort(buf.getUnsignedShort(buf.writerIndex() - 2)); - response.writeByte(buf.getUnsignedByte(buf.writerIndex() - 3)); - channel.write(response); - } - } - - private static double convertCoordinate(int raw) { - int degrees = raw / 1000000; - double minutes = (raw % 1000000) / 10000.0; - return degrees + minutes / 60; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - int type = buf.readUnsignedByte() & 0x0f; - - if (type == MSG_USERLOG) { - - int header = buf.readUnsignedByte(); - - if ((header & 0x40) != 0) { - sendResponse(channel, buf); - } - - DeviceSession deviceSession = getDeviceSession( - channel, remoteAddress, String.valueOf(buf.readUnsignedInt())); - if (deviceSession == null) { - return null; - } - - List<Position> positions = new LinkedList<>(); - - for (int i = 0; i < (header & 0x0f); i++) { - - Position position = new Position(); - position.setDeviceId(deviceSession.getDeviceId()); - position.setProtocol(getProtocolName()); - - position.set(Position.KEY_EVENT, buf.readUnsignedByte()); - buf.readUnsignedByte(); // length - position.set(Position.KEY_FLAGS, buf.readUnsignedShort()); - - position.setLatitude(convertCoordinate(buf.readInt())); - position.setLongitude(convertCoordinate(buf.readInt())); - position.setAltitude(buf.readShort() / 10.0); - position.setCourse(buf.readUnsignedShort()); - position.setSpeed(buf.readUnsignedShort() * 0.0539957); - - DateBuilder dateBuilder = new DateBuilder() - .setDate(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - position.setTime(dateBuilder.getDate()); - - int satellites = buf.readUnsignedByte(); - position.setValid(satellites >= 3); - position.set(Position.KEY_SATELLITES, satellites); - - positions.add(position); - } - - return positions; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/OsmAndProtocol.java b/src/org/traccar/protocol/OsmAndProtocol.java deleted file mode 100644 index 785f4bd75..000000000 --- a/src/org/traccar/protocol/OsmAndProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.http.HttpRequestDecoder; -import org.jboss.netty.handler.codec.http.HttpResponseEncoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class OsmAndProtocol extends BaseProtocol { - - public OsmAndProtocol() { - super("osmand"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("httpEncoder", new HttpResponseEncoder()); - pipeline.addLast("httpDecoder", new HttpRequestDecoder()); - pipeline.addLast("objectDecoder", new OsmAndProtocolDecoder(OsmAndProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/OsmAndProtocolDecoder.java b/src/org/traccar/protocol/OsmAndProtocolDecoder.java deleted file mode 100644 index 15a71c88b..000000000 --- a/src/org/traccar/protocol/OsmAndProtocolDecoder.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * 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.jboss.netty.handler.codec.http.DefaultHttpResponse; -import org.jboss.netty.handler.codec.http.HttpHeaders; -import org.jboss.netty.handler.codec.http.HttpRequest; -import org.jboss.netty.handler.codec.http.HttpResponse; -import org.jboss.netty.handler.codec.http.HttpResponseStatus; -import org.jboss.netty.handler.codec.http.HttpVersion; -import org.jboss.netty.handler.codec.http.QueryStringDecoder; -import org.joda.time.format.ISODateTimeFormat; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import java.util.Map; - -public class OsmAndProtocolDecoder extends BaseProtocolDecoder { - - public OsmAndProtocolDecoder(OsmAndProtocol protocol) { - super(protocol); - } - - private void sendResponse(Channel channel, HttpResponseStatus status) { - if (channel != null) { - HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, status); - response.headers().add(HttpHeaders.Names.CONTENT_LENGTH, 0); - channel.write(response); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - HttpRequest request = (HttpRequest) msg; - QueryStringDecoder decoder = new QueryStringDecoder(request.getUri()); - Map<String, List<String>> params = decoder.getParameters(); - if (params.isEmpty()) { - decoder = new QueryStringDecoder(request.getContent().toString(StandardCharsets.US_ASCII), false); - params = decoder.getParameters(); - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setValid(true); - - for (Map.Entry<String, List<String>> entry : params.entrySet()) { - String value = entry.getValue().get(0); - switch (entry.getKey()) { - case "id": - case "deviceid": - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, value); - if (deviceSession == null) { - sendResponse(channel, HttpResponseStatus.BAD_REQUEST); - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - break; - case "valid": - position.setValid(Boolean.parseBoolean(value)); - break; - case "timestamp": - try { - long timestamp = Long.parseLong(value); - if (timestamp < Integer.MAX_VALUE) { - timestamp *= 1000; - } - position.setTime(new Date(timestamp)); - } catch (NumberFormatException error) { - if (value.contains("T")) { - position.setTime(new Date( - ISODateTimeFormat.dateTimeParser().parseMillis(value))); - } else { - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - position.setTime(dateFormat.parse(value)); - } - } - break; - case "lat": - position.setLatitude(Double.parseDouble(value)); - break; - case "lon": - position.setLongitude(Double.parseDouble(value)); - break; - case "location": - String[] location = value.split(","); - position.setLatitude(Double.parseDouble(location[0])); - position.setLongitude(Double.parseDouble(location[1])); - break; - case "speed": - position.setSpeed(convertSpeed(Double.parseDouble(value), "kn")); - break; - case "bearing": - case "heading": - position.setCourse(Double.parseDouble(value)); - break; - case "altitude": - position.setAltitude(Double.parseDouble(value)); - break; - case "accuracy": - position.setAccuracy(Double.parseDouble(value)); - break; - case "hdop": - position.set(Position.KEY_HDOP, Double.parseDouble(value)); - break; - case "batt": - position.set(Position.KEY_BATTERY_LEVEL, Double.parseDouble(value)); - break; - case "driverUniqueId": - position.set(Position.KEY_DRIVER_UNIQUE_ID, value); - break; - default: - try { - position.set(entry.getKey(), Double.parseDouble(value)); - } catch (NumberFormatException e) { - switch (value) { - case "true": - position.set(entry.getKey(), true); - break; - case "false": - position.set(entry.getKey(), false); - break; - default: - position.set(entry.getKey(), value); - break; - } - } - break; - } - } - - if (position.getFixTime() == null) { - position.setTime(new Date()); - } - - if (position.getDeviceId() != 0) { - sendResponse(channel, HttpResponseStatus.OK); - return position; - } else { - sendResponse(channel, HttpResponseStatus.BAD_REQUEST); - return null; - } - } - -} diff --git a/src/org/traccar/protocol/OwnTracksProtocol.java b/src/org/traccar/protocol/OwnTracksProtocol.java deleted file mode 100644 index c4a6ab163..000000000 --- a/src/org/traccar/protocol/OwnTracksProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2017 Jan-Piet Mens (jpmens@gmail.com) - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.http.HttpRequestDecoder; -import org.jboss.netty.handler.codec.http.HttpResponseEncoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class OwnTracksProtocol extends BaseProtocol { - - public OwnTracksProtocol() { - super("owntracks"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("httpEncoder", new HttpResponseEncoder()); - pipeline.addLast("httpDecoder", new HttpRequestDecoder()); - pipeline.addLast("objectDecoder", new OwnTracksProtocolDecoder(OwnTracksProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/OwnTracksProtocolDecoder.java b/src/org/traccar/protocol/OwnTracksProtocolDecoder.java deleted file mode 100644 index f3284d9e2..000000000 --- a/src/org/traccar/protocol/OwnTracksProtocolDecoder.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2017 Jan-Piet Mens (jpmens@gmail.com) - * Copyright 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.jboss.netty.handler.codec.http.DefaultHttpResponse; -import org.jboss.netty.handler.codec.http.HttpHeaders; -import org.jboss.netty.handler.codec.http.HttpRequest; -import org.jboss.netty.handler.codec.http.HttpResponse; -import org.jboss.netty.handler.codec.http.HttpResponseStatus; -import org.jboss.netty.handler.codec.http.HttpVersion; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.model.Position; -import org.traccar.helper.UnitsConverter; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; - -import java.io.StringReader; -import javax.json.Json; -import javax.json.JsonObject; - -public class OwnTracksProtocolDecoder extends BaseProtocolDecoder { - - public OwnTracksProtocolDecoder(OwnTracksProtocol protocol) { - super(protocol); - } - - private void sendResponse(Channel channel, HttpResponseStatus status) { - if (channel != null) { - HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, status); - response.headers().add(HttpHeaders.Names.CONTENT_LENGTH, 0); - channel.write(response); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - HttpRequest request = (HttpRequest) msg; - JsonObject root = Json.createReader( - new StringReader(request.getContent().toString(StandardCharsets.US_ASCII))).readObject(); - - if (!root.containsKey("_type") || !root.getString("_type").equals("location")) { - sendResponse(channel, HttpResponseStatus.OK); - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setValid(true); - - position.setLatitude(root.getJsonNumber("lat").doubleValue()); - position.setLongitude(root.getJsonNumber("lon").doubleValue()); - - if (root.containsKey("vel")) { - position.setSpeed(UnitsConverter.knotsFromKph(root.getInt("vel"))); - } - if (root.containsKey("alt")) { - position.setAltitude(root.getInt("alt")); - } - if (root.containsKey("cog")) { - position.setCourse(root.getInt("cog")); - } - if (root.containsKey("acc")) { - position.setAccuracy(root.getInt("acc")); - } - if (root.containsKey("t")) { - position.set("t", root.getString("t")); - } - if (root.containsKey("batt")) { - position.set(Position.KEY_BATTERY, root.getInt("batt")); - } - - position.setTime(new Date(root.getJsonNumber("tst").longValue() * 1000)); - - String uniqueId; - - if (root.containsKey("topic")) { - uniqueId = root.getString("topic"); - if (root.containsKey("tid")) { - position.set("tid", root.getString("tid")); - } - } else { - uniqueId = root.getString("tid"); - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, uniqueId); - if (deviceSession == null) { - sendResponse(channel, HttpResponseStatus.BAD_REQUEST); - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - sendResponse(channel, HttpResponseStatus.OK); - return position; - } -} diff --git a/src/org/traccar/protocol/PathAwayProtocol.java b/src/org/traccar/protocol/PathAwayProtocol.java deleted file mode 100644 index a41692750..000000000 --- a/src/org/traccar/protocol/PathAwayProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.http.HttpRequestDecoder; -import org.jboss.netty.handler.codec.http.HttpResponseEncoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class PathAwayProtocol extends BaseProtocol { - - public PathAwayProtocol() { - super("pathaway"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("httpEncoder", new HttpResponseEncoder()); - pipeline.addLast("httpDecoder", new HttpRequestDecoder()); - pipeline.addLast("objectDecoder", new PathAwayProtocolDecoder(PathAwayProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/PathAwayProtocolDecoder.java b/src/org/traccar/protocol/PathAwayProtocolDecoder.java deleted file mode 100644 index 1c4531612..000000000 --- a/src/org/traccar/protocol/PathAwayProtocolDecoder.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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.channel.Channel; -import org.jboss.netty.channel.ChannelFutureListener; -import org.jboss.netty.handler.codec.http.DefaultHttpResponse; -import org.jboss.netty.handler.codec.http.HttpRequest; -import org.jboss.netty.handler.codec.http.HttpResponse; -import org.jboss.netty.handler.codec.http.HttpResponseStatus; -import org.jboss.netty.handler.codec.http.HttpVersion; -import org.jboss.netty.handler.codec.http.QueryStringDecoder; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class PathAwayProtocolDecoder extends BaseProtocolDecoder { - - public PathAwayProtocolDecoder(PathAwayProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$PWS,") - .number("d+,") // version - .expression("[^,]*,") // name - .expression("[^,]*,") // icon - .expression("[^,]*,") // color - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(-?d+.?d*),") // altitude - .number("(-?d+.?d*),") // speed - .number("(-?d+.?d*),") // course - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - HttpRequest request = (HttpRequest) msg; - QueryStringDecoder decoder = new QueryStringDecoder(request.getUri()); - - DeviceSession deviceSession = getDeviceSession( - channel, remoteAddress, decoder.getParameters().get("UserName").get(0)); - if (deviceSession == null) { - return null; - } - - Parser parser = new Parser(PATTERN, decoder.getParameters().get("LOC").get(0)); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setValid(true); - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - if (channel != null) { - HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK); - channel.write(response).addListener(ChannelFutureListener.CLOSE); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/PiligrimProtocol.java b/src/org/traccar/protocol/PiligrimProtocol.java deleted file mode 100644 index a2960f762..000000000 --- a/src/org/traccar/protocol/PiligrimProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.http.HttpChunkAggregator; -import org.jboss.netty.handler.codec.http.HttpRequestDecoder; -import org.jboss.netty.handler.codec.http.HttpResponseEncoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class PiligrimProtocol extends BaseProtocol { - - public PiligrimProtocol() { - super("piligrim"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("httpEncoder", new HttpResponseEncoder()); - pipeline.addLast("httpDecoder", new HttpRequestDecoder()); - pipeline.addLast("httpAggregator", new HttpChunkAggregator(16384)); - pipeline.addLast("objectDecoder", new PiligrimProtocolDecoder(PiligrimProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/PiligrimProtocolDecoder.java b/src/org/traccar/protocol/PiligrimProtocolDecoder.java deleted file mode 100644 index 9d5bb9e24..000000000 --- a/src/org/traccar/protocol/PiligrimProtocolDecoder.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2014 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.handler.codec.http.DefaultHttpResponse; -import org.jboss.netty.handler.codec.http.HttpRequest; -import org.jboss.netty.handler.codec.http.HttpResponse; -import org.jboss.netty.handler.codec.http.HttpResponseStatus; -import org.jboss.netty.handler.codec.http.HttpVersion; -import org.jboss.netty.handler.codec.http.QueryStringDecoder; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.LinkedList; -import java.util.List; - -public class PiligrimProtocolDecoder extends BaseProtocolDecoder { - - public PiligrimProtocolDecoder(PiligrimProtocol protocol) { - super(protocol); - } - - private void sendResponse(Channel channel, String message) { - if (channel != null) { - HttpResponse response = new DefaultHttpResponse( - HttpVersion.HTTP_1_1, HttpResponseStatus.OK); - response.setContent(ChannelBuffers.copiedBuffer( - ByteOrder.BIG_ENDIAN, message, StandardCharsets.US_ASCII)); - channel.write(response); - } - } - - public static final int MSG_GPS = 0xF1; - public static final int MSG_GPS_SENSORS = 0xF2; - public static final int MSG_EVENTS = 0xF3; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - HttpRequest request = (HttpRequest) msg; - String uri = request.getUri(); - - if (uri.startsWith("/config")) { - - sendResponse(channel, "CONFIG: OK"); - - } else if (uri.startsWith("/addlog")) { - - sendResponse(channel, "ADDLOG: OK"); - - } else if (uri.startsWith("/inform")) { - - sendResponse(channel, "INFORM: OK"); - - } else if (uri.startsWith("/bingps")) { - - sendResponse(channel, "BINGPS: OK"); - - QueryStringDecoder decoder = new QueryStringDecoder(request.getUri()); - DeviceSession deviceSession = getDeviceSession( - channel, remoteAddress, decoder.getParameters().get("imei").get(0)); - if (deviceSession == null) { - return null; - } - - List<Position> positions = new LinkedList<>(); - ChannelBuffer buf = request.getContent(); - - while (buf.readableBytes() > 2) { - - buf.readUnsignedByte(); // header - int type = buf.readUnsignedByte(); - buf.readUnsignedByte(); // length - - if (type == MSG_GPS || type == MSG_GPS_SENSORS) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setDay(buf.readUnsignedByte()) - .setMonth(buf.getByte(buf.readerIndex()) & 0x0f) - .setYear(2010 + (buf.readUnsignedByte() >> 4)) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - position.setTime(dateBuilder.getDate()); - - double latitude = buf.readUnsignedByte(); - latitude += buf.readUnsignedByte() / 60.0; - latitude += buf.readUnsignedByte() / 6000.0; - latitude += buf.readUnsignedByte() / 600000.0; - - double longitude = buf.readUnsignedByte(); - longitude += buf.readUnsignedByte() / 60.0; - longitude += buf.readUnsignedByte() / 6000.0; - longitude += buf.readUnsignedByte() / 600000.0; - - int flags = buf.readUnsignedByte(); - if (BitUtil.check(flags, 0)) { - latitude = -latitude; - } - if (BitUtil.check(flags, 1)) { - longitude = -longitude; - } - position.setLatitude(latitude); - position.setLongitude(longitude); - - int satellites = buf.readUnsignedByte(); - position.set(Position.KEY_SATELLITES, satellites); - position.setValid(satellites >= 3); - - position.setSpeed(buf.readUnsignedByte()); - - double course = buf.readUnsignedByte() << 1; - course += (flags >> 2) & 1; - course += buf.readUnsignedByte() / 100.0; - position.setCourse(course); - - if (type == MSG_GPS_SENSORS) { - double power = buf.readUnsignedByte(); - power += buf.readUnsignedByte() << 8; - position.set(Position.KEY_POWER, power * 0.01); - - double battery = buf.readUnsignedByte(); - battery += buf.readUnsignedByte() << 8; - position.set(Position.KEY_BATTERY, battery * 0.01); - - buf.skipBytes(6); - } - - positions.add(position); - - } else if (type == MSG_EVENTS) { - - buf.skipBytes(13); - } - } - - return positions; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/PretraceProtocol.java b/src/org/traccar/protocol/PretraceProtocol.java deleted file mode 100644 index 8f0a22851..000000000 --- a/src/org/traccar/protocol/PretraceProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 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.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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class PretraceProtocol extends BaseProtocol { - - public PretraceProtocol() { - super("pretrace"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, ')')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new PretraceProtocolDecoder(PretraceProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/PretraceProtocolDecoder.java b/src/org/traccar/protocol/PretraceProtocolDecoder.java deleted file mode 100644 index 77d94068f..000000000 --- a/src/org/traccar/protocol/PretraceProtocolDecoder.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 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.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 PretraceProtocolDecoder extends BaseProtocolDecoder { - - public PretraceProtocolDecoder(PretraceProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("(") - .number("(d{15})") // imei - .number("Uddd") // type - .number("d") // gps type - .expression("([AV])") // validity - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd)") // time (hhmmss) - .number("(dd)(dd.dddd)") // latitude - .expression("([NS])") - .number("(ddd)(dd.dddd)") // longitude - .expression("([EW])") - .number("(ddd)") // speed - .number("(ddd)") // course - .number("(xxx)") // altitude - .number("(x{8})") // odometer - .number("(x)") // satellites - .number("(dd)") // hdop - .number("(dd)") // gsm - .expression("(.{8})") // state - .any() - .text("^") - .number("xx") // checksum - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(parser.next().equals("A")); - - position.setTime(parser.nextDateTime()); - - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextInt(0))); - position.setCourse(parser.nextInt(0)); - position.setAltitude(parser.nextHexInt(0)); - - position.set(Position.KEY_ODOMETER, parser.nextHexInt(0)); - position.set(Position.KEY_SATELLITES, parser.nextHexInt(0)); - position.set(Position.KEY_HDOP, parser.nextInt(0)); - position.set(Position.KEY_RSSI, parser.nextInt(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/PricolProtocol.java b/src/org/traccar/protocol/PricolProtocol.java deleted file mode 100644 index 0005dc3c1..000000000 --- a/src/org/traccar/protocol/PricolProtocol.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 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.bootstrap.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.FixedLengthFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class PricolProtocol extends BaseProtocol { - - public PricolProtocol() { - super("pricol"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new FixedLengthFrameDecoder(64)); - pipeline.addLast("objectDecoder", new PricolProtocolDecoder(PricolProtocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectDecoder", new PricolProtocolDecoder(PricolProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/PricolProtocolDecoder.java b/src/org/traccar/protocol/PricolProtocolDecoder.java deleted file mode 100644 index a33e19b90..000000000 --- a/src/org/traccar/protocol/PricolProtocolDecoder.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; - -public class PricolProtocolDecoder extends BaseProtocolDecoder { - - public PricolProtocolDecoder(PricolProtocol protocol) { - super(protocol); - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.readUnsignedByte(); // header - - DeviceSession deviceSession = getDeviceSession( - channel, remoteAddress, buf.readBytes(7).toString(StandardCharsets.US_ASCII)); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set("eventType", buf.readUnsignedByte()); - position.set("packetVersion", buf.readUnsignedByte()); - position.set(Position.KEY_STATUS, buf.readUnsignedByte()); - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - position.set(Position.KEY_GPS, buf.readUnsignedByte()); - - position.setTime(new DateBuilder() - .setDateReverse(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()).getDate()); - - position.setValid(true); - - double lat = buf.getUnsignedShort(buf.readerIndex()) / 100; - lat += (buf.readUnsignedShort() % 100 * 10000 + buf.readUnsignedShort()) / 600000.0; - position.setLatitude(buf.readUnsignedByte() == 'S' ? -lat : lat); - - double lon = buf.getUnsignedMedium(buf.readerIndex()) / 100; - lon += (buf.readUnsignedMedium() % 100 * 10000 + buf.readUnsignedShort()) / 600000.0; - position.setLongitude(buf.readUnsignedByte() == 'W' ? -lon : lon); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - - position.set(Position.KEY_INPUT, buf.readUnsignedShort()); - position.set(Position.KEY_OUTPUT, buf.readUnsignedByte()); - - position.set("analogAlerts", buf.readUnsignedByte()); - position.set("customAlertTypes", buf.readUnsignedShort()); - - for (int i = 1; i <= 5; i++) { - position.set(Position.PREFIX_ADC + i, buf.readUnsignedShort()); - } - - position.set(Position.KEY_ODOMETER, buf.readUnsignedMedium()); - position.set(Position.KEY_RPM, buf.readUnsignedShort()); - - if (channel != null) { - channel.write(ChannelBuffers.copiedBuffer("ACK", StandardCharsets.US_ASCII), remoteAddress); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/ProgressProtocol.java b/src/org/traccar/protocol/ProgressProtocol.java deleted file mode 100644 index 6e2093346..000000000 --- a/src/org/traccar/protocol/ProgressProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class ProgressProtocol extends BaseProtocol { - - public ProgressProtocol() { - super("progress"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2, 2, 4, 0)); - pipeline.addLast("objectDecoder", new ProgressProtocolDecoder(ProgressProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/ProgressProtocolDecoder.java b/src/org/traccar/protocol/ProgressProtocolDecoder.java deleted file mode 100644 index 1820ea926..000000000 --- a/src/org/traccar/protocol/ProgressProtocolDecoder.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright 2012 - 2014 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class ProgressProtocolDecoder extends BaseProtocolDecoder { - - private long lastIndex; - private long newIndex; - - public ProgressProtocolDecoder(ProgressProtocol protocol) { - super(protocol); - } - - public static final int MSG_NULL = 0; - public static final int MSG_IDENT = 1; - public static final int MSG_IDENT_FULL = 2; - public static final int MSG_POINT = 10; - public static final int MSG_LOG_SYNC = 100; - public static final int MSG_LOGMSG = 101; - public static final int MSG_TEXT = 102; - public static final int MSG_ALARM = 200; - public static final int MSG_ALARM_RECIEVED = 201; - - private void requestArchive(Channel channel) { - if (lastIndex == 0) { - lastIndex = newIndex; - } else if (newIndex > lastIndex) { - ChannelBuffer request = ChannelBuffers.directBuffer(ByteOrder.LITTLE_ENDIAN, 12); - request.writeShort(MSG_LOG_SYNC); - request.writeShort(4); - request.writeInt((int) lastIndex); - request.writeInt(0); - channel.write(request); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - int type = buf.readUnsignedShort(); - buf.readUnsignedShort(); // length - - if (type == MSG_IDENT || type == MSG_IDENT_FULL) { - - buf.readUnsignedInt(); // id - int length = buf.readUnsignedShort(); - buf.skipBytes(length); - length = buf.readUnsignedShort(); - buf.skipBytes(length); - length = buf.readUnsignedShort(); - String imei = buf.readBytes(length).toString(StandardCharsets.US_ASCII); - getDeviceSession(channel, remoteAddress, imei); - - } else if (type == MSG_POINT || type == MSG_ALARM || type == MSG_LOGMSG) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - List<Position> positions = new LinkedList<>(); - - int recordCount = 1; - if (type == MSG_LOGMSG) { - recordCount = buf.readUnsignedShort(); - } - - for (int j = 0; j < recordCount; j++) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - if (type == MSG_LOGMSG) { - position.set(Position.KEY_ARCHIVE, true); - int subtype = buf.readUnsignedShort(); - if (subtype == MSG_ALARM) { - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - } - if (buf.readUnsignedShort() > buf.readableBytes()) { - lastIndex += 1; - break; // workaround for device bug - } - lastIndex = buf.readUnsignedInt(); - position.set(Position.KEY_INDEX, lastIndex); - } else { - newIndex = buf.readUnsignedInt(); - } - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - position.setLatitude(buf.readInt() * 180.0 / 0x7FFFFFFF); - position.setLongitude(buf.readInt() * 180.0 / 0x7FFFFFFF); - position.setSpeed(buf.readUnsignedInt() * 0.01); - position.setCourse(buf.readUnsignedShort() * 0.01); - position.setAltitude(buf.readUnsignedShort() * 0.01); - - int satellites = buf.readUnsignedByte(); - position.setValid(satellites >= 3); - position.set(Position.KEY_SATELLITES, satellites); - - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - - long extraFlags = buf.readLong(); - - if (BitUtil.check(extraFlags, 0)) { - int count = buf.readUnsignedShort(); - for (int i = 1; i <= count; i++) { - position.set(Position.PREFIX_ADC + i, buf.readUnsignedShort()); - } - } - - if (BitUtil.check(extraFlags, 1)) { - int size = buf.readUnsignedShort(); - position.set("can", buf.toString(buf.readerIndex(), size, StandardCharsets.US_ASCII)); - buf.skipBytes(size); - } - - if (BitUtil.check(extraFlags, 2)) { - position.set("passenger", - ChannelBuffers.hexDump(buf.readBytes(buf.readUnsignedShort()))); - } - - if (type == MSG_ALARM) { - position.set(Position.KEY_ALARM, true); - byte[] response = {(byte) 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - channel.write(ChannelBuffers.wrappedBuffer(response)); - } - - buf.readUnsignedInt(); // crc - - positions.add(position); - } - - requestArchive(channel); - - return positions; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Pt3000Protocol.java b/src/org/traccar/protocol/Pt3000Protocol.java deleted file mode 100644 index 9c9da3301..000000000 --- a/src/org/traccar/protocol/Pt3000Protocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class Pt3000Protocol extends BaseProtocol { - - public Pt3000Protocol() { - super("pt3000"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, 'd')); // probably wrong - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new Pt3000ProtocolDecoder(Pt3000Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Pt3000ProtocolDecoder.java b/src/org/traccar/protocol/Pt3000ProtocolDecoder.java deleted file mode 100644 index c36be7976..000000000 --- a/src/org/traccar/protocol/Pt3000ProtocolDecoder.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2013 - 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class Pt3000ProtocolDecoder extends BaseProtocolDecoder { - - public Pt3000ProtocolDecoder(Pt3000Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("%(d+),") // imei - .text("$GPRMC,") - .number("(dd)(dd)(dd).?d*,") // time (hhmmss) - .expression("([AV]),") // validity - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*)?,") // speed - .number("(d+.?d*)?,") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/Pt502FrameDecoder.java b/src/org/traccar/protocol/Pt502FrameDecoder.java deleted file mode 100644 index 252c8dd02..000000000 --- a/src/org/traccar/protocol/Pt502FrameDecoder.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2014 - 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class Pt502FrameDecoder extends FrameDecoder { - - private static final int BINARY_HEADER = 5; - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < BINARY_HEADER) { - return null; - } - - if (buf.getUnsignedByte(buf.readerIndex()) == 0xbf) { - buf.skipBytes(BINARY_HEADER); - } - - int index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '\r'); - if (index < 0) { - index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '\n'); - } - - if (index > 0) { - ChannelBuffer result = buf.readBytes(index - buf.readerIndex()); - while (buf.readable() - && (buf.getByte(buf.readerIndex()) == '\r' || buf.getByte(buf.readerIndex()) == '\n')) { - buf.skipBytes(1); - } - return result; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Pt502Protocol.java b/src/org/traccar/protocol/Pt502Protocol.java deleted file mode 100644 index 0116422c2..000000000 --- a/src/org/traccar/protocol/Pt502Protocol.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2015 - 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.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.nio.ByteOrder; -import java.util.List; - -public class Pt502Protocol extends BaseProtocol { - - public Pt502Protocol() { - super("pt502"); - setSupportedDataCommands( - Command.TYPE_CUSTOM, - Command.TYPE_SET_TIMEZONE, - Command.TYPE_ALARM_SPEED, - Command.TYPE_OUTPUT_CONTROL, - Command.TYPE_REQUEST_PHOTO); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new Pt502FrameDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectEncoder", new Pt502ProtocolEncoder()); - pipeline.addLast("objectDecoder", new Pt502ProtocolDecoder(Pt502Protocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/Pt502ProtocolDecoder.java b/src/org/traccar/protocol/Pt502ProtocolDecoder.java deleted file mode 100644 index 1d976dcd5..000000000 --- a/src/org/traccar/protocol/Pt502ProtocolDecoder.java +++ /dev/null @@ -1,148 +0,0 @@ -/*
- * Copyright 2012 - 2017 Anton Tananaev (anton@traccar.org)
- * Copyright 2012 Luis Parada (luis.parada@gmail.com)
- *
- * 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.helper.DateBuilder;
-import org.traccar.helper.Parser;
-import org.traccar.helper.PatternBuilder;
-import org.traccar.model.Position;
-
-import java.net.SocketAddress;
-import java.util.regex.Pattern;
-
-public class Pt502ProtocolDecoder extends BaseProtocolDecoder {
-
- private static final int MAX_CHUNK_SIZE = 960;
-
- private byte[] photo;
-
- public Pt502ProtocolDecoder(Pt502Protocol protocol) {
- super(protocol);
- }
-
- private static final Pattern PATTERN = new PatternBuilder()
- .any().text("$")
- .expression("([^,]+),") // type
- .number("(d+),") // id
- .number("(dd)(dd)(dd).(ddd),") // time (hhmmss.sss)
- .expression("([AV]),") // validity
- .number("(d+)(dd.dddd),") // latitude
- .expression("([NS]),")
- .number("(d+)(dd.dddd),") // longitude
- .expression("([EW]),")
- .number("(d+.d+)?,") // speed
- .number("(d+.d+)?,") // course
- .number("(dd)(dd)(dd),,,") // date (ddmmyy)
- .expression("./")
- .expression("([01])+,") // input
- .expression("([01])+/") // output
- .expression("([^/]+)?/") // adc
- .number("(d+)") // odometer
- .expression("/([^/]+)?/") // rfid
- .number("(xxx)").optional(2) // state
- .any()
- .compile();
-
- private String decodeAlarm(String value) {
- switch (value) {
- case "IN1":
- return Position.ALARM_SOS;
- case "GOF":
- return Position.ALARM_GEOFENCE;
- case "TOW":
- return Position.ALARM_TOW;
- case "HDA":
- return Position.ALARM_ACCELERATION;
- case "HDB":
- return Position.ALARM_BRAKING;
- case "FDA":
- return Position.ALARM_FATIGUE_DRIVING;
- case "SKA":
- return Position.ALARM_VIBRATION;
- case "PMA":
- return Position.ALARM_MOVEMENT;
- default:
- return null;
- }
- }
-
- @Override
- protected Object decode(
- Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
-
- Parser parser = new Parser(PATTERN, (String) msg);
- if (!parser.matches()) {
- return null;
- }
-
- Position position = new Position();
- position.setProtocol(getProtocolName());
-
- String type = parser.next();
-
- if (type.startsWith("PHO") && channel != null) {
- photo = new byte[Integer.parseInt(type.substring(3))];
- channel.write("#PHD0," + Math.min(photo.length, MAX_CHUNK_SIZE) + "\r\n");
- }
-
- position.set(Position.KEY_ALARM, decodeAlarm(type));
-
- DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next());
- if (deviceSession == null) {
- return null;
- }
- position.setDeviceId(deviceSession.getDeviceId());
-
- DateBuilder dateBuilder = new DateBuilder()
- .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0), parser.nextInt(0));
-
- position.setValid(parser.next().equals("A"));
- position.setLatitude(parser.nextCoordinate());
- position.setLongitude(parser.nextCoordinate());
- position.setSpeed(parser.nextDouble(0));
- position.setCourse(parser.nextDouble(0));
-
- dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0));
- position.setTime(dateBuilder.getDate());
-
- position.set(Position.KEY_INPUT, parser.next());
- position.set(Position.KEY_OUTPUT, parser.next());
-
- if (parser.hasNext()) {
- String[] values = parser.next().split(",");
- for (int i = 0; i < values.length; i++) {
- position.set(Position.PREFIX_ADC + (i + 1), Integer.parseInt(values[i], 16));
- }
- }
-
- position.set(Position.KEY_ODOMETER, parser.nextInt(0));
- position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next());
-
- if (parser.hasNext()) {
- int value = parser.nextHexInt(0);
- position.set(Position.KEY_BATTERY, value >> 8);
- position.set(Position.KEY_RSSI, (value >> 4) & 0xf);
- position.set(Position.KEY_SATELLITES, value & 0xf);
- }
-
- return position;
- }
-
-}
diff --git a/src/org/traccar/protocol/Pt502ProtocolEncoder.java b/src/org/traccar/protocol/Pt502ProtocolEncoder.java deleted file mode 100644 index bd56e306a..000000000 --- a/src/org/traccar/protocol/Pt502ProtocolEncoder.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2016 - 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 java.util.TimeZone; - -import org.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class Pt502ProtocolEncoder extends StringProtocolEncoder implements StringProtocolEncoder.ValueFormatter { - - @Override - public String formatValue(String key, Object value) { - if (key.equals(Command.KEY_TIMEZONE)) { - return String.valueOf(TimeZone.getTimeZone((String) value).getRawOffset() / 3600000); - } - - return null; - } - - @Override - protected String formatCommand(Command command, String format, String... keys) { - return formatCommand(command, format, this, keys); - } - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_CUSTOM: - return formatCommand(command, "{%s}\r\n", Command.KEY_DATA); - case Command.TYPE_OUTPUT_CONTROL: - return formatCommand(command, "#OPC{%s},{%s}\r\n", Command.KEY_INDEX, Command.KEY_DATA); - case Command.TYPE_SET_TIMEZONE: - return formatCommand(command, "#TMZ{%s}\r\n", Command.KEY_TIMEZONE); - case Command.TYPE_ALARM_SPEED: - return formatCommand(command, "#SPD{%s}\r\n", Command.KEY_DATA); - case Command.TYPE_REQUEST_PHOTO: - return formatCommand(command, "#PHO\r\n"); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/RaveonProtocol.java b/src/org/traccar/protocol/RaveonProtocol.java deleted file mode 100644 index e4e100e0b..000000000 --- a/src/org/traccar/protocol/RaveonProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2015 - 2016 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class RaveonProtocol extends BaseProtocol { - - public RaveonProtocol() { - super("raveon"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new RaveonProtocolDecoder(RaveonProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/RaveonProtocolDecoder.java b/src/org/traccar/protocol/RaveonProtocolDecoder.java deleted file mode 100644 index cbe6026a2..000000000 --- a/src/org/traccar/protocol/RaveonProtocolDecoder.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2016 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.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 RaveonProtocolDecoder extends BaseProtocolDecoder { - - public RaveonProtocolDecoder(RaveonProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$PRAVE,") - .number("(d+),") // id - .number("d+,") - .number("(-?)(d+)(dd.d+),") // latitude - .number("(-?)(d+)(dd.d+),") // longitude - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(d),") // validity - .number("(d+),") // satellites - .number("(-?d+),") // altitude - .number("(-?d+),") // temperature - .number("(d+.d+),") // power - .number("(d+),") // inputs - .number("(-?d+),") // gsm - .number("(d+),") // speed - .number("(d+),") // course - .expression("([PMACIVSX])?,") // status - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.HMS)); - - position.setValid(parser.nextInt(0) != 0); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - - position.setAltitude(parser.nextInt(0)); - - position.set(Position.PREFIX_TEMP + 1, parser.nextInt(0)); - position.set(Position.KEY_POWER, parser.nextDouble(0)); - position.set(Position.KEY_INPUT, parser.nextInt(0)); - position.set(Position.KEY_RSSI, parser.nextInt(0)); - - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextInt(0))); - position.setCourse(parser.nextInt(0)); - - position.set(Position.KEY_ALARM, parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/RecodaProtocol.java b/src/org/traccar/protocol/RecodaProtocol.java deleted file mode 100644 index daf167fd9..000000000 --- a/src/org/traccar/protocol/RecodaProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class RecodaProtocol extends BaseProtocol { - - public RecodaProtocol() { - super("recoda"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 4, 4, -8, 0)); - pipeline.addLast("objectDecoder", new RecodaProtocolDecoder(RecodaProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/RecodaProtocolDecoder.java b/src/org/traccar/protocol/RecodaProtocolDecoder.java deleted file mode 100644 index 8db582d35..000000000 --- a/src/org/traccar/protocol/RecodaProtocolDecoder.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; - -public class RecodaProtocolDecoder extends BaseProtocolDecoder { - - public RecodaProtocolDecoder(RecodaProtocol protocol) { - super(protocol); - } - - public static final int MSG_HEARTBEAT = 0x00001001; - public static final int MSG_REQUEST_RESPONSE = 0x20000001; - public static final int MSG_SIGNAL_LINK_REGISTRATION = 0x20001001; - public static final int MSG_EVENT_NOTICE = 0x20002001; - public static final int MSG_GPS_DATA = 0x20001011; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - int type = buf.readInt(); - buf.readUnsignedInt(); // length - - if (type != MSG_HEARTBEAT) { - buf.readUnsignedShort(); // version - buf.readUnsignedShort(); // index - } - - if (type == MSG_SIGNAL_LINK_REGISTRATION) { - - getDeviceSession(channel, remoteAddress, buf.readBytes(12).toString(StandardCharsets.US_ASCII)); - - } else if (type == MSG_GPS_DATA) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(new Date(buf.readLong())); - - int flags = buf.readUnsignedByte(); - - if (BitUtil.check(flags, 0)) { - - buf.readUnsignedShort(); // declination - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort())); - - position.setLongitude(buf.readUnsignedByte() + buf.readUnsignedByte() / 60.0); - position.setLatitude(buf.readUnsignedByte() + buf.readUnsignedByte() / 60.0); - - position.setLongitude(position.getLongitude() + buf.readUnsignedInt() / 3600.0); - position.setLatitude(position.getLatitude() + buf.readUnsignedInt() / 3600.0); - - int status = buf.readUnsignedByte(); - - position.setValid(BitUtil.check(status, 0)); - if (BitUtil.check(status, 1)) { - position.setLongitude(-position.getLongitude()); - } - if (!BitUtil.check(status, 2)) { - position.setLatitude(-position.getLatitude()); - } - - } else { - - getLastLocation(position, position.getDeviceTime()); - - } - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/RitiProtocol.java b/src/org/traccar/protocol/RitiProtocol.java deleted file mode 100644 index 0ff3ce87b..000000000 --- a/src/org/traccar/protocol/RitiProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class RitiProtocol extends BaseProtocol { - - public RitiProtocol() { - super("riti"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 105, 2, 3, 0)); - pipeline.addLast("objectDecoder", new RitiProtocolDecoder(RitiProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/RitiProtocolDecoder.java b/src/org/traccar/protocol/RitiProtocolDecoder.java deleted file mode 100644 index 5c298e8c5..000000000 --- a/src/org/traccar/protocol/RitiProtocolDecoder.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2014 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.regex.Pattern; - -public class RitiProtocolDecoder extends BaseProtocolDecoder { - - public RitiProtocolDecoder(RitiProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$GPRMC,") - .number("(dd)(dd)(dd).?d*,") // time (hhmmss) - .expression("([AV]),") // validity - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*)?,") // speed - .number("(d+.?d*)?,") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, String.valueOf(buf.readUnsignedShort())); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set("mode", buf.readUnsignedByte()); - position.set(Position.KEY_COMMAND, buf.readUnsignedByte()); - position.set(Position.KEY_POWER, buf.readUnsignedShort() * 0.001); - - buf.skipBytes(5); // status - buf.readUnsignedShort(); // idleCount - buf.readUnsignedShort(); // idleTime in seconds - - position.set(Position.KEY_DISTANCE, buf.readUnsignedInt()); - position.set(Position.KEY_ODOMETER_TRIP, buf.readUnsignedInt()); - - // Parse GPRMC - int end = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '*'); - String gprmc = buf.toString(buf.readerIndex(), end - buf.readerIndex(), StandardCharsets.US_ASCII); - Parser parser = new Parser(PATTERN, gprmc); - if (!parser.matches()) { - return null; - } - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/RuptelaProtocol.java b/src/org/traccar/protocol/RuptelaProtocol.java deleted file mode 100644 index fc3b17dd9..000000000 --- a/src/org/traccar/protocol/RuptelaProtocol.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2015 - 2016 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class RuptelaProtocol extends BaseProtocol { - - public RuptelaProtocol() { - super("ruptela"); - setSupportedDataCommands( - Command.TYPE_CUSTOM, - Command.TYPE_CONFIGURATION, - Command.TYPE_GET_VERSION, - Command.TYPE_FIRMWARE_UPDATE, - Command.TYPE_OUTPUT_CONTROL, - Command.TYPE_SET_CONNECTION, - Command.TYPE_SET_ODOMETER); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 0, 2, 2, 0)); - pipeline.addLast("objectEncoder", new RuptelaProtocolEncoder()); - pipeline.addLast("objectDecoder", new RuptelaProtocolDecoder(RuptelaProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/RuptelaProtocolDecoder.java b/src/org/traccar/protocol/RuptelaProtocolDecoder.java deleted file mode 100644 index 8752d30c0..000000000 --- a/src/org/traccar/protocol/RuptelaProtocolDecoder.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import javax.xml.bind.DatatypeConverter; -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class RuptelaProtocolDecoder extends BaseProtocolDecoder { - - public RuptelaProtocolDecoder(RuptelaProtocol protocol) { - super(protocol); - } - - public static final int MSG_RECORDS = 1; - public static final int MSG_DEVICE_CONFIGURATION = 2; - public static final int MSG_DEVICE_VERSION = 3; - public static final int MSG_FIRMWARE_UPDATE = 4; - public static final int MSG_SET_CONNECTION = 5; - public static final int MSG_SET_ODOMETER = 6; - public static final int MSG_SMS_VIA_GPRS_RESPONSE = 7; - public static final int MSG_SMS_VIA_GPRS = 8; - public static final int MSG_DTCS = 9; - public static final int MSG_SET_IO = 17; - public static final int MSG_EXTENDED_RECORDS = 68; - - private Position decodeCommandResponse(DeviceSession deviceSession, int type, ChannelBuffer buf) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, null); - - position.set(Position.KEY_TYPE, type); - - switch (type) { - case MSG_DEVICE_CONFIGURATION: - case MSG_DEVICE_VERSION: - case MSG_FIRMWARE_UPDATE: - case MSG_SMS_VIA_GPRS_RESPONSE: - position.set(Position.KEY_RESULT, - buf.toString(buf.readerIndex(), buf.readableBytes() - 2, StandardCharsets.US_ASCII).trim()); - return position; - case MSG_SET_IO: - position.set(Position.KEY_RESULT, - String.valueOf(buf.readUnsignedByte())); - return position; - default: - return null; - } - } - - private long readValue(ChannelBuffer buf, int length, boolean signed) { - switch (length) { - case 1: - return signed ? buf.readByte() : buf.readUnsignedByte(); - case 2: - return signed ? buf.readShort() : buf.readUnsignedShort(); - case 4: - return signed ? buf.readInt() : buf.readUnsignedInt(); - default: - return buf.readLong(); - } - } - - private void decodeParameter(Position position, int id, ChannelBuffer buf, int length) { - switch (id) { - case 2: - case 3: - case 4: - position.set("di" + (id - 1), readValue(buf, length, false)); - break; - case 5: - position.set(Position.KEY_IGNITION, readValue(buf, length, false) == 1); - break; - case 74: - position.set(Position.PREFIX_TEMP + 3, readValue(buf, length, true) * 0.1); - break; - case 78: - case 79: - case 80: - position.set(Position.PREFIX_TEMP + (id - 78), readValue(buf, length, true) * 0.1); - break; - default: - position.set(Position.PREFIX_IO + id, readValue(buf, length, false)); - break; - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.readUnsignedShort(); // data length - - String imei = String.format("%015d", buf.readLong()); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - - int type = buf.readUnsignedByte(); - - if (type == MSG_RECORDS || type == MSG_EXTENDED_RECORDS) { - - List<Position> positions = new LinkedList<>(); - - buf.readUnsignedByte(); // records left - int count = buf.readUnsignedByte(); - - for (int i = 0; i < count; i++) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - buf.readUnsignedByte(); // timestamp extension - - if (type == MSG_EXTENDED_RECORDS) { - buf.readUnsignedByte(); // record extension - } - - buf.readUnsignedByte(); // priority (reserved) - - position.setValid(true); - position.setLongitude(buf.readInt() / 10000000.0); - position.setLatitude(buf.readInt() / 10000000.0); - position.setAltitude(buf.readUnsignedShort() / 10.0); - position.setCourse(buf.readUnsignedShort() / 100.0); - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort())); - - position.set(Position.KEY_HDOP, buf.readUnsignedByte() / 10.0); - - if (type == MSG_EXTENDED_RECORDS) { - position.set(Position.KEY_EVENT, buf.readUnsignedShort()); - } else { - position.set(Position.KEY_EVENT, buf.readUnsignedByte()); - } - - // Read 1 byte data - int cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - int id = type == MSG_EXTENDED_RECORDS ? buf.readUnsignedShort() : buf.readUnsignedByte(); - decodeParameter(position, id, buf, 1); - } - - // Read 2 byte data - cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - int id = type == MSG_EXTENDED_RECORDS ? buf.readUnsignedShort() : buf.readUnsignedByte(); - decodeParameter(position, id, buf, 2); - } - - // Read 4 byte data - cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - int id = type == MSG_EXTENDED_RECORDS ? buf.readUnsignedShort() : buf.readUnsignedByte(); - decodeParameter(position, id, buf, 4); - } - - // Read 8 byte data - cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - int id = type == MSG_EXTENDED_RECORDS ? buf.readUnsignedShort() : buf.readUnsignedByte(); - decodeParameter(position, id, buf, 8); - } - - positions.add(position); - } - - if (channel != null) { - channel.write(ChannelBuffers.wrappedBuffer(DatatypeConverter.parseHexBinary("0002640113bc"))); - } - - return positions; - - } else if (type == MSG_DTCS) { - - List<Position> positions = new LinkedList<>(); - - int count = buf.readUnsignedByte(); - - for (int i = 0; i < count; i++) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - buf.readUnsignedByte(); // reserved - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - - position.setValid(true); - position.setLongitude(buf.readInt() / 10000000.0); - position.setLatitude(buf.readInt() / 10000000.0); - - if (buf.readUnsignedByte() == 2) { - position.set(Position.KEY_ARCHIVE, true); - } - - position.set(Position.KEY_DTCS, buf.readBytes(5).toString(StandardCharsets.US_ASCII)); - - positions.add(position); - } - - if (channel != null) { - channel.write(ChannelBuffers.wrappedBuffer(DatatypeConverter.parseHexBinary("00026d01c4a4"))); - } - - return positions; - - } else { - - return decodeCommandResponse(deviceSession, type, buf); - - } - } - -} diff --git a/src/org/traccar/protocol/RuptelaProtocolEncoder.java b/src/org/traccar/protocol/RuptelaProtocolEncoder.java deleted file mode 100644 index 564d80869..000000000 --- a/src/org/traccar/protocol/RuptelaProtocolEncoder.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2016 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Checksum; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import java.nio.charset.StandardCharsets; - -public class RuptelaProtocolEncoder extends BaseProtocolEncoder { - - private ChannelBuffer encodeContent(int type, ChannelBuffer content) { - - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); - - buf.writeShort(1 + content.readableBytes()); - buf.writeByte(100 + type); - buf.writeBytes(content); - buf.writeShort(Checksum.crc16(Checksum.CRC16_KERMIT, buf.toByteBuffer(2, buf.writerIndex() - 2))); - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - - ChannelBuffer content = ChannelBuffers.dynamicBuffer(); - - switch (command.getType()) { - case Command.TYPE_CUSTOM: - content.writeBytes(command.getString(Command.KEY_DATA).getBytes(StandardCharsets.US_ASCII)); - return encodeContent(RuptelaProtocolDecoder.MSG_SMS_VIA_GPRS, content); - case Command.TYPE_CONFIGURATION: - content.writeBytes((command.getString(Command.KEY_DATA) + "\r\n").getBytes(StandardCharsets.US_ASCII)); - return encodeContent(RuptelaProtocolDecoder.MSG_DEVICE_CONFIGURATION, content); - case Command.TYPE_GET_VERSION: - return encodeContent(RuptelaProtocolDecoder.MSG_DEVICE_VERSION, content); - case Command.TYPE_FIRMWARE_UPDATE: - content.writeBytes("|FU_STRT*\r\n".getBytes(StandardCharsets.US_ASCII)); - return encodeContent(RuptelaProtocolDecoder.MSG_FIRMWARE_UPDATE, content); - case Command.TYPE_OUTPUT_CONTROL: - content.writeInt(command.getInteger(Command.KEY_INDEX)); - content.writeInt(Integer.parseInt(command.getString(Command.KEY_DATA))); - return encodeContent(RuptelaProtocolDecoder.MSG_SET_IO, content); - case Command.TYPE_SET_CONNECTION: - String c = command.getString(Command.KEY_SERVER) + "," + command.getInteger(Command.KEY_PORT) + ",TCP"; - content.writeBytes(c.getBytes(StandardCharsets.US_ASCII)); - return encodeContent(RuptelaProtocolDecoder.MSG_SET_CONNECTION, content); - case Command.TYPE_SET_ODOMETER: - content.writeInt(Integer.parseInt(command.getString(Command.KEY_DATA))); - return encodeContent(RuptelaProtocolDecoder.MSG_SET_ODOMETER, content); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/SanavProtocol.java b/src/org/traccar/protocol/SanavProtocol.java deleted file mode 100644 index 4f463725e..000000000 --- a/src/org/traccar/protocol/SanavProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class SanavProtocol extends BaseProtocol { - - public SanavProtocol() { - super("sanav"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '*')); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new SanavProtocolDecoder(SanavProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/SanavProtocolDecoder.java b/src/org/traccar/protocol/SanavProtocolDecoder.java deleted file mode 100644 index 151c55795..000000000 --- a/src/org/traccar/protocol/SanavProtocolDecoder.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2013 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class SanavProtocolDecoder extends BaseProtocolDecoder { - - public SanavProtocolDecoder(SanavProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .any() - .expression("imei[:=]") - .number("(d+)") // imei - .expression("&?rmc[:=]") - .text("$GPRMC,") - .number("(dd)(dd)(dd).d+,") // time (hhmmss.sss) - .expression("([AV]),") // validity - .number("(d+)(dd.d+),") // latitude - .expression("([NS]),") - .number("(d+)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.d+),") // speed - .number("(d+.d+)?,") // course - .number("(dd)(dd)(dd),") // date (ddmmyy) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/SiwiProtocol.java b/src/org/traccar/protocol/SiwiProtocol.java deleted file mode 100644 index 667e083f1..000000000 --- a/src/org/traccar/protocol/SiwiProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; -import org.jboss.netty.handler.codec.string.StringDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class SiwiProtocol extends BaseProtocol { - - public SiwiProtocol() { - super("siwi"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new SiwiProtocolDecoder(SiwiProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/SiwiProtocolDecoder.java b/src/org/traccar/protocol/SiwiProtocolDecoder.java deleted file mode 100644 index 198df24d5..000000000 --- a/src/org/traccar/protocol/SiwiProtocolDecoder.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 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.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 SiwiProtocolDecoder extends BaseProtocolDecoder { - - public SiwiProtocolDecoder(SiwiProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$").expression("[A-Z]+,") // header - .number("(d+),") // device id - .number("d+,") // unit no - .expression("([A-Z]),") // reason - .number("d+,") // command code - .number("[^,]*,") // command value - .expression("([01]),") // ignition - .expression("[01],") // power cut - .expression("[01],") // box open - .number("d+,") // message key - .number("(d+),") // odometer - .number("(d+),") // speed - .number("(d+),") // satellites - .expression("([AV]),") // valid - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(-?d+),") // altitude - .number("(d+),") // course - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(dd)(dd)(dd),") // date (ddmmyy) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_EVENT, parser.next()); - position.set(Position.KEY_IGNITION, parser.next().equals("1")); - position.set(Position.KEY_ODOMETER, parser.nextInt(0)); - - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextInt(0))); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - position.setCourse(parser.nextInt(0)); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY, "IST")); - - return position; - } - -} diff --git a/src/org/traccar/protocol/SkypatrolProtocol.java b/src/org/traccar/protocol/SkypatrolProtocol.java deleted file mode 100644 index fba432522..000000000 --- a/src/org/traccar/protocol/SkypatrolProtocol.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class SkypatrolProtocol extends BaseProtocol { - - public SkypatrolProtocol() { - super("skypatrol"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectDecoder", new SkypatrolProtocolDecoder(SkypatrolProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/SkypatrolProtocolDecoder.java b/src/org/traccar/protocol/SkypatrolProtocolDecoder.java deleted file mode 100644 index f4dded972..000000000 --- a/src/org/traccar/protocol/SkypatrolProtocolDecoder.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright 2012 - 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Log; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; - -public class SkypatrolProtocolDecoder extends BaseProtocolDecoder { - - private final long defaultMask; - - public SkypatrolProtocolDecoder(SkypatrolProtocol protocol) { - super(protocol); - defaultMask = Context.getConfig().getInteger(getProtocolName() + ".mask"); - } - - private static double convertCoordinate(long coordinate) { - int sign = 1; - if (coordinate > 0x7fffffffL) { - sign = -1; - coordinate = 0xffffffffL - coordinate; - } - - long degrees = coordinate / 1000000; - double minutes = (coordinate % 1000000) / 10000.0; - - return sign * (degrees + minutes / 60); - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - int apiNumber = buf.readUnsignedShort(); - int commandType = buf.readUnsignedByte(); - int messageType = BitUtil.from(buf.readUnsignedByte(), 4); - long mask = defaultMask; - if (buf.readUnsignedByte() == 4) { - mask = buf.readUnsignedInt(); - } - - // Binary position report - if (apiNumber == 5 && commandType == 2 && messageType == 1 && BitUtil.check(mask, 0)) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - if (BitUtil.check(mask, 1)) { - position.set(Position.KEY_STATUS, buf.readUnsignedInt()); - } - - String id; - if (BitUtil.check(mask, 23)) { - id = buf.toString(buf.readerIndex(), 8, StandardCharsets.US_ASCII).trim(); - buf.skipBytes(8); - } else if (BitUtil.check(mask, 2)) { - id = buf.toString(buf.readerIndex(), 22, StandardCharsets.US_ASCII).trim(); - buf.skipBytes(22); - } else { - Log.warning("No device id field"); - return null; - } - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - if (BitUtil.check(mask, 3)) { - position.set(Position.PREFIX_IO + 1, buf.readUnsignedShort()); - } - - if (BitUtil.check(mask, 4)) { - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort()); - } - - if (BitUtil.check(mask, 5)) { - position.set(Position.PREFIX_ADC + 2, buf.readUnsignedShort()); - } - - if (BitUtil.check(mask, 7)) { - buf.readUnsignedByte(); // function category - } - - DateBuilder dateBuilder = new DateBuilder(); - - if (BitUtil.check(mask, 8)) { - dateBuilder.setDateReverse( - buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - } - - if (BitUtil.check(mask, 9)) { - position.setValid(buf.readUnsignedByte() == 1); // gps status - } - - if (BitUtil.check(mask, 10)) { - position.setLatitude(convertCoordinate(buf.readUnsignedInt())); - } - - if (BitUtil.check(mask, 11)) { - position.setLongitude(convertCoordinate(buf.readUnsignedInt())); - } - - if (BitUtil.check(mask, 12)) { - position.setSpeed(buf.readUnsignedShort() / 10.0); - } - - if (BitUtil.check(mask, 13)) { - position.setCourse(buf.readUnsignedShort() / 10.0); - } - - if (BitUtil.check(mask, 14)) { - dateBuilder.setTime( - buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - } - - position.setTime(dateBuilder.getDate()); - - if (BitUtil.check(mask, 15)) { - position.setAltitude(buf.readMedium()); - } - - if (BitUtil.check(mask, 16)) { - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - } - - if (BitUtil.check(mask, 17)) { - position.set(Position.KEY_BATTERY, buf.readUnsignedShort()); - } - - if (BitUtil.check(mask, 20)) { - position.set(Position.KEY_ODOMETER_TRIP, buf.readUnsignedInt()); - } - - if (BitUtil.check(mask, 21)) { - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - } - - if (BitUtil.check(mask, 22)) { - buf.skipBytes(6); // time of message generation - } - - if (BitUtil.check(mask, 24)) { - position.set(Position.KEY_POWER, buf.readUnsignedShort() * 0.001); - } - - if (BitUtil.check(mask, 25)) { - buf.skipBytes(18); // gps overspeed - } - - if (BitUtil.check(mask, 26)) { - buf.skipBytes(54); // cell information - } - - if (BitUtil.check(mask, 28)) { - position.set(Position.KEY_INDEX, buf.readUnsignedShort()); - } - - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/SmokeyProtocol.java b/src/org/traccar/protocol/SmokeyProtocol.java deleted file mode 100644 index 4f9a8dd74..000000000 --- a/src/org/traccar/protocol/SmokeyProtocol.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2016 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.ConnectionlessBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class SmokeyProtocol extends BaseProtocol { - - public SmokeyProtocol() { - super("smokey"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectDecoder", new SmokeyProtocolDecoder(SmokeyProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/SmokeyProtocolDecoder.java b/src/org/traccar/protocol/SmokeyProtocolDecoder.java deleted file mode 100644 index 2dcfeb86f..000000000 --- a/src/org/traccar/protocol/SmokeyProtocolDecoder.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.joda.time.Seconds; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; -import org.traccar.model.WifiAccessPoint; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; - -public class SmokeyProtocolDecoder extends BaseProtocolDecoder { - - public SmokeyProtocolDecoder(SmokeyProtocol protocol) { - super(protocol); - } - - public static final int MSG_DATE_RECORD = 0; - public static final int MSG_DATE_RECORD_ACK = 1; - - private static void sendResponse( - Channel channel, SocketAddress remoteAddress, ChannelBuffer id, int index, int report) { - - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeBytes("SM".getBytes(StandardCharsets.US_ASCII)); - response.writeByte(3); // protocol version - response.writeByte(MSG_DATE_RECORD_ACK); - response.writeBytes(id); - response.writeInt(Seconds.secondsBetween( - new DateTime(2000, 1, 1, 0, 0, DateTimeZone.UTC), new DateTime(DateTimeZone.UTC)).getSeconds()); - response.writeByte(index); - response.writeByte(report - 0x200); - - short checksum = (short) 0xF5A0; - for (int i = 0; i < response.readableBytes(); i += 2) { - checksum ^= ChannelBuffers.swapShort(response.getShort(i)); - } - response.writeShort(checksum); - - channel.write(response, remoteAddress); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - buf.readUnsignedByte(); // protocol version - - int type = buf.readUnsignedByte(); - - ChannelBuffer id = buf.readBytes(8); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, ChannelBuffers.hexDump(id)); - if (deviceSession == null) { - return null; - } - - if (type == MSG_DATE_RECORD) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_VERSION_FW, buf.readUnsignedShort()); - - int status = buf.readUnsignedShort(); - position.set(Position.KEY_STATUS, status); - - DateBuilder dateBuilder = new DateBuilder() - .setDate(2000, 1, 1).addSeconds(buf.readUnsignedInt()); - - getLastLocation(position, dateBuilder.getDate()); - - int index = buf.readUnsignedByte(); - position.set(Position.KEY_INDEX, index); - - int report = buf.readUnsignedShort(); - - buf.readUnsignedShort(); // length - - position.set(Position.KEY_BATTERY, buf.readUnsignedShort()); - - Network network = new Network(); - - if (report != 0x0203) { - - int count = 1; - if (report != 0x0200) { - count = buf.readUnsignedByte(); - } - - for (int i = 0; i < count; i++) { - int mcc = buf.readUnsignedShort(); - int mnc = buf.readUnsignedShort(); - int lac = buf.readUnsignedShort(); - int cid = buf.readUnsignedShort(); - if (i == 0) { - buf.readByte(); // timing advance - } - int rssi = buf.readByte(); - network.addCellTower(CellTower.from(mcc, mnc, lac, cid, rssi)); - } - - } - - if (report == 0x0202 || report == 0x0203) { - - int count = buf.readUnsignedByte(); - - for (int i = 0; i < count; i++) { - buf.readerIndex(buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) 0) + 1); // ssid - - String mac = String.format("%02x:%02x:%02x:%02x:%02x:%02x", - buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte(), - buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()); - - network.addWifiAccessPoint(WifiAccessPoint.from(mac, buf.readByte())); - } - - } - - position.setNetwork(network); - - sendResponse(channel, remoteAddress, id, index, report); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/StarLinkProtocol.java b/src/org/traccar/protocol/StarLinkProtocol.java deleted file mode 100644 index e71d94fd0..000000000 --- a/src/org/traccar/protocol/StarLinkProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class StarLinkProtocol extends BaseProtocol { - - public StarLinkProtocol() { - super("starlink"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new StarLinkProtocolDecoder(StarLinkProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/StarLinkProtocolDecoder.java b/src/org/traccar/protocol/StarLinkProtocolDecoder.java deleted file mode 100644 index 79f013fac..000000000 --- a/src/org/traccar/protocol/StarLinkProtocolDecoder.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright 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.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.TimeZone; -import java.util.regex.Pattern; - -public class StarLinkProtocolDecoder extends BaseProtocolDecoder { - - private String[] dataTags; - private DateFormat dateFormat; - - public StarLinkProtocolDecoder(StarLinkProtocol protocol) { - super(protocol); - - String format = Context.getConfig().getString( - getProtocolName() + ".format", "#EDT#,#EID#,#PDT#,#LAT#,#LONG#,#SPD#,#HEAD#,#ODO#," - + "#IN1#,#IN2#,#IN3#,#IN4#,#OUT1#,#OUT2#,#OUT3#,#OUT4#,#LAC#,#CID#,#VIN#,#VBAT#,#DEST#,#IGN#,#ENG#"); - dataTags = format.split(","); - - dateFormat = new SimpleDateFormat( - Context.getConfig().getString(getProtocolName() + ".dateFormat", "yyMMddHHmmss")); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - } - - private static final Pattern PATTERN = new PatternBuilder() - .expression(".") // protocol head - .text("SLU") // message head - .number("(x{6}|d{15}),") // id - .number("(d+),") // type - .number("(d+),") // index - .expression("(.+)") // data - .text("*") - .number("xx") // checksum - .compile(); - - public static final int MSG_EVENT_REPORT = 6; - - private double parseCoordinate(String value) { - int minutesIndex = value.indexOf('.') - 2; - double result = Double.parseDouble(value.substring(1, minutesIndex)); - result += Double.parseDouble(value.substring(minutesIndex)) / 60; - return value.charAt(0) == '+' ? result : -result; - } - - private String decodeAlarm(int event) { - switch (event) { - case 6: - return Position.ALARM_OVERSPEED; - case 7: - return Position.ALARM_GEOFENCE_ENTER; - case 8: - return Position.ALARM_GEOFENCE_EXIT; - case 9: - return Position.ALARM_POWER_CUT; - case 11: - return Position.ALARM_LOW_BATTERY; - case 26: - return Position.ALARM_TOW; - case 36: - return Position.ALARM_SOS; - case 42: - return Position.ALARM_JAMMING; - default: - return null; - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - int type = parser.nextInt(0); - if (type != MSG_EVENT_REPORT) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - position.setValid(true); - - position.set(Position.KEY_INDEX, parser.nextInt(0)); - - String[] data = parser.next().split(","); - Integer lac = null, cid = null; - int event = 0; - - for (int i = 0; i < Math.min(data.length, dataTags.length); i++) { - if (data[i].isEmpty()) { - continue; - } - switch (dataTags[i]) { - case "#EDT#": - position.setDeviceTime(dateFormat.parse(data[i])); - break; - case "#EID#": - event = Integer.parseInt(data[i]); - position.set(Position.KEY_ALARM, decodeAlarm(event)); - position.set(Position.KEY_EVENT, event); - break; - case "#PDT#": - position.setFixTime(dateFormat.parse(data[i])); - break; - case "#LAT#": - position.setLatitude(parseCoordinate(data[i])); - break; - case "#LONG#": - position.setLongitude(parseCoordinate(data[i])); - break; - case "#SPD#": - position.setSpeed(Double.parseDouble(data[i])); - break; - case "#HEAD#": - position.setCourse(Integer.parseInt(data[i])); - break; - case "#ODO#": - position.set(Position.KEY_ODOMETER, Long.parseLong(data[i]) * 1000); - break; - case "#IN1#": - position.set(Position.PREFIX_IN + 1, Integer.parseInt(data[i])); - break; - case "#IN2#": - position.set(Position.PREFIX_IN + 2, Integer.parseInt(data[i])); - break; - case "#IN3#": - position.set(Position.PREFIX_IN + 3, Integer.parseInt(data[i])); - break; - case "#IN4#": - position.set(Position.PREFIX_IN + 4, Integer.parseInt(data[i])); - break; - case "#OUT1#": - position.set(Position.PREFIX_OUT + 1, Integer.parseInt(data[i])); - break; - case "#OUT2#": - position.set(Position.PREFIX_OUT + 2, Integer.parseInt(data[i])); - break; - case "#OUT3#": - position.set(Position.PREFIX_OUT + 3, Integer.parseInt(data[i])); - break; - case "#OUT4#": - position.set(Position.PREFIX_OUT + 4, Integer.parseInt(data[i])); - break; - case "#LAC#": - if (!data[i].isEmpty()) { - lac = Integer.parseInt(data[i]); - } - break; - case "#CID#": - if (!data[i].isEmpty()) { - cid = Integer.parseInt(data[i]); - } - break; - case "#VIN#": - position.set(Position.KEY_POWER, Double.parseDouble(data[i])); - break; - case "#VBAT#": - position.set(Position.KEY_BATTERY, Double.parseDouble(data[i])); - break; - case "#DEST#": - position.set("destination", data[i]); - break; - case "#IGN#": - position.set(Position.KEY_IGNITION, data[i].equals("1")); - break; - case "#ENG#": - position.set("engine", data[i].equals("1")); - break; - default: - break; - } - } - - if (position.getFixTime() == null) { - getLastLocation(position, null); - } - - if (lac != null && cid != null) { - position.setNetwork(new Network(CellTower.fromLacCid(lac, cid))); - } - - if (event == 20) { - String rfid = data[data.length - 1]; - if (rfid.matches("0+")) { - rfid = data[data.length - 2]; - } - position.set(Position.KEY_DRIVER_UNIQUE_ID, rfid); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/Stl060FrameDecoder.java b/src/org/traccar/protocol/Stl060FrameDecoder.java deleted file mode 100644 index 455a869ee..000000000 --- a/src/org/traccar/protocol/Stl060FrameDecoder.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2014 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.traccar.CharacterDelimiterFrameDecoder; - -public class Stl060FrameDecoder extends CharacterDelimiterFrameDecoder { - - public Stl060FrameDecoder(int maxFrameLength) { - super(maxFrameLength, '#'); - } - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - ChannelBuffer result = (ChannelBuffer) super.decode(ctx, channel, buf); - - if (result != null) { - - int index = result.indexOf(result.readerIndex(), result.writerIndex(), (byte) '$'); - if (index == -1) { - return result; - } else { - result.skipBytes(index); - return result.readBytes(result.readableBytes()); - } - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Stl060Protocol.java b/src/org/traccar/protocol/Stl060Protocol.java deleted file mode 100644 index 6fe2c5181..000000000 --- a/src/org/traccar/protocol/Stl060Protocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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 java.util.List; - -public class Stl060Protocol extends BaseProtocol { - - public Stl060Protocol() { - super("stl060"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new Stl060FrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new Stl060ProtocolDecoder(Stl060Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Stl060ProtocolDecoder.java b/src/org/traccar/protocol/Stl060ProtocolDecoder.java deleted file mode 100644 index 26817a5c8..000000000 --- a/src/org/traccar/protocol/Stl060ProtocolDecoder.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2014 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class Stl060ProtocolDecoder extends BaseProtocolDecoder { - - public Stl060ProtocolDecoder(Stl060Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .any() - .text("$1,") - .number("(d+),") // imei - .text("D001,") // type - .expression("[^,]*,") // vehicle - .number("(dd)/(dd)/(dd),") // date (dd/mm/yy) - .number("(dd):(dd):(dd),") // time (hh:mm:ss) - .number("(dd)(dd).?(d+)([NS]),") // latitude - .number("(ddd)(dd).?(d+)([EW]),") // longitude - .number("(d+.?d*),") // speed - .number("(d+.?d*),") // course - .groupBegin() - .number("(d+),") // odometer - .number("(d+),") // Ignition - .number("(d+),") // di1 - .number("(d+),") // di2 - .number("(d+),") // fuel - .or() - .expression("([01]),") // charging - .expression("([01]),") // ignition - .expression("0,0,") // reserved - .number("(d+),") // di - .expression("([^,]+),") // rfid - .number("(d+),") // odometer - .number("(d+),") // temperature - .number("(d+),") // fuel - .expression("([01]),") // accelerometer - .expression("([01]),") // do1 - .expression("([01]),") // do2 - .groupEnd() - .expression("([AV])") // validity - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_MIN_MIN_HEM)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_MIN_MIN_HEM)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - // Old format - if (parser.hasNext(5)) { - position.set(Position.KEY_ODOMETER, parser.nextInt(0)); - position.set(Position.KEY_IGNITION, parser.nextInt(0) == 1); - position.set(Position.KEY_INPUT, parser.nextInt(0) + parser.nextInt(0) << 1); - position.set(Position.KEY_FUEL_LEVEL, parser.nextInt(0)); - } - - // New format - if (parser.hasNext(10)) { - position.set(Position.KEY_CHARGE, parser.nextInt(0) == 1); - position.set(Position.KEY_IGNITION, parser.nextInt(0) == 1); - position.set(Position.KEY_INPUT, parser.nextInt(0)); - position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next()); - position.set(Position.KEY_ODOMETER, parser.nextInt(0)); - position.set(Position.PREFIX_TEMP + 1, parser.nextInt(0)); - position.set(Position.KEY_FUEL_LEVEL, parser.nextInt(0)); - position.set(Position.KEY_ACCELERATION, parser.nextInt(0) == 1); - position.set(Position.KEY_OUTPUT, parser.nextInt(0) + parser.nextInt(0) << 1); - } - - position.setValid(parser.next().equals("A")); - - return position; - } - -} diff --git a/src/org/traccar/protocol/SuntechProtocol.java b/src/org/traccar/protocol/SuntechProtocol.java deleted file mode 100644 index 03a979d04..000000000 --- a/src/org/traccar/protocol/SuntechProtocol.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2015 - 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class SuntechProtocol extends BaseProtocol { - - public SuntechProtocol() { - super("suntech"); - setSupportedDataCommands( - Command.TYPE_OUTPUT_CONTROL, - Command.TYPE_REBOOT_DEVICE, - Command.TYPE_POSITION_SINGLE, - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME, - Command.TYPE_ALARM_ARM, - Command.TYPE_ALARM_DISARM); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '\r')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectEncoder", new SuntechProtocolEncoder()); - pipeline.addLast("objectDecoder", new SuntechProtocolDecoder(SuntechProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/SuntechProtocolDecoder.java b/src/org/traccar/protocol/SuntechProtocolDecoder.java deleted file mode 100644 index 6dfc6f77f..000000000 --- a/src/org/traccar/protocol/SuntechProtocolDecoder.java +++ /dev/null @@ -1,379 +0,0 @@ -/* - * 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.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.TimeZone; - -public class SuntechProtocolDecoder extends BaseProtocolDecoder { - - private int protocolType; - private boolean hbm; - private boolean includeAdc; - private boolean includeTemp; - - public SuntechProtocolDecoder(SuntechProtocol protocol) { - super(protocol); - - protocolType = Context.getConfig().getInteger(getProtocolName() + ".protocolType"); - hbm = Context.getConfig().getBoolean(getProtocolName() + ".hbm"); - includeAdc = Context.getConfig().getBoolean(getProtocolName() + ".includeAdc"); - includeTemp = Context.getConfig().getBoolean(getProtocolName() + ".includeTemp"); - } - - public void setProtocolType(int protocolType) { - this.protocolType = protocolType; - } - - public void setHbm(boolean hbm) { - this.hbm = hbm; - } - - public void setIncludeAdc(boolean includeAdc) { - this.includeAdc = includeAdc; - } - - public void setIncludeTemp(boolean includeTemp) { - this.includeTemp = includeTemp; - } - - private Position decode9( - Channel channel, SocketAddress remoteAddress, String[] values) throws ParseException { - int index = 1; - - String type = values[index++]; - - if (!type.equals("Location") && !type.equals("Emergency") && !type.equals("Alert")) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, values[index++]); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - if (type.equals("Emergency") || type.equals("Alert")) { - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - } - - if (!type.equals("Alert") || protocolType == 0) { - position.set(Position.KEY_VERSION_FW, values[index++]); - } - - DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHH:mm:ss"); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - position.setTime(dateFormat.parse(values[index++] + values[index++])); - - if (protocolType == 1) { - index += 1; // cell - } - - position.setLatitude(Double.parseDouble(values[index++])); - position.setLongitude(Double.parseDouble(values[index++])); - position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble(values[index++]))); - position.setCourse(Double.parseDouble(values[index++])); - - position.setValid(values[index++].equals("1")); - - if (protocolType == 1) { - position.set(Position.KEY_ODOMETER, Integer.parseInt(values[index++])); - } - - return position; - } - - private String decodeEmergency(int value) { - switch (value) { - case 1: - return Position.ALARM_SOS; - case 2: - return Position.ALARM_PARKING; - case 3: - return Position.ALARM_POWER_CUT; - case 5: - case 6: - return Position.ALARM_DOOR; - case 7: - return Position.ALARM_MOVEMENT; - case 8: - return Position.ALARM_SHOCK; - default: - return null; - } - } - - private String decodeAlert(int value) { - switch (value) { - case 1: - return Position.ALARM_OVERSPEED; - case 5: - return Position.ALARM_GEOFENCE_EXIT; - case 6: - return Position.ALARM_GEOFENCE_ENTER; - case 14: - return Position.ALARM_LOW_BATTERY; - case 15: - return Position.ALARM_SHOCK; - case 16: - return Position.ALARM_ACCIDENT; - case 46: - return Position.ALARM_ACCELERATION; - case 47: - return Position.ALARM_BRAKING; - case 48: - return Position.ALARM_ACCIDENT; - case 50: - return Position.ALARM_JAMMING; - default: - return null; - } - } - - private Position decode235( - Channel channel, SocketAddress remoteAddress, String protocol, String[] values) throws ParseException { - int index = 0; - - String type = values[index++].substring(5); - - if (!type.equals("STT") && !type.equals("EMG") && !type.equals("EVT") && !type.equals("ALT")) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, values[index++]); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - position.set(Position.KEY_TYPE, type); - - if (protocol.equals("ST300") || protocol.equals("ST500")) { - index += 1; // model - } - - position.set(Position.KEY_VERSION_FW, values[index++]); - - DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHH:mm:ss"); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - position.setTime(dateFormat.parse(values[index++] + values[index++])); - - if (!protocol.equals("ST500")) { - index += 1; // cell - } - - position.setLatitude(Double.parseDouble(values[index++])); - position.setLongitude(Double.parseDouble(values[index++])); - position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble(values[index++]))); - position.setCourse(Double.parseDouble(values[index++])); - - position.set(Position.KEY_SATELLITES, Integer.parseInt(values[index++])); - - position.setValid(values[index++].equals("1")); - - position.set(Position.KEY_ODOMETER, Integer.parseInt(values[index++])); - position.set(Position.KEY_POWER, Double.parseDouble(values[index++])); - - String io = values[index++]; - if (io.length() == 6) { - position.set(Position.KEY_IGNITION, io.charAt(0) == '1'); - position.set(Position.PREFIX_IN + 1, io.charAt(1) == '1'); - position.set(Position.PREFIX_IN + 2, io.charAt(2) == '1'); - position.set(Position.PREFIX_IN + 3, io.charAt(3) == '1'); - position.set(Position.PREFIX_OUT + 1, io.charAt(4) == '1'); - position.set(Position.PREFIX_OUT + 2, io.charAt(5) == '1'); - } - - switch (type) { - case "STT": - index += 1; // mode - position.set(Position.KEY_INDEX, Integer.parseInt(values[index++])); - break; - case "EMG": - position.set(Position.KEY_ALARM, decodeEmergency(Integer.parseInt(values[index++]))); - break; - case "EVT": - position.set(Position.KEY_EVENT, Integer.parseInt(values[index++])); - break; - case "ALT": - position.set(Position.KEY_ALARM, decodeAlert(Integer.parseInt(values[index++]))); - break; - default: - break; - } - - if (hbm) { - - if (index < values.length) { - position.set(Position.KEY_HOURS, Integer.parseInt(values[index++])); - } - - if (index < values.length) { - position.set(Position.KEY_BATTERY, Double.parseDouble(values[index++])); - } - - if (index < values.length && values[index++].equals("0")) { - position.set(Position.KEY_ARCHIVE, true); - } - - if (includeAdc) { - position.set(Position.PREFIX_ADC + 1, Double.parseDouble(values[index++])); - position.set(Position.PREFIX_ADC + 2, Double.parseDouble(values[index++])); - position.set(Position.PREFIX_ADC + 3, Double.parseDouble(values[index++])); - } - - if (values.length - index >= 2) { - String driverUniqueId = values[index++]; - if (values[index++].equals("1") && !driverUniqueId.isEmpty()) { - position.set(Position.KEY_DRIVER_UNIQUE_ID, driverUniqueId); - } - } - - if (includeTemp) { - for (int i = 1; i <= 3; i++) { - String temperature = values[index++]; - String value = temperature.substring(temperature.indexOf(':') + 1); - if (!value.isEmpty()) { - position.set(Position.PREFIX_TEMP + i, Double.parseDouble(value)); - } - } - - } - - } - - return position; - } - - private Position decodeUniversal( - Channel channel, SocketAddress remoteAddress, String[] values) throws ParseException { - int index = 0; - - String type = values[index++]; - - if (!type.equals("STT")) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, values[index++]); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - position.set(Position.KEY_TYPE, type); - - int mask = Integer.parseInt(values[index++], 16); - - if (BitUtil.check(mask, 1)) { - index += 1; // model - } - - if (BitUtil.check(mask, 2)) { - position.set(Position.KEY_VERSION_FW, values[index++]); - } - - if (BitUtil.check(mask, 3) && values[index++].equals("0")) { - position.set(Position.KEY_ARCHIVE, true); - } - - if (BitUtil.check(mask, 4) && BitUtil.check(mask, 5)) { - DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHH:mm:ss"); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - position.setTime(dateFormat.parse(values[index++] + values[index++])); - } - - if (BitUtil.check(mask, 6)) { - index += 1; // cell - } - - if (BitUtil.check(mask, 7)) { - index += 1; // mcc - } - - if (BitUtil.check(mask, 8)) { - index += 1; // mnc - } - - if (BitUtil.check(mask, 9)) { - index += 1; // lac - } - - if (BitUtil.check(mask, 10)) { - position.set(Position.KEY_RSSI, Integer.parseInt(values[index++])); - } - - if (BitUtil.check(mask, 11)) { - position.setLatitude(Double.parseDouble(values[index++])); - } - - if (BitUtil.check(mask, 12)) { - position.setLongitude(Double.parseDouble(values[index++])); - } - - if (BitUtil.check(mask, 13)) { - position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble(values[index++]))); - } - - if (BitUtil.check(mask, 14)) { - position.setCourse(Double.parseDouble(values[index++])); - } - - if (BitUtil.check(mask, 15)) { - position.set(Position.KEY_SATELLITES, Integer.parseInt(values[index++])); - } - - if (BitUtil.check(mask, 16)) { - position.setValid(values[index++].equals("1")); - } - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String[] values = ((String) msg).split(";"); - - if (values[0].length() < 5) { - return decodeUniversal(channel, remoteAddress, values); - } else if (values[0].equals("ST910")) { - return decode9(channel, remoteAddress, values); - } else { - return decode235(channel, remoteAddress, values[0].substring(0, 5), values); - } - } - -} diff --git a/src/org/traccar/protocol/SuntechProtocolEncoder.java b/src/org/traccar/protocol/SuntechProtocolEncoder.java deleted file mode 100644 index 5b1c802fa..000000000 --- a/src/org/traccar/protocol/SuntechProtocolEncoder.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2015 - 2016 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.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class SuntechProtocolEncoder extends StringProtocolEncoder { - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_REBOOT_DEVICE: - return formatCommand(command, "SA200CMD;{%s};02;Reboot\r", Command.KEY_UNIQUE_ID); - case Command.TYPE_POSITION_SINGLE: - return formatCommand(command, "SA200GTR;{%s};02;\r", Command.KEY_UNIQUE_ID); - case Command.TYPE_OUTPUT_CONTROL: - if (command.getAttributes().containsKey(Command.KEY_DATA)) { - if (command.getAttributes().get(Command.KEY_DATA).equals("1")) { - return formatCommand(command, "SA200CMD;{%s};02;Enable{%s}\r", - Command.KEY_UNIQUE_ID, Command.KEY_INDEX); - } else { - return formatCommand(command, "SA200CMD;{%s};02;Disable{%s}\r", - Command.KEY_UNIQUE_ID, Command.KEY_INDEX); - } - } - case Command.TYPE_ENGINE_STOP: - return formatCommand(command, "SA200CMD;{%s};02;Enable1\r", Command.KEY_UNIQUE_ID); - case Command.TYPE_ENGINE_RESUME: - return formatCommand(command, "SA200CMD;{%s};02;Disable1\r", Command.KEY_UNIQUE_ID); - case Command.TYPE_ALARM_ARM: - return formatCommand(command, "SA200CMD;{%s};02;Enable2\r", Command.KEY_UNIQUE_ID); - case Command.TYPE_ALARM_DISARM: - return formatCommand(command, "SA200CMD;{%s};02;Disable2\r", Command.KEY_UNIQUE_ID); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/SupermateProtocol.java b/src/org/traccar/protocol/SupermateProtocol.java deleted file mode 100644 index c9ae86fc1..000000000 --- a/src/org/traccar/protocol/SupermateProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class SupermateProtocol extends BaseProtocol { - - public SupermateProtocol() { - super("supermate"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "#")); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new SupermateProtocolDecoder(SupermateProtocol.this)); - } - }); - } -} diff --git a/src/org/traccar/protocol/SupermateProtocolDecoder.java b/src/org/traccar/protocol/SupermateProtocolDecoder.java deleted file mode 100644 index d9b58a7f4..000000000 --- a/src/org/traccar/protocol/SupermateProtocolDecoder.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Calendar; -import java.util.regex.Pattern; - -public class SupermateProtocolDecoder extends BaseProtocolDecoder { - - public SupermateProtocolDecoder(SupermateProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("d+:") // header - .number("(d+):") // imei - .number("d+:").text("*,") - .number("(d+),") // command id - .expression("([^,]{2}),") // command - .expression("([AV]),") // validity - .number("(xx)(xx)(xx),") // date (yymmdd) - .number("(xx)(xx)(xx),") // time (hhmmss) - .number("(x)(x{7}),") // latitude - .number("(x)(x{7}),") // longitude - .number("(x{4}),") // speed - .number("(x{4}),") // course - .number("(x{12}),") // status - .number("(x+),") // signal - .number("(d+),") // power - .number("(x{4}),") // oil - .number("(x+)?") // odometer - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - String imei = parser.next(); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set("commandId", parser.next()); - position.set(Position.KEY_COMMAND, parser.next()); - - position.setValid(parser.next().equals("A")); - - DateBuilder dateBuilder = new DateBuilder() - .setDate(parser.nextHexInt(0), parser.nextHexInt(0), parser.nextHexInt(0)) - .setTime(parser.nextHexInt(0), parser.nextHexInt(0), parser.nextHexInt(0)); - position.setTime(dateBuilder.getDate()); - - if (parser.nextHexInt(0) == 8) { - position.setLatitude(-parser.nextHexInt(0) / 600000.0); - } else { - position.setLatitude(parser.nextHexInt(0) / 600000.0); - } - - if (parser.nextHexInt(0) == 8) { - position.setLongitude(-parser.nextHexInt(0) / 600000.0); - } else { - position.setLongitude(parser.nextHexInt(0) / 600000.0); - } - - position.setSpeed(parser.nextHexInt(0) / 100.0); - position.setCourse(parser.nextHexInt(0) / 100.0); - - position.set(Position.KEY_STATUS, parser.next()); - position.set("signal", parser.next()); - position.set(Position.KEY_POWER, parser.nextDouble(0)); - position.set("oil", parser.nextHexInt(0)); - position.set(Position.KEY_ODOMETER, parser.nextHexInt(0)); - - if (channel != null) { - Calendar calendar = Calendar.getInstance(); - String content = String.format("#1:%s:1:*,00000000,UP,%02x%02x%02x,%02x%02x%02x#", imei, - calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH), - calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND)); - channel.write(ChannelBuffers.copiedBuffer(content, StandardCharsets.US_ASCII)); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/T55Protocol.java b/src/org/traccar/protocol/T55Protocol.java deleted file mode 100644 index 402fd46b8..000000000 --- a/src/org/traccar/protocol/T55Protocol.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2015 - 2016 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.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class T55Protocol extends BaseProtocol { - - public T55Protocol() { - super("t55"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new T55ProtocolDecoder(T55Protocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new T55ProtocolDecoder(T55Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/T55ProtocolDecoder.java b/src/org/traccar/protocol/T55ProtocolDecoder.java deleted file mode 100644 index 6b4ee6ebd..000000000 --- a/src/org/traccar/protocol/T55ProtocolDecoder.java +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright 2012 - 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.jboss.netty.channel.socket.DatagramChannel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.Date; -import java.util.regex.Pattern; - -public class T55ProtocolDecoder extends BaseProtocolDecoder { - - public T55ProtocolDecoder(T55Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN_GPRMC = new PatternBuilder() - .text("$GPRMC,") - .number("(dd)(dd)(dd).?d*,") // time (hhmmss) - .expression("([AV]),") // validity - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(d{2,3})(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*)?,") // speed - .number("(d+.?d*)?,") // course - .number("(dd)(dd)(dd),") // date (ddmmyy) - .expression("[^*]+") - .text("*") - .expression("[^,]+") - .number(",(d+)") // satellites - .number(",(d+)") // imei - .expression(",([01])") // ignition - .number(",(d+)") // fuel - .number(",(d+)").optional(5) // battery - .number("((?:,d+)+)?") // parameters - .any() - .compile(); - - private static final Pattern PATTERN_GPGGA = new PatternBuilder() - .text("$GPGGA,") - .number("(dd)(dd)(dd).?d*,") // time (hhmmss) - .number("(d+)(dd.d+),") // latitude - .expression("([NS]),") - .number("(d+)(dd.d+),") // longitude - .expression("([EW]),") - .any() - .compile(); - - private static final Pattern PATTERN_GPRMA = new PatternBuilder() - .text("$GPRMA,") - .expression("([AV]),") // validity - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .expression("([EW]),,,") - .number("(d+.?d*)?,") // speed - .number("(d+.?d*)?,") // course - .any() - .compile(); - - private static final Pattern PATTERN_TRCCR = new PatternBuilder() - .text("$TRCCR,") - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd).?d*,") // time (hhmmss) - .expression("([AV]),") // validity - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(d+.d+),") // speed - .number("(d+.d+),") // course - .number("(-?d+.d+),") // altitude - .number("(d+.?d*),") // battery - .any() - .compile(); - - private Position position = null; - - private Position decodeGprmc( - DeviceSession deviceSession, String sentence, SocketAddress remoteAddress, Channel channel) { - - if (deviceSession != null && channel != null && !(channel instanceof DatagramChannel)) { - if (Context.getIdentityManager().lookupAttributeBoolean( - deviceSession.getDeviceId(), getProtocolName() + ".ack", false, true)) { - channel.write("OK1\r\n"); - } - } - - Parser parser = new Parser(PATTERN_GPRMC, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - if (deviceSession != null) { - position.setDeviceId(deviceSession.getDeviceId()); - } - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - if (parser.hasNext(5)) { - position.set(Position.KEY_SATELLITES, parser.nextInt()); - - deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_IGNITION, parser.hasNext() && parser.next().equals("1")); - position.set(Position.KEY_FUEL_LEVEL, parser.nextInt(0)); - position.set(Position.KEY_BATTERY, parser.nextInt()); - } - - if (parser.hasNext()) { - String[] parameters = parser.next().split(","); - for (int i = 1; i < parameters.length; i++) { - position.set(Position.PREFIX_IO + i, parameters[i]); - } - } - - if (deviceSession != null) { - return position; - } else { - this.position = position; // save position - return null; - } - } - - private Position decodeGpgga(DeviceSession deviceSession, String sentence) { - - Parser parser = new Parser(PATTERN_GPGGA, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setCurrentDate() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.setValid(true); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - - return position; - } - - private Position decodeGprma(DeviceSession deviceSession, String sentence) { - - Parser parser = new Parser(PATTERN_GPRMA, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(new Date()); - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - return position; - } - - private Position decodeTrccr(DeviceSession deviceSession, String sentence) { - - Parser parser = new Parser(PATTERN_TRCCR, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime()); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - position.set(Position.KEY_BATTERY, parser.nextDouble(0)); - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - DeviceSession deviceSession; - - if (!sentence.startsWith("$") && sentence.contains("$")) { - int index = sentence.indexOf("$"); - String id = sentence.substring(0, index); - if (id.endsWith(",")) { - id = id.substring(0, id.length() - 1); - } else if (id.endsWith("/")) { - id = id.substring(id.indexOf('/') + 1, id.length() - 1); - } - deviceSession = getDeviceSession(channel, remoteAddress, id); - sentence = sentence.substring(index); - } else { - deviceSession = getDeviceSession(channel, remoteAddress); - } - - if (sentence.startsWith("$PGID")) { - getDeviceSession(channel, remoteAddress, sentence.substring(6, sentence.length() - 3)); - } else if (sentence.startsWith("$PCPTI")) { - getDeviceSession(channel, remoteAddress, sentence.substring(7, sentence.indexOf(",", 7))); - } else if (sentence.startsWith("IMEI")) { - getDeviceSession(channel, remoteAddress, sentence.substring(5, sentence.length())); - } else if (sentence.startsWith("$GPFID")) { - deviceSession = getDeviceSession(channel, remoteAddress, sentence.substring(7, sentence.length())); - if (deviceSession != null && position != null) { - Position position = this.position; - position.setDeviceId(deviceSession.getDeviceId()); - this.position = null; - return position; - } - } else if (sentence.matches("^[0-9A-F]+$")) { - getDeviceSession(channel, remoteAddress, sentence); - } else if (sentence.startsWith("$GPRMC")) { - return decodeGprmc(deviceSession, sentence, remoteAddress, channel); - } else if (sentence.startsWith("$GPGGA") && deviceSession != null) { - return decodeGpgga(deviceSession, sentence); - } else if (sentence.startsWith("$GPRMA") && deviceSession != null) { - return decodeGprma(deviceSession, sentence); - } else if (sentence.startsWith("$TRCCR") && deviceSession != null) { - return decodeTrccr(deviceSession, sentence); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/T800xProtocol.java b/src/org/traccar/protocol/T800xProtocol.java deleted file mode 100644 index 830ff4de6..000000000 --- a/src/org/traccar/protocol/T800xProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2015 - 2016 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class T800xProtocol extends BaseProtocol { - - public T800xProtocol() { - super("t800x"); - setSupportedDataCommands( - Command.TYPE_CUSTOM); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 3, 2, -5, 0)); - pipeline.addLast("objectEncoder", new T800xProtocolEncoder()); - pipeline.addLast("objectDecoder", new T800xProtocolDecoder(T800xProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/T800xProtocolDecoder.java b/src/org/traccar/protocol/T800xProtocolDecoder.java deleted file mode 100644 index 6430b1344..000000000 --- a/src/org/traccar/protocol/T800xProtocolDecoder.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright 2015 - 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BcdUtil; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.ByteOrder; - -public class T800xProtocolDecoder extends BaseProtocolDecoder { - - public T800xProtocolDecoder(T800xProtocol protocol) { - super(protocol); - } - - public static final int MSG_LOGIN = 0x01; - public static final int MSG_GPS = 0x02; - public static final int MSG_HEARTBEAT = 0x03; - public static final int MSG_ALARM = 0x04; - public static final int MSG_COMMAND = 0x81; - - private static float readSwappedFloat(ChannelBuffer buf) { - byte[] bytes = new byte[4]; - buf.readBytes(bytes); - return ChannelBuffers.wrappedBuffer(ByteOrder.LITTLE_ENDIAN, bytes).readFloat(); - } - - private void sendResponse(Channel channel, int type, ChannelBuffer imei) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.directBuffer(15); - response.writeByte(0x23); - response.writeByte(0x23); // header - response.writeByte(type); - response.writeShort(response.capacity()); // length - response.writeShort(0x0001); // index - response.writeBytes(imei); - channel.write(response); - } - } - - private String decodeAlarm(short value) { - switch (value) { - case 3: - return Position.ALARM_SOS; - case 4: - return Position.ALARM_OVERSPEED; - case 5: - return Position.ALARM_GEOFENCE_ENTER; - case 6: - return Position.ALARM_GEOFENCE_EXIT; - case 8: - case 10: - return Position.ALARM_VIBRATION; - default: - break; - } - return null; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); - int type = buf.readUnsignedByte(); - buf.readUnsignedShort(); // length - int index = buf.readUnsignedShort(); - ChannelBuffer imei = buf.readBytes(8); - - DeviceSession deviceSession = getDeviceSession( - channel, remoteAddress, ChannelBuffers.hexDump(imei).substring(1)); - if (deviceSession == null) { - return null; - } - - if (type == MSG_LOGIN || type == MSG_ALARM || type == MSG_HEARTBEAT) { - sendResponse(channel, type, imei); - } - - if (type == MSG_GPS || type == MSG_ALARM) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_INDEX, index); - - buf.readUnsignedShort(); // acc on interval - buf.readUnsignedShort(); // acc off interval - buf.readUnsignedByte(); // angle compensation - buf.readUnsignedShort(); // distance compensation - buf.readUnsignedShort(); // speed alarm - - int locationStatus = buf.readUnsignedByte(); - - buf.readUnsignedByte(); // gsensor manager status - buf.readUnsignedByte(); // other flags - buf.readUnsignedByte(); // heartbeat - buf.readUnsignedByte(); // relay status - buf.readUnsignedShort(); // drag alarm setting - - int io = buf.readUnsignedShort(); - position.set(Position.KEY_IGNITION, BitUtil.check(io, 14)); - position.set("ac", BitUtil.check(io, 13)); - - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 2, buf.readUnsignedShort()); - - position.set(Position.KEY_ALARM, decodeAlarm(buf.readUnsignedByte())); - - buf.readUnsignedByte(); // reserved - - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - - int battery = BcdUtil.readInteger(buf, 2); - if (battery == 0) { - battery = 100; - } - position.set(Position.KEY_BATTERY, battery); - - DateBuilder dateBuilder = new DateBuilder() - .setYear(BcdUtil.readInteger(buf, 2)) - .setMonth(BcdUtil.readInteger(buf, 2)) - .setDay(BcdUtil.readInteger(buf, 2)) - .setHour(BcdUtil.readInteger(buf, 2)) - .setMinute(BcdUtil.readInteger(buf, 2)) - .setSecond(BcdUtil.readInteger(buf, 2)); - - if (BitUtil.check(locationStatus, 6)) { - - position.setValid(!BitUtil.check(locationStatus, 7)); - position.setTime(dateBuilder.getDate()); - position.setAltitude(readSwappedFloat(buf)); - position.setLongitude(readSwappedFloat(buf)); - position.setLatitude(readSwappedFloat(buf)); - position.setSpeed(UnitsConverter.knotsFromKph( - BcdUtil.readInteger(buf, 4) * 0.1)); - position.setCourse(buf.readUnsignedShort()); - - } else { - - getLastLocation(position, dateBuilder.getDate()); - - byte[] array = new byte[16]; - buf.readBytes(array); - ChannelBuffer swapped = ChannelBuffers.wrappedBuffer(ByteOrder.LITTLE_ENDIAN, array); - - position.setNetwork(new Network(CellTower.from( - swapped.readUnsignedShort(), swapped.readUnsignedShort(), - swapped.readUnsignedShort(), swapped.readUnsignedShort()))); - - // two more cell towers - - } - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/T800xProtocolEncoder.java b/src/org/traccar/protocol/T800xProtocolEncoder.java deleted file mode 100644 index 6ed5dbccd..000000000 --- a/src/org/traccar/protocol/T800xProtocolEncoder.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import javax.xml.bind.DatatypeConverter; -import java.nio.charset.StandardCharsets; - -public class T800xProtocolEncoder extends BaseProtocolEncoder { - - public static final int MODE_SETTING = 0x01; - public static final int MODE_BROADCAST = 0x02; - public static final int MODE_FORWARD = 0x03; - - private ChannelBuffer encodeContent(Command command, String content) { - - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); - - buf.writeByte('#'); - buf.writeByte('#'); - buf.writeByte(T800xProtocolDecoder.MSG_COMMAND); - buf.writeShort(7 + 8 + 1 + content.length()); - buf.writeShort(1); // serial number - buf.writeBytes(DatatypeConverter.parseHexBinary("0" + getUniqueId(command.getDeviceId()))); - buf.writeByte(MODE_SETTING); - buf.writeBytes(content.getBytes(StandardCharsets.US_ASCII)); - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_CUSTOM: - return encodeContent(command, command.getString(Command.KEY_DATA)); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/TaipProtocol.java b/src/org/traccar/protocol/TaipProtocol.java deleted file mode 100644 index cbfc44122..000000000 --- a/src/org/traccar/protocol/TaipProtocol.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class TaipProtocol extends BaseProtocol { - - public TaipProtocol() { - super("taip"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '<')); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new TaipProtocolDecoder(TaipProtocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new TaipProtocolDecoder(TaipProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/TaipProtocolDecoder.java b/src/org/traccar/protocol/TaipProtocolDecoder.java deleted file mode 100644 index e7117a5c9..000000000 --- a/src/org/traccar/protocol/TaipProtocolDecoder.java +++ /dev/null @@ -1,248 +0,0 @@ -/* - * 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.helper.BitUtil; -import org.traccar.helper.Checksum; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.DateUtil; -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.Date; -import java.util.regex.Pattern; - -public class TaipProtocolDecoder extends BaseProtocolDecoder { - - public TaipProtocolDecoder(TaipProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .groupBegin() - .expression("R[EP]V") // type - .groupBegin() - .number("(dd)") // event - .number("(dddd)") // week - .number("(d)") // day - .groupEnd("?") - .number("(d{5})") // seconds - .or() - .expression("(?:RGP|RCQ|RBR)") // type - .number("(dd)?") // event - .number("(dd)(dd)(dd)") // date (mmddyy) - .number("(dd)(dd)(dd)") // time (hhmmss) - .groupEnd() - .groupBegin() - .number("([-+]dd)(d{5})") // latitude - .number("([-+]ddd)(d{5})") // longitude - .or() - .number("([-+])(dd)(dd.dddd)") // latitude - .number("([-+])(ddd)(dd.dddd)") // longitude - .groupEnd() - .number("(ddd)") // speed - .number("(ddd)") // course - .groupBegin() - .number("(xx)") // input - .number("(xx)") // satellites - .number("(ddd)") // battery - .number("(x{8})") // odometer - .number("[01]") // gps power - .groupEnd("?") - .any() - .compile(); - - private Date getTime(long week, long day, long seconds) { - DateBuilder dateBuilder = new DateBuilder() - .setDate(1980, 1, 6) - .addMillis(((week * 7 + day) * 24 * 60 * 60 + seconds) * 1000); - return dateBuilder.getDate(); - } - - private Date getTime(long seconds) { - DateBuilder dateBuilder = new DateBuilder(new Date()) - .setTime(0, 0, 0, 0) - .addMillis(seconds * 1000); - return DateUtil.correctDay(dateBuilder.getDate()); - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - int beginIndex = sentence.indexOf('>'); - if (beginIndex != -1) { - sentence = sentence.substring(beginIndex + 1); - } - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - Integer event = null; - - if (parser.hasNext(3)) { - event = parser.nextInt(); - position.setTime(getTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0))); - } else if (parser.hasNext()) { - position.setTime(getTime(parser.nextInt(0))); - } - - if (parser.hasNext()) { - event = parser.nextInt(); - } - - if (event != null) { - switch (event) { - case 22: - position.set(Position.KEY_ALARM, Position.ALARM_ACCELERATION); - break; - case 23: - position.set(Position.KEY_ALARM, Position.ALARM_BRAKING); - break; - case 24: - position.set(Position.KEY_ALARM, Position.ALARM_ACCIDENT); - break; - case 26: - case 28: - position.set(Position.KEY_ALARM, Position.ALARM_CORNERING); - break; - default: - position.set(Position.KEY_EVENT, event); - break; - } - } - - if (parser.hasNext(6)) { - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - } - - if (parser.hasNext(4)) { - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_DEG)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_DEG)); - } - if (parser.hasNext(6)) { - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - } - - position.setSpeed(UnitsConverter.knotsFromMph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - - if (parser.hasNext(4)) { - position.set(Position.KEY_INPUT, parser.nextHexInt(0)); - position.set(Position.KEY_SATELLITES, parser.nextHexInt(0)); - position.set(Position.KEY_BATTERY, parser.nextInt(0)); - position.set(Position.KEY_ODOMETER, parser.nextLong(16, 0)); - } - - position.setValid(true); - - String[] attributes = null; - beginIndex = sentence.indexOf(';'); - if (beginIndex != -1) { - int endIndex = sentence.indexOf('<', beginIndex); - if (endIndex == -1) { - endIndex = sentence.length(); - } - attributes = sentence.substring(beginIndex, endIndex).split(";"); - } - - return decodeAttributes(channel, remoteAddress, position, attributes); - } - - private Position decodeAttributes( - Channel channel, SocketAddress remoteAddress, Position position, String[] attributes) { - - String uniqueId = null; - DeviceSession deviceSession = null; - String messageIndex = null; - - if (attributes != null) { - for (String attribute : attributes) { - int index = attribute.indexOf('='); - if (index != -1) { - String key = attribute.substring(0, index).toLowerCase(); - String value = attribute.substring(index + 1); - switch (key) { - case "id": - uniqueId = value; - deviceSession = getDeviceSession(channel, remoteAddress, value); - if (deviceSession != null) { - position.setDeviceId(deviceSession.getDeviceId()); - } - break; - case "io": - position.set(Position.KEY_IGNITION, BitUtil.check(value.charAt(0) - '0', 0)); - position.set(Position.KEY_CHARGE, BitUtil.check(value.charAt(0) - '0', 1)); - position.set(Position.KEY_OUTPUT, value.charAt(1) - '0'); - position.set(Position.KEY_INPUT, value.charAt(2) - '0'); - break; - case "ix": - position.set(Position.PREFIX_IO + 1, value); - break; - case "ad": - position.set(Position.PREFIX_ADC + 1, Integer.parseInt(value)); - break; - case "sv": - position.set(Position.KEY_SATELLITES, Integer.parseInt(value)); - break; - case "bl": - position.set(Position.KEY_BATTERY, Integer.parseInt(value) * 0.001); - break; - case "vo": - position.set(Position.KEY_ODOMETER, Long.parseLong(value)); - break; - default: - position.set(key, value); - break; - } - } else if (attribute.startsWith("#")) { - messageIndex = attribute; - } - } - } - - if (deviceSession != null) { - if (channel != null) { - if (messageIndex != null) { - String response = ">ACK;" + messageIndex + ";ID=" + uniqueId + ";*"; - response += String.format("%02X", Checksum.xor(response)) + "<"; - channel.write(response, remoteAddress); - } else { - channel.write(uniqueId, remoteAddress); - } - } - - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/TelicFrameDecoder.java b/src/org/traccar/protocol/TelicFrameDecoder.java deleted file mode 100644 index 245be28fb..000000000 --- a/src/org/traccar/protocol/TelicFrameDecoder.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class TelicFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 4) { - return null; - } - - long length = buf.getUnsignedInt(buf.readerIndex()); - - if (length < 1024) { - if (buf.readableBytes() >= length + 4) { - buf.readUnsignedInt(); - return buf.readBytes((int) length); - } - } else { - int endIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) 0); - if (endIndex >= 0) { - ChannelBuffer frame = buf.readBytes(endIndex - buf.readerIndex()); - buf.readByte(); - if (frame.readableBytes() > 0) { - return frame; - } - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/TelicProtocol.java b/src/org/traccar/protocol/TelicProtocol.java deleted file mode 100644 index fdd0b94c6..000000000 --- a/src/org/traccar/protocol/TelicProtocol.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2015 - 2016 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 java.nio.ByteOrder; -import java.util.List; - -public class TelicProtocol extends BaseProtocol { - - public TelicProtocol() { - super("telic"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new TelicFrameDecoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new TelicProtocolDecoder(TelicProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/TelicProtocolDecoder.java b/src/org/traccar/protocol/TelicProtocolDecoder.java deleted file mode 100644 index 2c0d714c6..000000000 --- a/src/org/traccar/protocol/TelicProtocolDecoder.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2014 - 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.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 TelicProtocolDecoder extends BaseProtocolDecoder { - - public TelicProtocolDecoder(TelicProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("dddd") - .number("(d{6}|d{15})") // device id - .number("(d{1,2}),") // type - .number("d{12},") // event time - .number("d+,") - .number("(dd)(dd)(dd)") // date (ddmmyy) - .number("(dd)(dd)(dd),") // time (hhmmss) - .groupBegin() - .number("(ddd)(dd)(dddd),") // longitude - .number("(dd)(dd)(dddd),") // latitude - .or() - .number("(-?d+),") // longitude - .number("(-?d+),") // latitude - .groupEnd() - .number("(d),") // validity - .number("(d+),") // speed - .number("(d+),") // course - .number("(d+)?,") // satellites - .expression("(?:[^,]*,){7}") - .number("(d+),") // battery - .any() - .compile(); - - private String decodeAlarm(int eventId) { - - switch (eventId) { - case 1: - return Position.ALARM_POWER_ON; - case 2: - return Position.ALARM_SOS; - case 5: - return Position.ALARM_POWER_OFF; - case 7: - return Position.ALARM_GEOFENCE_ENTER; - case 8: - return Position.ALARM_GEOFENCE_EXIT; - case 22: - return Position.ALARM_LOW_BATTERY; - case 25: - return Position.ALARM_MOVEMENT; - default: - return null; - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - int event = parser.nextInt(0); - position.set(Position.KEY_EVENT, event); - - position.set(Position.KEY_ALARM, decodeAlarm(event)); - - if (event == 11) { - position.set(Position.KEY_IGNITION, true); - } else if (event == 12) { - position.set(Position.KEY_IGNITION, false); - } - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - if (parser.hasNext(6)) { - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_MIN_MIN)); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_MIN_MIN)); - } - - if (parser.hasNext(2)) { - position.setLongitude(parser.nextDouble(0) / 10000); - position.setLatitude(parser.nextDouble(0) / 10000); - } - - position.setValid(parser.nextInt(0) != 1); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - - if (parser.hasNext()) { - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - } - - position.set(Position.KEY_BATTERY, parser.nextInt(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/TeltonikaFrameDecoder.java b/src/org/traccar/protocol/TeltonikaFrameDecoder.java deleted file mode 100644 index e7313b722..000000000 --- a/src/org/traccar/protocol/TeltonikaFrameDecoder.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class TeltonikaFrameDecoder extends FrameDecoder { - - private static final int MESSAGE_MINIMUM_LENGTH = 12; - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - // Check minimum length - if (buf.readableBytes() < MESSAGE_MINIMUM_LENGTH) { - return null; - } - - // Read packet - int length = buf.getUnsignedShort(buf.readerIndex()); - if (length > 0) { - if (buf.readableBytes() >= (length + 2)) { - return buf.readBytes(length + 2); - } - } else { - int dataLength = buf.getInt(buf.readerIndex() + 4); - if (buf.readableBytes() >= (dataLength + 12)) { - return buf.readBytes(dataLength + 12); - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/TeltonikaProtocol.java b/src/org/traccar/protocol/TeltonikaProtocol.java deleted file mode 100644 index d0177da97..000000000 --- a/src/org/traccar/protocol/TeltonikaProtocol.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2015 - 2016 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.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class TeltonikaProtocol extends BaseProtocol { - - public TeltonikaProtocol() { - super("teltonika"); - setSupportedDataCommands( - Command.TYPE_CUSTOM); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new TeltonikaFrameDecoder()); - pipeline.addLast("objectEncoder", new TeltonikaProtocolEncoder()); - pipeline.addLast("objectDecoder", new TeltonikaProtocolDecoder(TeltonikaProtocol.this, false)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectEncoder", new TeltonikaProtocolEncoder()); - pipeline.addLast("objectDecoder", new TeltonikaProtocolDecoder(TeltonikaProtocol.this, true)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/TeltonikaProtocolDecoder.java b/src/org/traccar/protocol/TeltonikaProtocolDecoder.java deleted file mode 100644 index 80f0045d5..000000000 --- a/src/org/traccar/protocol/TeltonikaProtocolDecoder.java +++ /dev/null @@ -1,453 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class TeltonikaProtocolDecoder extends BaseProtocolDecoder { - - private boolean connectionless; - private boolean extended; - - public void setExtended(boolean extended) { - this.extended = extended; - } - - public TeltonikaProtocolDecoder(TeltonikaProtocol protocol, boolean connectionless) { - super(protocol); - this.connectionless = connectionless; - this.extended = Context.getConfig().getBoolean(getProtocolName() + ".extended"); - } - - private DeviceSession parseIdentification(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - - int length = buf.readUnsignedShort(); - String imei = buf.toString(buf.readerIndex(), length, StandardCharsets.US_ASCII); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - - if (channel != null) { - ChannelBuffer response = ChannelBuffers.directBuffer(1); - if (deviceSession != null) { - response.writeByte(1); - } else { - response.writeByte(0); - } - channel.write(response); - } - return deviceSession; - } - - public static final int CODEC_GH3000 = 0x07; - public static final int CODEC_FM4X00 = 0x08; - public static final int CODEC_12 = 0x0C; - - private void decodeSerial(Position position, ChannelBuffer buf) { - - getLastLocation(position, null); - - position.set(Position.KEY_TYPE, buf.readUnsignedByte()); - - position.set(Position.KEY_RESULT, buf.readBytes(buf.readInt()).toString(StandardCharsets.US_ASCII)); - - } - - private long readValue(ChannelBuffer buf, int length, boolean signed) { - switch (length) { - case 1: - return signed ? buf.readByte() : buf.readUnsignedByte(); - case 2: - return signed ? buf.readShort() : buf.readUnsignedShort(); - case 4: - return signed ? buf.readInt() : buf.readUnsignedInt(); - default: - return buf.readLong(); - } - } - - private void decodeOtherParameter(Position position, int id, ChannelBuffer buf, int length) { - switch (id) { - case 1: - case 2: - case 3: - case 4: - position.set("di" + id, readValue(buf, length, false)); - break; - case 9: - position.set(Position.PREFIX_ADC + 1, readValue(buf, length, false)); - break; - case 17: - position.set("axisX", readValue(buf, length, true)); - break; - case 18: - position.set("axisY", readValue(buf, length, true)); - break; - case 19: - position.set("axisZ", readValue(buf, length, true)); - break; - case 21: - position.set(Position.KEY_RSSI, readValue(buf, length, false)); - break; - case 66: - position.set(Position.KEY_POWER, readValue(buf, length, false) * 0.001); - break; - case 67: - position.set(Position.KEY_BATTERY, readValue(buf, length, false) * 0.001); - break; - case 72: - position.set(Position.PREFIX_TEMP + 1, readValue(buf, length, true) * 0.1); - break; - case 73: - position.set(Position.PREFIX_TEMP + 2, readValue(buf, length, true) * 0.1); - break; - case 74: - position.set(Position.PREFIX_TEMP + 3, readValue(buf, length, true) * 0.1); - break; - case 78: - position.set(Position.KEY_DRIVER_UNIQUE_ID, String.format("%016X", readValue(buf, length, false))); - break; - case 80: - position.set("workMode", readValue(buf, length, false)); - break; - case 179: - position.set(Position.PREFIX_OUT + 1, readValue(buf, length, false) == 1); - break; - case 180: - position.set(Position.PREFIX_OUT + 2, readValue(buf, length, false) == 1); - break; - case 181: - position.set(Position.KEY_PDOP, readValue(buf, length, false) * 0.1); - break; - case 182: - position.set(Position.KEY_HDOP, readValue(buf, length, false) * 0.1); - break; - case 239: - position.set(Position.KEY_IGNITION, readValue(buf, length, false) == 1); - break; - case 240: - position.set(Position.KEY_MOTION, readValue(buf, length, false) == 1); - break; - case 241: - position.set(Position.KEY_OPERATOR, readValue(buf, length, false)); - break; - default: - position.set(Position.PREFIX_IO + id, readValue(buf, length, false)); - break; - } - } - - private void decodeGh3000Parameter(Position position, int id, ChannelBuffer buf, int length) { - switch (id) { - case 1: - position.set(Position.KEY_BATTERY_LEVEL, readValue(buf, length, false)); - break; - case 2: - position.set("usbConnected", readValue(buf, length, false) == 1); - break; - case 5: - position.set("uptime", readValue(buf, length, false)); - break; - case 20: - position.set(Position.KEY_HDOP, readValue(buf, length, false) * 0.1); - break; - case 21: - position.set(Position.KEY_VDOP, readValue(buf, length, false) * 0.1); - break; - case 22: - position.set(Position.KEY_PDOP, readValue(buf, length, false) * 0.1); - break; - case 67: - position.set(Position.KEY_BATTERY, readValue(buf, length, false) * 0.001); - break; - case 221: - position.set("button", readValue(buf, length, false)); - break; - case 222: - if (readValue(buf, length, false) == 1) { - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - } - break; - case 240: - position.set(Position.KEY_MOTION, readValue(buf, length, false) == 1); - break; - case 244: - position.set(Position.KEY_ROAMING, readValue(buf, length, false) == 1); - break; - default: - position.set(Position.PREFIX_IO + id, readValue(buf, length, false)); - break; - } - } - - private void decodeParameter(Position position, int id, ChannelBuffer buf, int length, int codec) { - if (codec == CODEC_GH3000) { - decodeGh3000Parameter(position, id, buf, length); - } else { - decodeOtherParameter(position, id, buf, length); - } - } - - private void decodeNetwork(Position position) { - long cid = position.getLong(Position.PREFIX_IO + 205); - int lac = position.getInteger(Position.PREFIX_IO + 206); - if (cid != 0 && lac != 0) { - CellTower cellTower = CellTower.fromLacCid(lac, cid); - long operator = position.getInteger(Position.KEY_OPERATOR); - if (operator != 0) { - cellTower.setOperator(operator); - } - position.setNetwork(new Network(cellTower)); - } - } - - private void decodeLocation(Position position, ChannelBuffer buf, int codec) { - - int globalMask = 0x0f; - - if (codec == CODEC_GH3000) { - - long time = buf.readUnsignedInt() & 0x3fffffff; - time += 1167609600; // 2007-01-01 00:00:00 - - globalMask = buf.readUnsignedByte(); - if (BitUtil.check(globalMask, 0)) { - - position.setTime(new Date(time * 1000)); - - int locationMask = buf.readUnsignedByte(); - - if (BitUtil.check(locationMask, 0)) { - position.setLatitude(buf.readFloat()); - position.setLongitude(buf.readFloat()); - } - - if (BitUtil.check(locationMask, 1)) { - position.setAltitude(buf.readUnsignedShort()); - } - - if (BitUtil.check(locationMask, 2)) { - position.setCourse(buf.readUnsignedByte() * 360.0 / 256); - } - - if (BitUtil.check(locationMask, 3)) { - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - } - - if (BitUtil.check(locationMask, 4)) { - int satellites = buf.readUnsignedByte(); - position.set(Position.KEY_SATELLITES, satellites); - position.setValid(satellites >= 3); - } - - if (BitUtil.check(locationMask, 5)) { - CellTower cellTower = CellTower.fromLacCid(buf.readUnsignedShort(), buf.readUnsignedShort()); - - if (BitUtil.check(locationMask, 6)) { - cellTower.setSignalStrength((int) buf.readUnsignedByte()); - } - - if (BitUtil.check(locationMask, 7)) { - cellTower.setOperator(buf.readUnsignedInt()); - } - - position.setNetwork(new Network(cellTower)); - - } else { - if (BitUtil.check(locationMask, 6)) { - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - } - if (BitUtil.check(locationMask, 7)) { - position.set(Position.KEY_OPERATOR, buf.readUnsignedInt()); - } - } - - } else { - - getLastLocation(position, new Date(time * 1000)); - - } - - } else { - - position.setTime(new Date(buf.readLong())); - - position.set("priority", buf.readUnsignedByte()); - - position.setLongitude(buf.readInt() / 10000000.0); - position.setLatitude(buf.readInt() / 10000000.0); - position.setAltitude(buf.readShort()); - position.setCourse(buf.readUnsignedShort()); - - int satellites = buf.readUnsignedByte(); - position.set(Position.KEY_SATELLITES, satellites); - - position.setValid(satellites != 0); - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort())); - - position.set(Position.KEY_EVENT, buf.readUnsignedByte()); - - buf.readUnsignedByte(); // total IO data records - - } - - // Read 1 byte data - if (BitUtil.check(globalMask, 1)) { - int cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - decodeParameter(position, buf.readUnsignedByte(), buf, 1, codec); - } - } - - // Read 2 byte data - if (BitUtil.check(globalMask, 2)) { - int cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - decodeParameter(position, buf.readUnsignedByte(), buf, 2, codec); - } - } - - // Read 4 byte data - if (BitUtil.check(globalMask, 3)) { - int cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - decodeParameter(position, buf.readUnsignedByte(), buf, 4, codec); - } - } - - // Read 8 byte data - if (codec == CODEC_FM4X00) { - int cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - decodeOtherParameter(position, buf.readUnsignedByte(), buf, 8); - } - } - - // Read 16 byte data - if (extended) { - int cnt = buf.readUnsignedByte(); - for (int j = 0; j < cnt; j++) { - position.set(Position.PREFIX_IO + buf.readUnsignedByte(), ChannelBuffers.hexDump(buf.readBytes(16))); - } - } - - decodeNetwork(position); - - } - - private List<Position> parseData( - Channel channel, SocketAddress remoteAddress, ChannelBuffer buf, int locationPacketId, String... imei) { - List<Position> positions = new LinkedList<>(); - - if (!connectionless) { - buf.readUnsignedInt(); // data length - } - - int codec = buf.readUnsignedByte(); - int count = buf.readUnsignedByte(); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - - if (deviceSession == null) { - return null; - } - - for (int i = 0; i < count; i++) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - - position.setDeviceId(deviceSession.getDeviceId()); - - if (codec == CODEC_12) { - decodeSerial(position, buf); - } else { - decodeLocation(position, buf, codec); - } - - positions.add(position); - } - - if (channel != null) { - if (connectionless) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeShort(5); - response.writeShort(0); - response.writeByte(0x01); - response.writeByte(locationPacketId); - response.writeByte(count); - channel.write(response, remoteAddress); - } else { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeInt(count); - channel.write(response); - } - } - - return positions; - } - - @Override - protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - if (connectionless) { - return decodeUdp(channel, remoteAddress, buf); - } else { - return decodeTcp(channel, remoteAddress, buf); - } - } - - private Object decodeTcp(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) throws Exception { - - if (buf.getUnsignedShort(0) > 0) { - parseIdentification(channel, remoteAddress, buf); - } else { - buf.skipBytes(4); - return parseData(channel, remoteAddress, buf, 0); - } - - return null; - } - - private Object decodeUdp(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) throws Exception { - - buf.readUnsignedShort(); // length - buf.readUnsignedShort(); // packet id - buf.readUnsignedByte(); // packet type - int locationPacketId = buf.readUnsignedByte(); - String imei = buf.readBytes(buf.readUnsignedShort()).toString(StandardCharsets.US_ASCII); - - return parseData(channel, remoteAddress, buf, locationPacketId, imei); - - } - -} diff --git a/src/org/traccar/protocol/TeltonikaProtocolEncoder.java b/src/org/traccar/protocol/TeltonikaProtocolEncoder.java deleted file mode 100644 index fd6eae744..000000000 --- a/src/org/traccar/protocol/TeltonikaProtocolEncoder.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.traccar.BaseProtocolEncoder; -import org.traccar.helper.Checksum; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import java.nio.charset.StandardCharsets; - -public class TeltonikaProtocolEncoder extends BaseProtocolEncoder { - - private ChannelBuffer encodeContent(String content) { - - ChannelBuffer buf = ChannelBuffers.dynamicBuffer(); - - buf.writeInt(0); - buf.writeInt(content.length() + 10); - buf.writeByte(TeltonikaProtocolDecoder.CODEC_12); - buf.writeByte(1); // quantity - buf.writeByte(5); // type - buf.writeInt(content.length() + 2); - buf.writeBytes(content.getBytes(StandardCharsets.US_ASCII)); - buf.writeByte('\r'); - buf.writeByte('\n'); - buf.writeByte(1); // quantity - buf.writeInt(Checksum.crc16(Checksum.CRC16_IBM, buf.toByteBuffer(8, buf.writerIndex() - 8))); - - return buf; - } - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_CUSTOM: - return encodeContent(command.getString(Command.KEY_DATA)); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/ThinkRaceProtocol.java b/src/org/traccar/protocol/ThinkRaceProtocol.java deleted file mode 100644 index 98f43e2e3..000000000 --- a/src/org/traccar/protocol/ThinkRaceProtocol.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class ThinkRaceProtocol extends BaseProtocol { - - public ThinkRaceProtocol() { - super("thinkrace"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2 + 12 + 1 + 1, 2, 2, 0)); - pipeline.addLast("objectDecoder", new ThinkRaceProtocolDecoder(ThinkRaceProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/ThinkRaceProtocolDecoder.java b/src/org/traccar/protocol/ThinkRaceProtocolDecoder.java deleted file mode 100644 index 4a97fa1a1..000000000 --- a/src/org/traccar/protocol/ThinkRaceProtocolDecoder.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; - -public class ThinkRaceProtocolDecoder extends BaseProtocolDecoder { - - public ThinkRaceProtocolDecoder(ThinkRaceProtocol protocol) { - super(protocol); - } - - public static final int MSG_LOGIN = 0x80; - public static final int MSG_GPS = 0x90; - - private static double convertCoordinate(long raw, boolean negative) { - long degrees = raw / 1000000; - double minutes = (raw % 1000000) * 0.0001; - double result = degrees + minutes / 60; - if (negative) { - result = -result; - } - return result; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - ChannelBuffer id = buf.readBytes(12); - buf.readUnsignedByte(); // separator - int type = buf.readUnsignedByte(); - buf.readUnsignedShort(); // length - - if (type == MSG_LOGIN) { - - int command = buf.readUnsignedByte(); // 0x00 - heartbeat - - if (command == 0x01) { - String imei = buf.toString(buf.readerIndex(), 15, StandardCharsets.US_ASCII); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession != null && channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeByte(0x48); response.writeByte(0x52); // header - response.writeBytes(id); - response.writeByte(0x2c); // separator - response.writeByte(type); - response.writeShort(0x0002); // length - response.writeShort(0x8000); - response.writeShort(0x0000); // checksum - channel.write(response); - } - } - - } else if (type == MSG_GPS) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - - int flags = buf.readUnsignedByte(); - - position.setValid(true); - position.setLatitude(convertCoordinate(buf.readUnsignedInt(), !BitUtil.check(flags, 0))); - position.setLongitude(convertCoordinate(buf.readUnsignedInt(), !BitUtil.check(flags, 1))); - - position.setSpeed(buf.readUnsignedByte()); - position.setCourse(buf.readUnsignedByte()); - - position.setNetwork(new Network( - CellTower.fromLacCid(buf.readUnsignedShort(), buf.readUnsignedShort()))); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Tk102Protocol.java b/src/org/traccar/protocol/Tk102Protocol.java deleted file mode 100644 index 962f2401b..000000000 --- a/src/org/traccar/protocol/Tk102Protocol.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2015 - 2016 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class Tk102Protocol extends BaseProtocol { - - public Tk102Protocol() { - super("tk102"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 1 + 1 + 10, 1, 1, 0)); - pipeline.addLast("objectDecoder", new Tk102ProtocolDecoder(Tk102Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Tk102ProtocolDecoder.java b/src/org/traccar/protocol/Tk102ProtocolDecoder.java deleted file mode 100644 index 41d5b7436..000000000 --- a/src/org/traccar/protocol/Tk102ProtocolDecoder.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2013 - 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.regex.Pattern; - -public class Tk102ProtocolDecoder extends BaseProtocolDecoder { - - public Tk102ProtocolDecoder(Tk102Protocol protocol) { - super(protocol); - } - - public static final int MSG_LOGIN_REQUEST = 0x80; - public static final int MSG_LOGIN_REQUEST_2 = 0x21; - public static final int MSG_LOGIN_RESPONSE = 0x00; - public static final int MSG_HEARTBEAT_REQUEST = 0xF0; - public static final int MSG_HEARTBEAT_RESPONSE = 0xFF; - public static final int MSG_REPORT_ONCE = 0x90; - public static final int MSG_REPORT_INTERVAL = 0x93; - - public static final int MODE_GPRS = 0x30; - public static final int MODE_GPRS_SMS = 0x33; - - private static final Pattern PATTERN = new PatternBuilder() - .text("(") - .expression("[A-Z]+") - .number("(dd)(dd)(dd)") // time (hhmmss) - .expression("([AV])") // validity - .number("(dd)(dd.dddd)([NS])") // latitude - .number("(ddd)(dd.dddd)([EW])") // longitude - .number("(ddd.ddd)") // speed - .number("(dd)(dd)(dd)") // date (ddmmyy) - .any() - .text(")") - .compile(); - - private void sendResponse(Channel channel, int type, ChannelBuffer dataSequence, ChannelBuffer content) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeByte('['); - response.writeByte(type); - response.writeBytes(dataSequence); - response.writeByte(content.readableBytes()); - response.writeBytes(content); - response.writeByte(']'); - channel.write(response); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(1); // header - int type = buf.readUnsignedByte(); - ChannelBuffer dataSequence = buf.readBytes(10); - int length = buf.readUnsignedByte(); - - if (type == MSG_LOGIN_REQUEST || type == MSG_LOGIN_REQUEST_2) { - - ChannelBuffer data = buf.readBytes(length); - - String id; - if (type == MSG_LOGIN_REQUEST) { - id = data.toString(StandardCharsets.US_ASCII); - } else { - id = data.copy(1, 15).toString(StandardCharsets.US_ASCII); - } - - if (getDeviceSession(channel, remoteAddress, id) != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeByte(MODE_GPRS); - response.writeBytes(data); - sendResponse(channel, MSG_LOGIN_RESPONSE, dataSequence, response); - } - - } else if (type == MSG_HEARTBEAT_REQUEST) { - - sendResponse(channel, MSG_HEARTBEAT_RESPONSE, dataSequence, buf.readBytes(length)); - - } else { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Parser parser = new Parser(PATTERN, buf.readBytes(length).toString(StandardCharsets.US_ASCII)); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Tk103Protocol.java b/src/org/traccar/protocol/Tk103Protocol.java deleted file mode 100644 index 07a68e2d8..000000000 --- a/src/org/traccar/protocol/Tk103Protocol.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2017 Christoph Krey (c@ckrey.de) - * Copyright 2015 - 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.bootstrap.ConnectionlessBootstrap; -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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class Tk103Protocol extends BaseProtocol { - - public Tk103Protocol() { - super("tk103"); - setSupportedDataCommands( - Command.TYPE_POSITION_SINGLE, - Command.TYPE_POSITION_PERIODIC, - Command.TYPE_POSITION_STOP, - Command.TYPE_GET_VERSION, - Command.TYPE_REBOOT_DEVICE, - Command.TYPE_SET_ODOMETER, - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, ')')); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new Tk103ProtocolEncoder()); - pipeline.addLast("objectDecoder", new Tk103ProtocolDecoder(Tk103Protocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new Tk103ProtocolEncoder()); - pipeline.addLast("objectDecoder", new Tk103ProtocolDecoder(Tk103Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Tk103ProtocolDecoder.java b/src/org/traccar/protocol/Tk103ProtocolDecoder.java deleted file mode 100644 index be3def453..000000000 --- a/src/org/traccar/protocol/Tk103ProtocolDecoder.java +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright 2012 - 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.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class Tk103ProtocolDecoder extends BaseProtocolDecoder { - - private boolean decodeLow; - - public Tk103ProtocolDecoder(Tk103Protocol protocol) { - super(protocol); - decodeLow = Context.getConfig().getBoolean(getProtocolName() + ".decodeLow"); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("(d+)(,)?") // device id - .expression("(.{4}),?") // command - .number("(d*)") - .number("(dd)(dd)(dd),?") // date (mmddyy if comma-delimited, otherwise yyddmm) - .expression("([AV]),?") // validity - .number("(d+)(dd.d+)") // latitude - .expression("([NS]),?") - .number("(d+)(dd.d+)") // longitude - .expression("([EW]),?") - .number("(d+.d)(?:d*,)?") // speed - .number("(dd)(dd)(dd),?") // time (hhmmss) - .number("(d+.?d{1,2}),?") // course - .groupBegin() - .number("([01])") // charge - .number("([01])") // ignition - .number("(x)") // io - .number("(x)") // io - .number("(x)") // io - .number("(xxx),?") // fuel - .groupEnd("?") - .number("(?:L(x+))?") // odometer - .any() - .number("([+-]ddd.d)?") // temperature - .text(")").optional() - .compile(); - - private static final Pattern PATTERN_BATTERY = new PatternBuilder() - .number("(d+),") // device id - .text("ZC20,") - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("d+,") // battery level - .number("(d+),") // battery voltage - .number("(d+),") // power voltage - .number("d+") // installed - .compile(); - - private static final Pattern PATTERN_NETWORK = new PatternBuilder() - .number("(d{12})") // device id - .text("BZ00,") - .number("(d+),") // mcc - .number("(d+),") // mnc - .number("(x+),") // lac - .number("(x+),") // cid - .any() - .compile(); - - private String decodeAlarm(int value) { - switch (value) { - case 1: - return Position.ALARM_ACCIDENT; - case 2: - return Position.ALARM_SOS; - case 3: - return Position.ALARM_VIBRATION; - case 4: - return Position.ALARM_LOW_SPEED; - case 5: - return Position.ALARM_OVERSPEED; - case 6: - return Position.ALARM_GEOFENCE_EXIT; - default: - return null; - } - } - - private void decodeType(Position position, String type, String data) { - switch (type) { - case "BO01": - position.set(Position.KEY_ALARM, decodeAlarm(data.charAt(0) - '0')); - break; - case "ZC11": - position.set(Position.KEY_ALARM, Position.ALARM_MOVEMENT); - break; - case "ZC12": - position.set(Position.KEY_ALARM, Position.ALARM_LOW_BATTERY); - break; - case "ZC13": - position.set(Position.KEY_ALARM, Position.ALARM_POWER_CUT); - break; - case "ZC15": - position.set(Position.KEY_IGNITION, true); - break; - case "ZC16": - position.set(Position.KEY_IGNITION, false); - break; - case "ZC17": - position.set(Position.KEY_ALARM, Position.ALARM_REMOVING); - break; - case "ZC25": - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - break; - case "ZC26": - position.set(Position.KEY_ALARM, Position.ALARM_TAMPERING); - break; - case "ZC27": - position.set(Position.KEY_ALARM, Position.ALARM_LOW_POWER); - break; - default: - break; - } - } - - private Position decodeBattery(Channel channel, SocketAddress remoteAddress, String sentence) { - Parser parser = new Parser(PATTERN_BATTERY, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - int battery = parser.nextInt(0); - if (battery != 65535) { - position.set(Position.KEY_BATTERY, battery * 0.01); - } - - int power = parser.nextInt(0); - if (power != 65535) { - position.set(Position.KEY_POWER, power * 0.1); - } - - return position; - } - - private Position decodeNetwork(Channel channel, SocketAddress remoteAddress, String sentence) { - Parser parser = new Parser(PATTERN_NETWORK, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, null); - - position.setNetwork(new Network(CellTower.from( - parser.nextInt(0), parser.nextInt(0), parser.nextHexInt(0), parser.nextHexInt(0)))); - - return position; - } - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - int beginIndex = sentence.indexOf('('); - if (beginIndex != -1) { - sentence = sentence.substring(beginIndex + 1); - } - - if (channel != null) { - String id = sentence.substring(0, 12); - String type = sentence.substring(12, 16); - if (type.equals("BP00")) { - channel.write("(" + id + "AP01HSO)"); - return null; - } else if (type.equals("BP05")) { - channel.write("(" + id + "AP05)"); - } - } - - if (sentence.contains("ZC20")) { - return decodeBattery(channel, remoteAddress, sentence); - } else if (sentence.contains("BZ00")) { - return decodeNetwork(channel, remoteAddress, sentence); - } - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - boolean alternative = parser.next() != null; - - decodeType(position, parser.next(), parser.next()); - - DateBuilder dateBuilder = new DateBuilder(); - if (alternative) { - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - } else { - dateBuilder.setDate(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - } - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - - position.setSpeed(convertSpeed(parser.nextDouble(0), "kmh")); - - dateBuilder.setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.setCourse(parser.nextDouble(0)); - - if (parser.hasNext(6)) { - position.set(Position.KEY_CHARGE, parser.nextInt() == 0); - position.set(Position.KEY_IGNITION, parser.nextInt() == 1); - - int mask1 = parser.nextHexInt(); - position.set(Position.PREFIX_IN + 2, BitUtil.check(mask1, 0) ? 1 : 0); - position.set("panic", BitUtil.check(mask1, 1) ? 1 : 0); - position.set(Position.PREFIX_OUT + 2, BitUtil.check(mask1, 2) ? 1 : 0); - if (decodeLow || BitUtil.check(mask1, 3)) { - position.set(Position.KEY_BLOCKED, BitUtil.check(mask1, 3) ? 1 : 0); - } - - int mask2 = parser.nextHexInt(); - for (int i = 0; i < 3; i++) { - if (decodeLow || BitUtil.check(mask2, i)) { - position.set("hs" + (3 - i), BitUtil.check(mask2, i) ? 1 : 0); - } - } - if (decodeLow || BitUtil.check(mask2, 3)) { - position.set(Position.KEY_DOOR, BitUtil.check(mask2, 3) ? 1 : 0); - } - - int mask3 = parser.nextHexInt(); - for (int i = 1; i <= 3; i++) { - if (decodeLow || BitUtil.check(mask3, i)) { - position.set("ls" + (3 - i + 1), BitUtil.check(mask3, i) ? 1 : 0); - } - } - - position.set(Position.KEY_FUEL_LEVEL, parser.nextHexInt()); - } - - if (parser.hasNext()) { - position.set(Position.KEY_ODOMETER, parser.nextLong(16, 0)); - } - - if (parser.hasNext()) { - position.set(Position.PREFIX_TEMP + 1, parser.nextDouble(0)); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/Tk103ProtocolEncoder.java b/src/org/traccar/protocol/Tk103ProtocolEncoder.java deleted file mode 100644 index 9e49b6ff1..000000000 --- a/src/org/traccar/protocol/Tk103ProtocolEncoder.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2017 Christoph Krey (c@ckrey.de) - * Copyright 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.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class Tk103ProtocolEncoder extends StringProtocolEncoder { - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_GET_VERSION: - return formatCommand(command, "({%s}AP07)", Command.KEY_UNIQUE_ID); - case Command.TYPE_REBOOT_DEVICE: - return formatCommand(command, "({%s}AT00)", Command.KEY_UNIQUE_ID); - case Command.TYPE_SET_ODOMETER: - return formatCommand(command, "({%s}AX01)", Command.KEY_UNIQUE_ID); - case Command.TYPE_POSITION_SINGLE: - return formatCommand(command, "({%s}AP00)", Command.KEY_UNIQUE_ID); - case Command.TYPE_POSITION_PERIODIC: - return formatCommand(command, "({%s}AR00%s0000)", Command.KEY_UNIQUE_ID, - String.format("%04X", command.getInteger(Command.KEY_FREQUENCY))); - case Command.TYPE_POSITION_STOP: - return formatCommand(command, "({%s}AR0000000000)", Command.KEY_UNIQUE_ID); - case Command.TYPE_ENGINE_STOP: - return formatCommand(command, "({%s}AV011)", Command.KEY_UNIQUE_ID); - case Command.TYPE_ENGINE_RESUME: - return formatCommand(command, "({%s}AV010)", Command.KEY_UNIQUE_ID); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Tlt2hProtocol.java b/src/org/traccar/protocol/Tlt2hProtocol.java deleted file mode 100644 index 752b0d8ef..000000000 --- a/src/org/traccar/protocol/Tlt2hProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class Tlt2hProtocol extends BaseProtocol { - - public Tlt2hProtocol() { - super("tlt2h"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(32 * 1024, "##\r\n")); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new Tlt2hProtocolDecoder(Tlt2hProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Tlt2hProtocolDecoder.java b/src/org/traccar/protocol/Tlt2hProtocolDecoder.java deleted file mode 100644 index cbc851de0..000000000 --- a/src/org/traccar/protocol/Tlt2hProtocolDecoder.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.LinkedList; -import java.util.List; -import java.util.regex.Pattern; - -public class Tlt2hProtocolDecoder extends BaseProtocolDecoder { - - public Tlt2hProtocolDecoder(Tlt2hProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN_HEADER = new PatternBuilder() - .number("#(d+)#") // imei - .expression("[^#]*#") - .number("d+#") - .expression("([^#]+)#") // status - .number("d+") // number of records - .compile(); - - private static final Pattern PATTERN_POSITION = new PatternBuilder() - .number("#(x+)?") // cell info - .text("$GPRMC,") - .number("(dd)(dd)(dd).d+,") // time (hhmmss.sss) - .expression("([AV]),") // validity - .number("(d+)(dd.d+),") // latitude - .expression("([NS]),") - .number("(d+)(dd.d+),") // longitude - .number("([EW]),") - .number("(d+.?d*)?,") // speed - .number("(d+.?d*)?,") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - sentence = sentence.trim(); - - String header = sentence.substring(0, sentence.indexOf('\r')); - Parser parser = new Parser(PATTERN_HEADER, header); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - String status = parser.next(); - - String[] messages = sentence.substring(sentence.indexOf('\n') + 1).split("\r\n"); - List<Position> positions = new LinkedList<>(); - - for (String message : messages) { - parser = new Parser(PATTERN_POSITION, message); - if (parser.matches()) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - parser.next(); // base station info - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.set(Position.KEY_STATUS, status); - - positions.add(position); - } - } - - return positions; - } - -} diff --git a/src/org/traccar/protocol/TlvProtocol.java b/src/org/traccar/protocol/TlvProtocol.java deleted file mode 100644 index da8d88b8a..000000000 --- a/src/org/traccar/protocol/TlvProtocol.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class TlvProtocol extends BaseProtocol { - - public TlvProtocol() { - super("tlv"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder('\0')); - pipeline.addLast("objectDecoder", new TlvProtocolDecoder(TlvProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/TlvProtocolDecoder.java b/src/org/traccar/protocol/TlvProtocolDecoder.java deleted file mode 100644 index 41d65be09..000000000 --- a/src/org/traccar/protocol/TlvProtocolDecoder.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; - -public class TlvProtocolDecoder extends BaseProtocolDecoder { - - public TlvProtocolDecoder(TlvProtocol protocol) { - super(protocol); - } - - private void sendResponse(Channel channel, String type, String... arguments) { - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeBytes(ChannelBuffers.copiedBuffer(type, StandardCharsets.US_ASCII)); - for (String argument : arguments) { - response.writeByte(argument.length()); - response.writeBytes(ChannelBuffers.copiedBuffer(argument, StandardCharsets.US_ASCII)); - } - response.writeByte(0); - channel.write(response); - } - } - - private String readArgument(ChannelBuffer buf) { - return buf.readBytes(buf.readUnsignedByte()).toString(StandardCharsets.US_ASCII); - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - String type = buf.readBytes(2).toString(StandardCharsets.US_ASCII); - - if (channel != null) { - switch (type) { - case "0A": - case "0C": - sendResponse(channel, type); - break; - case "0B": - sendResponse(channel, type, "1482202689", "10", "20", "15"); - break; - case "0E": - case "0F": - sendResponse(channel, type, "30", "Unknown"); - break; - default: - break; - } - } - - if (type.equals("0E")) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, readArgument(buf)); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(true); - position.setTime(new Date(Long.parseLong(readArgument(buf)) * 1000)); - - readArgument(buf); // location identifier - - position.setLongitude(Double.parseDouble(readArgument(buf))); - position.setLatitude(Double.parseDouble(readArgument(buf))); - position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble(readArgument(buf)))); - position.setCourse(Double.parseDouble(readArgument(buf))); - - position.set(Position.KEY_SATELLITES, Integer.parseInt(readArgument(buf))); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/TmgProtocol.java b/src/org/traccar/protocol/TmgProtocol.java deleted file mode 100644 index f30d61e9a..000000000 --- a/src/org/traccar/protocol/TmgProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class TmgProtocol extends BaseProtocol { - - public TmgProtocol() { - super("tmg"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new TmgProtocolDecoder(TmgProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/TmgProtocolDecoder.java b/src/org/traccar/protocol/TmgProtocolDecoder.java deleted file mode 100644 index b8458dd52..000000000 --- a/src/org/traccar/protocol/TmgProtocolDecoder.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 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.helper.BitUtil; -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 TmgProtocolDecoder extends BaseProtocolDecoder { - - public TmgProtocolDecoder(TmgProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$") - .expression("(...),") // type - .expression("[LH],") // history - .number("(d+),") // imei - .number("(dd)(dd)(dddd),") // date (ddmmyyyy) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(d),") // status - .number("(dd)(dd.d+),") // latitude - .expression("([NS]),") - .number("(ddd)(dd.d+),") // longitude - .expression("([EW]),") - .number("(d+.?d*),") // speed - .number("(d+.?d*),") // course - .number("(-?d+.?d*),") // altitude - .number("(d+.d+),") // hdop - .number("(d+),") // satellites - .number("(d+),") // visible satellites - .number("([^,]*),") // operator - .number("(d+),") // rssi - .number("[^,]*,") // cid - .expression("([01]),") // ignition - .number("(d+.?d*),") // battery - .number("(d+.?d*),") // power - .expression("([01]+),") // input - .expression("([01]+),") // output - .expression("[01]+,") // temper status - .number("(d+.?d*)[^,]*,") // adc1 - .number("(d+.?d*)[^,]*,") // adc2 - .number("d+.?d*,") // trip meter - .expression("([^,]*),") // software version - .expression("([^,]*),").optional() // rfid - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - String type = parser.next(); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - switch (type) { - case "rmv": - position.set(Position.KEY_ALARM, Position.ALARM_POWER_CUT); - break; - case "ebl": - position.set(Position.KEY_ALARM, Position.ALARM_LOW_POWER); - break; - case "ibl": - position.set(Position.KEY_ALARM, Position.ALARM_LOW_BATTERY); - break; - case "tmp": - case "smt": - case "btt": - position.set(Position.KEY_ALARM, Position.ALARM_TAMPERING); - break; - case "ion": - position.set(Position.KEY_IGNITION, true); - break; - case "iof": - position.set(Position.KEY_IGNITION, false); - break; - default: - break; - } - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setValid(parser.nextInt(0) > 0); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - position.set(Position.KEY_HDOP, parser.nextDouble(0)); - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - position.set(Position.KEY_SATELLITES_VISIBLE, parser.nextInt(0)); - position.set(Position.KEY_OPERATOR, parser.next()); - position.set(Position.KEY_RSSI, parser.nextInt(0)); - position.set(Position.KEY_IGNITION, parser.nextInt(0) == 1); - position.set(Position.KEY_BATTERY, parser.nextDouble(0)); - position.set(Position.KEY_POWER, parser.nextDouble(0)); - - int input = parser.nextBinInt(0); - int output = parser.nextBinInt(0); - - if (!BitUtil.check(input, 0)) { - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - } - - position.set(Position.KEY_INPUT, input); - position.set(Position.KEY_OUTPUT, output); - - position.set(Position.PREFIX_ADC + 1, parser.nextDouble(0)); - position.set(Position.PREFIX_ADC + 2, parser.nextDouble(0)); - position.set(Position.KEY_VERSION_FW, parser.next()); - position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/TopflytechProtocol.java b/src/org/traccar/protocol/TopflytechProtocol.java deleted file mode 100644 index 7d4b13ee6..000000000 --- a/src/org/traccar/protocol/TopflytechProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class TopflytechProtocol extends BaseProtocol { - - public TopflytechProtocol() { - super("topflytech"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, ')')); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new TopflytechProtocolDecoder(TopflytechProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/TopflytechProtocolDecoder.java b/src/org/traccar/protocol/TopflytechProtocolDecoder.java deleted file mode 100644 index 837ca2557..000000000 --- a/src/org/traccar/protocol/TopflytechProtocolDecoder.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2013 - 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class TopflytechProtocolDecoder extends BaseProtocolDecoder { - - public TopflytechProtocolDecoder(TopflytechProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("(") - .number("(d+)") // imei - .any() - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd)") // time (hhmmss) - .expression("([AV])") - .number("(dd)(dd.dddd)([NS])") // latitude - .number("(ddd)(dd.dddd)([EW])") // longitude - .number("(ddd.d)") // speed - .number("(d+.d+)") // course - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime()); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/TotemFrameDecoder.java b/src/org/traccar/protocol/TotemFrameDecoder.java deleted file mode 100644 index 6940d7b46..000000000 --- a/src/org/traccar/protocol/TotemFrameDecoder.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; -import org.traccar.helper.StringFinder; - -import java.nio.charset.StandardCharsets; - -public class TotemFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 10) { - return null; - } - - int beginIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new StringFinder("$$")); - if (beginIndex == -1) { - return null; - } else if (beginIndex > buf.readerIndex()) { - buf.readerIndex(beginIndex); - } - - int length; - - int flagIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new StringFinder("AA")); - if (flagIndex != -1 && flagIndex - beginIndex == 6) { - length = Integer.parseInt(buf.toString(buf.readerIndex() + 2, 4, StandardCharsets.US_ASCII)); - } else { - length = Integer.parseInt(buf.toString(buf.readerIndex() + 2, 2, StandardCharsets.US_ASCII), 16); - } - - if (length <= buf.readableBytes()) { - return buf.readBytes(length); - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/TotemProtocol.java b/src/org/traccar/protocol/TotemProtocol.java deleted file mode 100644 index 1c5cf5b02..000000000 --- a/src/org/traccar/protocol/TotemProtocol.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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; - -public class TotemProtocol extends BaseProtocol { - - public TotemProtocol() { - super("totem"); - setSupportedDataCommands( - Command.TYPE_ENGINE_RESUME, - Command.TYPE_ENGINE_STOP - ); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new TotemFrameDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectEncoder", new TotemProtocolEncoder()); - pipeline.addLast("objectDecoder", new TotemProtocolDecoder(TotemProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/TotemProtocolDecoder.java b/src/org/traccar/protocol/TotemProtocolDecoder.java deleted file mode 100644 index a3e8c9921..000000000 --- a/src/org/traccar/protocol/TotemProtocolDecoder.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright 2013 - 2016 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class TotemProtocolDecoder extends BaseProtocolDecoder { - - public TotemProtocolDecoder(TotemProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN1 = new PatternBuilder() - .text("$$") // header - .number("xx") // length - .number("(d+)|") // imei - .expression("(..)") // alarm - .text("$GPRMC,") - .number("(dd)(dd)(dd).d+,") // time (hhmmss) - .expression("([AV]),") // validity - .number("(d+)(dd.d+),([NS]),") // latitude - .number("(d+)(dd.d+),([EW]),") // longitude - .number("(d+.?d*)?,") // speed - .number("(d+.?d*)?,") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .expression("[^*]*").text("*") - .number("xx|") // checksum - .number("(d+.d+)|") // pdop - .number("(d+.d+)|") // hdop - .number("(d+.d+)|") // vdop - .number("(d+)|") // io status - .number("d+|") // battery time - .number("d") // charged - .number("(ddd)") // battery - .number("(dddd)|") // power - .number("(d+)|").optional() // adc - .number("x*(xxxx)") // lac - .number("(xxxx)|") // cid - .number("(d+)|") // temperature - .number("(d+.d+)|") // odometer - .number("d+|") // serial number - .any() - .number("xxxx") // checksum - .any() - .compile(); - - private static final Pattern PATTERN2 = new PatternBuilder() - .text("$$") // header - .number("xx") // length - .number("(d+)|") // imei - .expression("(..)") // alarm type - .number("(dd)(dd)(dd)") // date (ddmmyy) - .number("(dd)(dd)(dd)|") // time (hhmmss) - .expression("([AV])|") // validity - .number("(d+)(dd.d+)|") // latitude - .expression("([NS])|") - .number("(d+)(dd.d+)|") // longitude - .expression("([EW])|") - .number("(d+.d+)?|") // speed - .number("(d+)?|") // course - .number("(d+.d+)|") // hdop - .number("(d+)|") // io status - .number("d") // charged - .number("(dd)") // battery - .number("(dd)|") // external power - .number("(d+)|") // adc - .number("(xxxx)") // lac - .number("(xxxx)|") // cid - .number("(d+)|") // temperature - .number("(d+.d+)|") // odometer - .number("d+|") // serial number - .number("xxxx") // checksum - .any() - .compile(); - - private static final Pattern PATTERN3 = new PatternBuilder() - .text("$$") // header - .number("xx") // length - .number("(d+)|") // imei - .expression("(..)") // alarm type - .number("(dd)(dd)(dd)") // date (ddmmyy) - .number("(dd)(dd)(dd)") // time (hhmmss) - .number("(xxxx)") // io status - .expression("[01]") // charging - .number("(dd)") // battery - .number("(dd)") // external power - .number("(dddd)") // adc 1 - .number("(dddd)") // adc 2 - .number("(ddd)") // temperature 1 - .number("(ddd)") // temperature 2 - .number("(xxxx)") // lac - .number("(xxxx)") // cid - .expression("([AV])") // validity - .number("(dd)") // satellites - .number("(ddd)") // course - .number("(ddd)") // speed - .number("(dd.d)") // pdop - .number("(d{7})") // odometer - .number("(dd)(dd.dddd)([NS])") // latitude - .number("(ddd)(dd.dddd)([EW])") // longitude - .number("dddd") // serial number - .number("xxxx") // checksum - .any() - .compile(); - - private static final Pattern PATTERN4 = new PatternBuilder() - .text("$$") // header - .number("dddd") // length - .expression("A[ABC]") // type - .number("(d+)|") // imei - .number("(x{8})") // status - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd)") // time (hhmmss) - .number("(dd)") // battery - .number("(dd)") // external power - .number("(dddd)") // adc 1 - .groupBegin() - .groupBegin() - .number("(dddd)") // adc 2 - .number("(dddd)") // adc 3 - .number("(dddd)") // adc 4 - .groupEnd("?") - .number("(dddd)") // temperature 1 - .number("(dddd)") // temperature 2 - .groupEnd("?") - .number("(xxxx)") // lac - .number("(xxxx)") // cid - .number("(dd)") // satellites - .number("(dd)") // gsm (rssi) - .number("(ddd)") // course - .number("(ddd)") // speed - .number("(dd.d)") // hdop - .number("(d{7})") // odometer - .number("(dd)(dd.dddd)([NS])") // latitude - .number("(ddd)(dd.dddd)([EW])") // longitude - .number("dddd") // serial number - .number("xx") // checksum - .any() - .compile(); - - private String decodeAlarm(Short value) { - switch (value) { - case 0x01: - return Position.ALARM_SOS; - case 0x10: - return Position.ALARM_LOW_BATTERY; - case 0x11: - return Position.ALARM_OVERSPEED; - case 0x30: - return Position.ALARM_PARKING; - case 0x42: - return Position.ALARM_GEOFENCE_EXIT; - case 0x43: - return Position.ALARM_GEOFENCE_ENTER; - default: - return null; - } - } - - private boolean decode12(Position position, Parser parser, Pattern pattern) { - - if (parser.hasNext()) { - position.set(Position.KEY_ALARM, decodeAlarm(Short.parseShort(parser.next(), 16))); - } - DateBuilder dateBuilder = new DateBuilder(); - int year = 0, month = 0, day = 0; - if (pattern == PATTERN2) { - day = parser.nextInt(0); - month = parser.nextInt(0); - year = parser.nextInt(0); - } - dateBuilder.setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - if (pattern == PATTERN1) { - day = parser.nextInt(0); - month = parser.nextInt(0); - year = parser.nextInt(0); - } - if (year == 0) { - return false; // ignore invalid data - } - dateBuilder.setDate(year, month, day); - position.setTime(dateBuilder.getDate()); - - if (pattern == PATTERN1) { - position.set(Position.KEY_PDOP, parser.nextDouble()); - position.set(Position.KEY_HDOP, parser.nextDouble()); - position.set(Position.KEY_VDOP, parser.nextDouble()); - } else { - position.set(Position.KEY_HDOP, parser.nextDouble()); - } - - position.set(Position.PREFIX_IO + 1, parser.next()); - if (pattern == PATTERN1) { - position.set(Position.KEY_BATTERY, parser.nextDouble(0) * 0.01); - } else { - position.set(Position.KEY_BATTERY, parser.nextDouble(0) * 0.1); - } - position.set(Position.KEY_POWER, parser.nextDouble(0)); - position.set(Position.PREFIX_ADC + 1, parser.next()); - - int lac = parser.nextHexInt(0); - int cid = parser.nextHexInt(0); - if (lac != 0 && cid != 0) { - position.setNetwork(new Network(CellTower.fromLacCid(lac, cid))); - } - - position.set(Position.PREFIX_TEMP + 1, parser.next()); - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - - return true; - } - - private boolean decode3(Position position, Parser parser) { - - if (parser.hasNext()) { - position.set(Position.KEY_ALARM, decodeAlarm(Short.parseShort(parser.next(), 16))); - } - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.set(Position.PREFIX_IO + 1, parser.next()); - position.set(Position.KEY_BATTERY, parser.nextDouble(0) * 0.1); - position.set(Position.KEY_POWER, parser.nextDouble(0)); - position.set(Position.PREFIX_ADC + 1, parser.next()); - position.set(Position.PREFIX_ADC + 2, parser.next()); - position.set(Position.PREFIX_TEMP + 1, parser.next()); - position.set(Position.PREFIX_TEMP + 2, parser.next()); - - position.setNetwork(new Network( - CellTower.fromLacCid(parser.nextHexInt(0), parser.nextHexInt(0)))); - - position.setValid(parser.next().equals("A")); - position.set(Position.KEY_SATELLITES, parser.nextInt()); - position.setCourse(parser.nextDouble(0)); - position.setSpeed(parser.nextDouble(0)); - position.set(Position.KEY_PDOP, parser.nextDouble()); - position.set(Position.KEY_ODOMETER, parser.nextInt(0) * 1000); - - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - - return true; - } - - private boolean decode4(Position position, Parser parser) { - - position.set(Position.KEY_STATUS, parser.next()); - - position.setTime(parser.nextDateTime()); - - position.set(Position.KEY_BATTERY, parser.nextDouble(0) * 0.1); - position.set(Position.KEY_POWER, parser.nextDouble(0)); - - position.set(Position.PREFIX_ADC + 1, parser.next()); - position.set(Position.PREFIX_ADC + 2, parser.next()); - position.set(Position.PREFIX_ADC + 3, parser.next()); - position.set(Position.PREFIX_ADC + 4, parser.next()); - position.set(Position.PREFIX_TEMP + 1, parser.next()); - position.set(Position.PREFIX_TEMP + 2, parser.next()); - - CellTower cellTower = CellTower.fromLacCid(parser.nextHexInt(0), parser.nextHexInt(0)); - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - cellTower.setSignalStrength(parser.nextInt(0)); - position.setNetwork(new Network(cellTower)); - - position.setCourse(parser.nextDouble(0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.set(Position.KEY_HDOP, parser.nextDouble(0)); - position.set(Position.KEY_ODOMETER, parser.nextInt(0) * 1000); - - position.setValid(true); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - - return true; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - Pattern pattern = PATTERN3; - if (sentence.indexOf("A") == 6) { - pattern = PATTERN4; - } else if (sentence.contains("$GPRMC")) { - pattern = PATTERN1; - } else { - int index = sentence.indexOf('|'); - if (index != -1 && sentence.indexOf('|', index + 1) != -1) { - pattern = PATTERN2; - } - } - - Parser parser = new Parser(pattern, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - boolean result; - if (pattern == PATTERN1 || pattern == PATTERN2) { - result = decode12(position, parser, pattern); - } else if (pattern == PATTERN3) { - result = decode3(position, parser); - } else { - result = decode4(position, parser); - } - - if (channel != null) { - if (pattern == PATTERN4) { - channel.write("$$0014AA" + sentence.substring(sentence.length() - 6)); - } else { - channel.write("ACK OK\r\n"); - } - } - - return result ? position : null; - } - -} diff --git a/src/org/traccar/protocol/TotemProtocolEncoder.java b/src/org/traccar/protocol/TotemProtocolEncoder.java deleted file mode 100644 index ff41a7df3..000000000 --- a/src/org/traccar/protocol/TotemProtocolEncoder.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2015 Irving Gonzalez - * Copyright 2015 - 2016 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.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class TotemProtocolEncoder extends StringProtocolEncoder { - - @Override - protected Object encodeCommand(Command command) { - - initDevicePassword(command, "000000"); - - switch (command.getType()) { - // Assuming PIN 8 (Output C) is the power wire, like manual says but it can be PIN 5,7,8 - case Command.TYPE_ENGINE_STOP: - return formatCommand(command, "*{%s},025,C,1#", Command.KEY_DEVICE_PASSWORD); - case Command.TYPE_ENGINE_RESUME: - return formatCommand(command, "*{%s},025,C,0#", Command.KEY_DEVICE_PASSWORD); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Tr20Protocol.java b/src/org/traccar/protocol/Tr20Protocol.java deleted file mode 100644 index 8de004be9..000000000 --- a/src/org/traccar/protocol/Tr20Protocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class Tr20Protocol extends BaseProtocol { - - public Tr20Protocol() { - super("tr20"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new Tr20ProtocolDecoder(Tr20Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Tr20ProtocolDecoder.java b/src/org/traccar/protocol/Tr20ProtocolDecoder.java deleted file mode 100644 index 403a2fda2..000000000 --- a/src/org/traccar/protocol/Tr20ProtocolDecoder.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2012 - 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -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 Tr20ProtocolDecoder extends BaseProtocolDecoder { - - public Tr20ProtocolDecoder(Tr20Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN_PING = new PatternBuilder() - .text("%%") - .expression("[^,]+,") - .number("(d+)") - .compile(); - - private static final Pattern PATTERN_DATA = new PatternBuilder() - .text("%%") - .expression("([^,]+),") // id - .expression("([AL]),") // validity - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .expression("([NS])") - .number("(dd)(dd.d+)") // latitude - .expression("([EW])") - .number("(ddd)(dd.d+),") // longitude - .number("(d+),") // speed - .number("(d+),") // course - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN_PING, (String) msg); - if (parser.matches()) { - if (channel != null) { - channel.write("&&" + parser.next() + "\r\n"); // keep-alive response - } - return null; - } - - parser = new Parser(PATTERN_DATA, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(parser.next().equals("A")); - - position.setTime(parser.nextDateTime()); - - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - - return position; - } - -} diff --git a/src/org/traccar/protocol/Tr900Protocol.java b/src/org/traccar/protocol/Tr900Protocol.java deleted file mode 100644 index 40f287efa..000000000 --- a/src/org/traccar/protocol/Tr900Protocol.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class Tr900Protocol extends BaseProtocol { - - public Tr900Protocol() { - super("tr900"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new Tr900ProtocolDecoder(Tr900Protocol.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("objectDecoder", new Tr900ProtocolDecoder(Tr900Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Tr900ProtocolDecoder.java b/src/org/traccar/protocol/Tr900ProtocolDecoder.java deleted file mode 100644 index 7dbdc5697..000000000 --- a/src/org/traccar/protocol/Tr900ProtocolDecoder.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class Tr900ProtocolDecoder extends BaseProtocolDecoder { - - public Tr900ProtocolDecoder(Tr900Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number(">(d+),") // id - .number("d+,") // period - .number("(d),") // fix - .number("(dd)(dd)(dd),") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .expression("([EW])") - .number("(ddd)(dd.d+),") // longitude - .expression("([NS])") - .number("(dd)(dd.d+),") // latitude - .expression("[^,]*,") // command - .number("(d+.?d*),") // speed - .number("(d+.?d*),") // course - .number("(d+),") // gsm - .number("(d+),") // event - .number("(d+)-") // adc - .number("(d+),") // battery - .number("d+,") // impulses - .number("(d+),") // input - .number("(d+)") // status - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(parser.nextInt(0) == 1); - - position.setTime(parser.nextDateTime()); - - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG_MIN)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_RSSI, parser.nextDouble()); - position.set(Position.KEY_EVENT, parser.nextInt(0)); - position.set(Position.PREFIX_ADC + 1, parser.nextInt(0)); - position.set(Position.KEY_BATTERY, parser.nextInt(0)); - position.set(Position.KEY_INPUT, parser.next()); - position.set(Position.KEY_STATUS, parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/TrackboxProtocol.java b/src/org/traccar/protocol/TrackboxProtocol.java deleted file mode 100644 index c1aa5ac6a..000000000 --- a/src/org/traccar/protocol/TrackboxProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class TrackboxProtocol extends BaseProtocol { - - public TrackboxProtocol() { - super("trackbox"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new TrackboxProtocolDecoder(TrackboxProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/TrackboxProtocolDecoder.java b/src/org/traccar/protocol/TrackboxProtocolDecoder.java deleted file mode 100644 index 7e542af93..000000000 --- a/src/org/traccar/protocol/TrackboxProtocolDecoder.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2014 - 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class TrackboxProtocolDecoder extends BaseProtocolDecoder { - - public TrackboxProtocolDecoder(TrackboxProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("(dd)(dd)(dd).(ddd),") // time (hhmmss.sss) - .number("(dd)(dd.dddd)([NS]),") // latitude - .number("(ddd)(dd.dddd)([EW]),") // longitude - .number("(d+.d),") // hdop - .number("(-?d+.?d*),") // altitude - .number("(d),") // fix type - .number("(d+.d+),") // course - .number("d+.d+,") // speed (kph) - .number("(d+.d+),") // speed (knots) - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(d+)") // satellites - .compile(); - - private void sendResponse(Channel channel) { - if (channel != null) { - channel.write("=OK=\r\n"); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.startsWith("a=connect")) { - String id = sentence.substring(sentence.indexOf("i=") + 2); - if (getDeviceSession(channel, remoteAddress, id) != null) { - sendResponse(channel); - } - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - sendResponse(channel); - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - - position.set(Position.KEY_HDOP, parser.nextDouble()); - - position.setAltitude(parser.nextDouble(0)); - - int fix = parser.nextInt(0); - position.set(Position.KEY_GPS, fix); - position.setValid(fix > 0); - - position.setCourse(parser.nextDouble(0)); - position.setSpeed(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.set(Position.KEY_SATELLITES, parser.nextInt()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/TrakMateProtocol.java b/src/org/traccar/protocol/TrakMateProtocol.java deleted file mode 100644 index f6d9bf457..000000000 --- a/src/org/traccar/protocol/TrakMateProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class TrakMateProtocol extends BaseProtocol { - - public TrakMateProtocol() { - super("trakmate"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '#')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new TrakMateProtocolDecoder(TrakMateProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/TrakMateProtocolDecoder.java b/src/org/traccar/protocol/TrakMateProtocolDecoder.java deleted file mode 100644 index 8965a18b4..000000000 --- a/src/org/traccar/protocol/TrakMateProtocolDecoder.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright 2016 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.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.TimeZone; -import java.util.regex.Pattern; - -public class TrakMateProtocolDecoder extends BaseProtocolDecoder { - - private final TimeZone timeZone = TimeZone.getTimeZone("UTC"); - - public TrakMateProtocolDecoder(TrakMateProtocol protocol) { - super(protocol); - timeZone.setRawOffset(Context.getConfig().getInteger(getProtocolName() + ".timezone") * 1000); - } - - private static final Pattern PATTERN_SRT = new PatternBuilder() - .text("^TMSRT|") - .expression("([^ ]+)|") // uid - .number("(d+.d+)|") // latitude - .number("(d+.d+)|") // longitude - .number("(dd)(dd)(dd)|") // time (hhmmss) - .number("(dd)(dd)(dd)|") // date (ddmmyy) - .number("(d+.d+)|") // software ver - .number("(d+.d+)|") // Hardware ver - .any() - .compile(); - - private static final Pattern PATTERN_PER = new PatternBuilder() - .text("^TMPER|") - .expression("([^ ]+)|") // uid - .number("(d+)|") // seq - .number("(d+.d+)|") // latitude - .number("(d+.d+)|") // longitude - .number("(dd)(dd)(dd)|") // time (hhmmss) - .number("(dd)(dd)(dd)|") // date (ddmmyy) - .number("(d+.d+)|") // speed - .number("(d+.d+)|") // heading - .number("(d+)|") // ignition - .number("(d+)|") // dop1 - .number("(d+)|") // dop2 - .number("(d+.d+)|") // analog - .number("(d+.d+)|") // internal battery - .number("(d+.d+)|") // vehicle battery - .number("(d+.d+)|") // gps odometer - .number("(d+.d+)|") // pulse odometer - .number("(d+)|") // main power status - .number("(d+)|") // gps data validity - .number("(d+)|") // live or cache - .any() - .compile(); - - private static final Pattern PATTERN_ALT = new PatternBuilder() - .text("^TMALT|") - .expression("([^ ]+)|") // uid - .number("(d+)|") // seq - .number("(d+)|") // Alert type - .number("(d+)|") // Alert status - .number("(d+.d+)|") // latitude - .number("(d+.d+)|") // longitude - .number("(dd)(dd)(dd)|") // time (hhmmss) - .number("(dd)(dd)(dd)|") // date (ddmmyy) - .number("(d+.d+)|") // speed - .number("(d+.d+)|") // heading - .any() - .compile(); - - private String decodeAlarm(int value) { - switch (value) { - case 1: - return Position.ALARM_SOS; - case 3: - return Position.ALARM_GEOFENCE; - case 4: - return Position.ALARM_POWER_CUT; - default: - return null; - } - } - - private Object decodeSrt(Channel channel, SocketAddress remoteAddress, String sentence) { - - Parser parser = new Parser(PATTERN_SRT, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY)); - - position.set(Position.KEY_VERSION_FW, parser.next()); - position.set(Position.KEY_VERSION_HW, parser.next()); - - return position; - } - - private Object decodeAlt(Channel channel, SocketAddress remoteAddress, String sentence) { - - Parser parser = new Parser(PATTERN_ALT, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - parser.next(); // seq - position.set(Position.KEY_ALARM, decodeAlarm(parser.nextInt(0))); - parser.next(); // alert status or data - - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY)); - - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - return position; - } - - private Object decodePer(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN_PER, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - parser.next(); // seq - - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY)); - - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - position.set(Position.KEY_IGNITION, parser.nextInt(0) == 1); - position.set("dop1", parser.next()); - position.set("dop2", parser.next()); - position.set(Position.KEY_INPUT, parser.next()); - position.set(Position.KEY_BATTERY, parser.nextDouble(0)); - position.set(Position.KEY_POWER, parser.nextDouble()); - position.set(Position.KEY_ODOMETER, parser.nextDouble(0)); - position.set("pulseOdometer", parser.next()); - position.set(Position.KEY_STATUS, parser.nextInt(0)); - - position.setValid(parser.nextInt(0) != 0); - - position.set(Position.KEY_ARCHIVE, parser.nextInt(0) == 1); - - return position; - } - - @Override - protected Object decode(Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - int typeIndex = sentence.indexOf("^TM"); - if (typeIndex < 0) { - return null; - } - - String type = sentence.substring(typeIndex + 3, typeIndex + 6); - switch (type) { - case "ALT": - return decodeAlt(channel, remoteAddress, sentence); - case "SRT": - return decodeSrt(channel, remoteAddress, sentence); - case "PER": - return decodePer(channel, remoteAddress, sentence); - default: - return null; - } - } - -} diff --git a/src/org/traccar/protocol/TramigoFrameDecoder.java b/src/org/traccar/protocol/TramigoFrameDecoder.java deleted file mode 100644 index 20992c04b..000000000 --- a/src/org/traccar/protocol/TramigoFrameDecoder.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.LengthFieldBasedFrameDecoder; - -import java.nio.ByteOrder; - -public class TramigoFrameDecoder extends LengthFieldBasedFrameDecoder { - - public TramigoFrameDecoder() { - super(1024, 6, 2, -8, 0); - } - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 20) { - return null; - } - - // Swap byte order for legacy protocol - if (buf.getUnsignedByte(buf.readerIndex()) == 0x80) { - int length = buf.readableBytes(); - byte[] bytes = new byte[length]; - buf.getBytes(buf.readerIndex(), bytes); - - ChannelBuffer result = (ChannelBuffer) super.decode( - ctx, channel, ChannelBuffers.wrappedBuffer(ByteOrder.LITTLE_ENDIAN, bytes)); - if (result != null) { - buf.skipBytes(result.readableBytes()); - } - return result; - } - - return super.decode(ctx, channel, buf); - } - -} diff --git a/src/org/traccar/protocol/TramigoProtocol.java b/src/org/traccar/protocol/TramigoProtocol.java deleted file mode 100644 index 28673c97b..000000000 --- a/src/org/traccar/protocol/TramigoProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.nio.ByteOrder; -import java.util.List; - -public class TramigoProtocol extends BaseProtocol { - - public TramigoProtocol() { - super("tramigo"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - TrackerServer server = new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new TramigoFrameDecoder()); - pipeline.addLast("objectDecoder", new TramigoProtocolDecoder(TramigoProtocol.this)); - } - }; - server.setEndianness(ByteOrder.LITTLE_ENDIAN); - serverList.add(server); - } - -} diff --git a/src/org/traccar/protocol/TramigoProtocolDecoder.java b/src/org/traccar/protocol/TramigoProtocolDecoder.java deleted file mode 100644 index b1e28e17d..000000000 --- a/src/org/traccar/protocol/TramigoProtocolDecoder.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright 2014 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.DateUtil; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class TramigoProtocolDecoder extends BaseProtocolDecoder { - - public TramigoProtocolDecoder(TramigoProtocol protocol) { - super(protocol); - } - - public static final int MSG_COMPACT = 0x0100; - public static final int MSG_FULL = 0x00FE; - - private static final String[] DIRECTIONS = new String[] {"N", "NE", "E", "SE", "S", "SW", "W", "NW"}; - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - int protocol = buf.readUnsignedByte(); - buf.readUnsignedByte(); // version id - int index = buf.readUnsignedShort(); - int type = buf.readUnsignedShort(); - buf.readUnsignedShort(); // length - buf.readUnsignedShort(); // mask - buf.readUnsignedShort(); // checksum - long id = buf.readUnsignedInt(); - buf.readUnsignedInt(); // time - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.set(Position.KEY_INDEX, index); - position.setValid(true); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, String.valueOf(id)); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - if (protocol == 0x01 && (type == MSG_COMPACT || type == MSG_FULL)) { - - // need to send ack? - - buf.readUnsignedShort(); // report trigger - buf.readUnsignedShort(); // state flag - - position.setLatitude(buf.readUnsignedInt() * 0.0000001); - position.setLongitude(buf.readUnsignedInt() * 0.0000001); - - position.set(Position.KEY_RSSI, buf.readUnsignedShort()); - position.set(Position.KEY_SATELLITES, buf.readUnsignedShort()); - position.set(Position.KEY_SATELLITES_VISIBLE, buf.readUnsignedShort()); - position.set("gpsAntennaStatus", buf.readUnsignedShort()); - - position.setSpeed(buf.readUnsignedShort() * 0.194384); - position.setCourse(buf.readUnsignedShort()); - - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - - position.set(Position.KEY_BATTERY, buf.readUnsignedShort()); - - position.set(Position.KEY_CHARGE, buf.readUnsignedShort()); - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - - // parse other data - - return position; - - } else if (protocol == 0x80) { - - if (channel != null) { - channel.write(ChannelBuffers.copiedBuffer("gprs,ack," + index, StandardCharsets.US_ASCII)); - } - - String sentence = buf.toString(StandardCharsets.US_ASCII); - - Pattern pattern = Pattern.compile("(-?\\d+\\.\\d+), (-?\\d+\\.\\d+)"); - Matcher matcher = pattern.matcher(sentence); - if (!matcher.find()) { - return null; - } - position.setLatitude(Double.parseDouble(matcher.group(1))); - position.setLongitude(Double.parseDouble(matcher.group(2))); - - pattern = Pattern.compile("([NSWE]{1,2}) with speed (\\d+) km/h"); - matcher = pattern.matcher(sentence); - if (matcher.find()) { - for (int i = 0; i < DIRECTIONS.length; i++) { - if (matcher.group(1).equals(DIRECTIONS[i])) { - position.setCourse(i * 45.0); - break; - } - } - position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble(matcher.group(2)))); - } - - pattern = Pattern.compile("(\\d{1,2}:\\d{2}(:\\d{2})? \\w{3} \\d{1,2})"); - matcher = pattern.matcher(sentence); - if (!matcher.find()) { - return null; - } - DateFormat dateFormat = new SimpleDateFormat( - matcher.group(2) != null ? "HH:mm:ss MMM d yyyy" : "HH:mm MMM d yyyy", Locale.ENGLISH); - position.setTime(DateUtil.correctYear( - dateFormat.parse(matcher.group(1) + " " + Calendar.getInstance().get(Calendar.YEAR)))); - - if (sentence.contains("Ignition on detected")) { - position.set(Position.KEY_IGNITION, true); - } else if (sentence.contains("Ignition off detected")) { - position.set(Position.KEY_IGNITION, false); - } - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/TrvProtocol.java b/src/org/traccar/protocol/TrvProtocol.java deleted file mode 100644 index 348ccd92a..000000000 --- a/src/org/traccar/protocol/TrvProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class TrvProtocol extends BaseProtocol { - - public TrvProtocol() { - super("trv"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '#')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new TrvProtocolDecoder(TrvProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/TrvProtocolDecoder.java b/src/org/traccar/protocol/TrvProtocolDecoder.java deleted file mode 100644 index 918748f7b..000000000 --- a/src/org/traccar/protocol/TrvProtocolDecoder.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright 2015 - 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.regex.Pattern; - -public class TrvProtocolDecoder extends BaseProtocolDecoder { - - public TrvProtocolDecoder(TrvProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .expression("[A-Z]{2,3}") - .number("APdd") - .number("(dd)(dd)(dd)") // date (yymmdd) - .expression("([AV])") // validity - .number("(dd)(dd.d+)") // latitude - .expression("([NS])") - .number("(ddd)(dd.d+)") // longitude - .expression("([EW])") - .number("(ddd.d)") // speed - .number("(dd)(dd)(dd)") // time (hhmmss) - .number("([d.]{6})") // course - .number("(ddd)") // gsm - .number("(ddd)") // satellites - .number("(ddd)") // battery - .number("(d)") // acc - .number("(dd)") // arm status - .number("(dd),") // working mode - .number("(d+),") // mcc - .number("(d+),") // mnc - .number("(d+),") // lac - .number("(d+)") // cell - .any() - .compile(); - - private static final Pattern PATTERN_HEATRBEAT = new PatternBuilder() - .expression("[A-Z]{2,3}") - .text("CP01,") - .number("(ddd)") // gsm - .number("(ddd)") // gps - .number("(ddd)") // battery - .number("(d)") // acc - .number("(dd)") // arm status - .number("(dd)") // working mode - .groupBegin() - .number("(ddd)") // interval - .number("d") // vibration alarm - .number("ddd") // vibration sensitivity - .number("d") // automatic arm - .number("dddd") // automatic arm time - .number("(d)") // blocked - .number("(d)") // power status - .number("(d)") // movement status - .groupEnd("?") - .any() - .compile(); - - private Boolean decodeOptionalValue(Parser parser, int activeValue) { - int value = parser.nextInt(); - if (value != 0) { - return value == activeValue; - } - return null; - } - - private void decodeCommon(Position position, Parser parser) { - - position.set(Position.KEY_RSSI, parser.nextInt()); - position.set(Position.KEY_SATELLITES, parser.nextInt()); - position.set(Position.KEY_BATTERY, parser.nextInt()); - position.set(Position.KEY_IGNITION, decodeOptionalValue(parser, 1)); - position.set(Position.KEY_ARMED, decodeOptionalValue(parser, 1)); - - int mode = parser.nextInt(); - if (mode != 0) { - position.set("mode", mode); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - String id = sentence.startsWith("TRV") ? sentence.substring(0, 3) : sentence.substring(0, 2); - String type = sentence.substring(id.length(), id.length() + 4); - - if (channel != null) { - String responseHeader = id + (char) (type.charAt(0) + 1) + type.substring(1); - if (type.equals("AP00") && id.equals("IW")) { - String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); - channel.write(responseHeader + "," + time + ",0#"); - } else if (type.equals("AP14")) { - channel.write(responseHeader + ",0.000,0.000#"); - } else { - channel.write(responseHeader + "#"); - } - } - - if (type.equals("AP00")) { - getDeviceSession(channel, remoteAddress, sentence.substring(id.length() + type.length())); - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - if (type.equals("CP01")) { - - Parser parser = new Parser(PATTERN_HEATRBEAT, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, null); - - decodeCommon(position, parser); - - if (parser.hasNext(3)) { - position.set(Position.KEY_BLOCKED, decodeOptionalValue(parser, 2)); - position.set(Position.KEY_CHARGE, decodeOptionalValue(parser, 1)); - position.set(Position.KEY_MOTION, decodeOptionalValue(parser, 1)); - } - - return position; - - } else if (type.equals("AP01") || type.equals("AP10")) { - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setDate(parser.nextInt(), parser.nextInt(), parser.nextInt()); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble())); - - dateBuilder.setTime(parser.nextInt(), parser.nextInt(), parser.nextInt()); - position.setTime(dateBuilder.getDate()); - - position.setCourse(parser.nextDouble()); - - decodeCommon(position, parser); - - position.setNetwork(new Network(CellTower.from( - parser.nextInt(), parser.nextInt(), parser.nextInt(), parser.nextInt()))); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Tt8850Protocol.java b/src/org/traccar/protocol/Tt8850Protocol.java deleted file mode 100644 index 79dc031bc..000000000 --- a/src/org/traccar/protocol/Tt8850Protocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2016 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class Tt8850Protocol extends BaseProtocol { - - public Tt8850Protocol() { - super("tt8850"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "$")); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new Tt8850ProtocolDecoder(Tt8850Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Tt8850ProtocolDecoder.java b/src/org/traccar/protocol/Tt8850ProtocolDecoder.java deleted file mode 100644 index 5e30d0994..000000000 --- a/src/org/traccar/protocol/Tt8850ProtocolDecoder.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2016 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class Tt8850ProtocolDecoder extends BaseProtocolDecoder { - - public Tt8850ProtocolDecoder(Tt8850Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .binary("0004,") - .number("xxxx,") - .expression("[01],") - .expression("GT...,") - .number("(?:[0-9A-Z]{2}xxxx)?,") // protocol version - .expression("([^,]+),") // imei - .any() - .number("(d{1,2})?,") // gps accuracy - .number("(d{1,3}.d)?,") // speed - .number("(d{1,3})?,") // course - .number("(-?d{1,5}.d)?,") // altitude - .number("(-?d{1,3}.d{6}),") // longitude - .number("(-?d{1,2}.d{6}),") // latitude - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(0ddd)?,") // mcc - .number("(0ddd)?,") // mnc - .number("(xxxx)?,") // lac - .number("(xxxx)?,") // cell - .any() - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(xxxx)") - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setValid(true); - position.setAccuracy(parser.nextInt(0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setLatitude(parser.nextDouble(0)); - - position.setTime(parser.nextDateTime()); - - if (parser.hasNext(4)) { - position.setNetwork(new Network( - CellTower.from(parser.nextInt(0), parser.nextInt(0), parser.nextHexInt(0), parser.nextHexInt(0)))); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/TytanProtocol.java b/src/org/traccar/protocol/TytanProtocol.java deleted file mode 100644 index 0c27fb12b..000000000 --- a/src/org/traccar/protocol/TytanProtocol.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class TytanProtocol extends BaseProtocol { - - public TytanProtocol() { - super("tytan"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectDecoder", new TytanProtocolDecoder(TytanProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/TytanProtocolDecoder.java b/src/org/traccar/protocol/TytanProtocolDecoder.java deleted file mode 100644 index 0ae669784..000000000 --- a/src/org/traccar/protocol/TytanProtocolDecoder.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; - -public class TytanProtocolDecoder extends BaseProtocolDecoder { - - public TytanProtocolDecoder(TytanProtocol protocol) { - super(protocol); - } - - private void decodeExtraData(Position position, ChannelBuffer buf, int end) { - while (buf.readerIndex() < end) { - - int type = buf.readUnsignedByte(); - int length = buf.readUnsignedByte(); - if (length == 255) { - length += buf.readUnsignedByte(); - } - - int n; - - switch (type) { - case 2: - position.set(Position.KEY_ODOMETER_TRIP, buf.readUnsignedMedium()); - break; - case 5: - position.set(Position.KEY_INPUT, buf.readUnsignedByte()); - break; - case 6: - n = buf.readUnsignedByte() >> 4; - if (n < 2) { - position.set(Position.PREFIX_ADC + n, buf.readFloat()); - } else { - position.set("di" + (n - 2), buf.readFloat()); - } - break; - case 7: - int alarm = buf.readUnsignedByte(); - buf.readUnsignedByte(); - if (BitUtil.check(alarm, 5)) { - position.set(Position.KEY_ALARM, Position.ALARM_GENERAL); - } - break; - case 8: - position.set("antihijack", buf.readUnsignedByte()); - break; - case 9: - position.set("unauthorized", ChannelBuffers.hexDump(buf.readBytes(8))); - break; - case 10: - position.set("authorized", ChannelBuffers.hexDump(buf.readBytes(8))); - break; - case 24: - for (int i = 0; i < length / 2; i++) { - position.set(Position.PREFIX_TEMP + buf.readUnsignedByte(), buf.readByte()); - } - break; - case 28: - position.set("weight", buf.readUnsignedShort()); - buf.readUnsignedByte(); - break; - case 90: - position.set(Position.KEY_POWER, buf.readFloat()); - break; - case 101: - position.set(Position.KEY_OBD_SPEED, buf.readUnsignedByte()); - break; - case 102: - position.set(Position.KEY_RPM, buf.readUnsignedByte() * 50); - break; - case 107: - int fuel = buf.readUnsignedShort(); - int fuelFormat = fuel >> 14; - if (fuelFormat == 1) { - position.set("fuelValue", (fuel & 0x3fff) * 0.4 + "%"); - } else if (fuelFormat == 2) { - position.set("fuelValue", (fuel & 0x3fff) * 0.5 + " l"); - } else if (fuelFormat == 3) { - position.set("fuelValue", (fuel & 0x3fff) * -0.5 + " l"); - } - break; - case 108: - position.set(Position.KEY_OBD_ODOMETER, buf.readUnsignedInt() * 5); - break; - case 150: - position.set(Position.KEY_DOOR, buf.readUnsignedByte()); - break; - default: - buf.skipBytes(length); - break; - } - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.readUnsignedByte(); // protocol - buf.readUnsignedShort(); // length - int index = buf.readUnsignedByte() >> 3; - - if (channel != null) { - ChannelBuffer response = ChannelBuffers.copiedBuffer( - "^" + index, StandardCharsets.US_ASCII); - channel.write(response, remoteAddress); - } - - String id = String.valueOf(buf.readUnsignedInt()); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id); - if (deviceSession == null) { - return null; - } - - List<Position> positions = new LinkedList<>(); - - while (buf.readableBytes() > 2) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - int end = buf.readerIndex() + buf.readUnsignedByte(); - - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - - int flags = buf.readUnsignedByte(); - position.set(Position.KEY_SATELLITES, BitUtil.from(flags, 2)); - position.setValid(BitUtil.to(flags, 2) > 0); - - // Latitude - double lat = buf.readUnsignedMedium(); - lat = lat * -180 / 16777216 + 90; - position.setLatitude(lat); - - // Longitude - double lon = buf.readUnsignedMedium(); - lon = lon * 360 / 16777216 - 180; - position.setLongitude(lon); - - // Status - flags = buf.readUnsignedByte(); - position.set(Position.KEY_IGNITION, BitUtil.check(flags, 0)); - position.set(Position.KEY_RSSI, BitUtil.between(flags, 2, 5)); - position.setCourse((BitUtil.from(flags, 5) * 45 + 180) % 360); - - // Speed - int speed = buf.readUnsignedByte(); - if (speed < 250) { - position.setSpeed(UnitsConverter.knotsFromKph(speed)); - } - - decodeExtraData(position, buf, end); - - positions.add(position); - } - - return positions; - } - -} diff --git a/src/org/traccar/protocol/TzoneProtocol.java b/src/org/traccar/protocol/TzoneProtocol.java deleted file mode 100644 index 38d5b139a..000000000 --- a/src/org/traccar/protocol/TzoneProtocol.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.frame.LengthFieldBasedFrameDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class TzoneProtocol extends BaseProtocol { - - public TzoneProtocol() { - super("tzone"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(256, 2, 2, 2, 0)); - pipeline.addLast("objectDecoder", new TzoneProtocolDecoder(TzoneProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/TzoneProtocolDecoder.java b/src/org/traccar/protocol/TzoneProtocolDecoder.java deleted file mode 100644 index 079ad3126..000000000 --- a/src/org/traccar/protocol/TzoneProtocolDecoder.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright 2015 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; - -public class TzoneProtocolDecoder extends BaseProtocolDecoder { - - public TzoneProtocolDecoder(TzoneProtocol protocol) { - super(protocol); - } - - private String decodeAlarm(Short value) { - switch (value) { - case 0x01: - return Position.ALARM_SOS; - case 0x10: - return Position.ALARM_LOW_BATTERY; - case 0x11: - return Position.ALARM_OVERSPEED; - case 0x14: - return Position.ALARM_BRAKING; - case 0x15: - return Position.ALARM_ACCELERATION; - case 0x30: - return Position.ALARM_PARKING; - case 0x42: - return Position.ALARM_GEOFENCE_EXIT; - case 0x43: - return Position.ALARM_GEOFENCE_ENTER; - default: - return null; - } - } - - private void decodeCards(Position position, ChannelBuffer buf) { - - int index = 1; - for (int i = 0; i < 4; i++) { - - int blockLength = buf.readUnsignedShort(); - int blockEnd = buf.readerIndex() + blockLength; - - if (blockLength > 0) { - - int count = buf.readUnsignedByte(); - for (int j = 0; j < count; j++) { - - int length = buf.readUnsignedByte(); - - boolean odd = length % 2 != 0; - if (odd) { - length += 1; - } - - String num = ChannelBuffers.hexDump(buf.readBytes(length / 2)); - - if (odd) { - num = num.substring(1); - } - - position.set("card" + index, num); - } - } - - buf.readerIndex(blockEnd); - } - - } - - private void decodePassengers(Position position, ChannelBuffer buf) { - - int blockLength = buf.readUnsignedShort(); - int blockEnd = buf.readerIndex() + blockLength; - - if (blockLength > 0) { - - position.set("passengersOn", buf.readUnsignedMedium()); - position.set("passengersOff", buf.readUnsignedMedium()); - - } - - buf.readerIndex(blockEnd); - - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(2); // header - buf.readUnsignedShort(); // length - if (buf.readUnsignedShort() != 0x2424) { - return null; - } - int hardware = buf.readUnsignedShort(); - long firmware = buf.readUnsignedInt(); - - String imei = ChannelBuffers.hexDump(buf.readBytes(8)).substring(1); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_VERSION_HW, hardware); - position.set(Position.KEY_VERSION_FW, firmware); - - position.setDeviceTime(new DateBuilder() - .setDate(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()).getDate()); - - // GPS info - - int blockLength = buf.readUnsignedShort(); - int blockEnd = buf.readerIndex() + blockLength; - - if (blockLength < 22) { - return null; - } - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - - double lat; - double lon; - - if (hardware == 0x10A || hardware == 0x10B) { - lat = buf.readUnsignedInt() / 600000.0; - lon = buf.readUnsignedInt() / 600000.0; - } else { - lat = buf.readUnsignedInt() / 100000.0 / 60.0; - lon = buf.readUnsignedInt() / 100000.0 / 60.0; - } - - position.setFixTime(new DateBuilder() - .setDate(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()).getDate()); - - position.setSpeed(buf.readUnsignedShort() * 0.01); - - position.set(Position.KEY_ODOMETER, buf.readUnsignedMedium()); - - int flags = buf.readUnsignedShort(); - position.setCourse(BitUtil.to(flags, 9)); - if (!BitUtil.check(flags, 10)) { - lat = -lat; - } - position.setLatitude(lat); - if (BitUtil.check(flags, 9)) { - lon = -lon; - } - position.setLongitude(lon); - position.setValid(BitUtil.check(flags, 11)); - - buf.readerIndex(blockEnd); - - // LBS info - - blockLength = buf.readUnsignedShort(); - blockEnd = buf.readerIndex() + blockLength; - - if (blockLength > 0 && (hardware == 0x10A || hardware == 0x10B)) { - position.setNetwork(new Network( - CellTower.fromLacCid(buf.readUnsignedShort(), buf.readUnsignedShort()))); - } - - buf.readerIndex(blockEnd); - - // Status info - - blockLength = buf.readUnsignedShort(); - blockEnd = buf.readerIndex() + blockLength; - - if (blockLength >= 13) { - position.set(Position.KEY_ALARM, decodeAlarm(buf.readUnsignedByte())); - position.set("terminalInfo", buf.readUnsignedByte()); - - int status = buf.readUnsignedByte(); - position.set(Position.PREFIX_OUT + 1, BitUtil.check(status, 0)); - position.set(Position.PREFIX_OUT + 2, BitUtil.check(status, 1)); - status = buf.readUnsignedByte(); - position.set(Position.PREFIX_IN + 1, BitUtil.check(status, 4)); - if (BitUtil.check(status, 0)) { - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - } - - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - position.set("gsmStatus", buf.readUnsignedByte()); - position.set(Position.KEY_BATTERY, buf.readUnsignedShort()); - position.set(Position.KEY_POWER, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 1, buf.readUnsignedShort()); - position.set(Position.PREFIX_ADC + 2, buf.readUnsignedShort()); - } - - if (blockLength >= 15) { - position.set(Position.PREFIX_TEMP + 1, buf.readUnsignedShort()); - } - - buf.readerIndex(blockEnd); - - if (hardware == 0x10A || hardware == 0x10B) { - - decodeCards(position, buf); - - buf.skipBytes(buf.readUnsignedShort()); // temperature - buf.skipBytes(buf.readUnsignedShort()); // lock - - decodePassengers(position, buf); - - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/UlbotechFrameDecoder.java b/src/org/traccar/protocol/UlbotechFrameDecoder.java deleted file mode 100644 index 8e7b497c5..000000000 --- a/src/org/traccar/protocol/UlbotechFrameDecoder.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2014 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class UlbotechFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, - Channel channel, - ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 2) { - return null; - } - - if (buf.getUnsignedByte(buf.readerIndex()) == 0xF8) { - - int index = buf.indexOf(buf.readerIndex() + 1, buf.writerIndex(), (byte) 0xF8); - if (index != -1) { - ChannelBuffer result = ChannelBuffers.buffer(index + 1 - buf.readerIndex()); - - while (buf.readerIndex() <= index) { - int b = buf.readUnsignedByte(); - if (b == 0xF7) { - int ext = buf.readUnsignedByte(); - if (ext == 0x00) { - result.writeByte(0xF7); - } else if (ext == 0x0F) { - result.writeByte(0xF8); - } - } else { - result.writeByte(b); - } - } - - return result; - } - - } else { - - int index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '#'); - if (index != -1) { - return buf.readBytes(index + 1 - buf.readerIndex()); - } - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/UlbotechProtocol.java b/src/org/traccar/protocol/UlbotechProtocol.java deleted file mode 100644 index 40f4594a5..000000000 --- a/src/org/traccar/protocol/UlbotechProtocol.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class UlbotechProtocol extends BaseProtocol { - - public UlbotechProtocol() { - super("ulbotech"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new UlbotechFrameDecoder()); - pipeline.addLast("objectDecoder", new UlbotechProtocolDecoder(UlbotechProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/UlbotechProtocolDecoder.java b/src/org/traccar/protocol/UlbotechProtocolDecoder.java deleted file mode 100644 index 31a3d2cfe..000000000 --- a/src/org/traccar/protocol/UlbotechProtocolDecoder.java +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright 2015 - 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.Checksum; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.ObdDecoder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.regex.Pattern; - -public class UlbotechProtocolDecoder extends BaseProtocolDecoder { - - private final long timeZone; - - public UlbotechProtocolDecoder(UlbotechProtocol protocol) { - super(protocol); - timeZone = Context.getConfig().getInteger(getProtocolName() + ".timezone", 0); - } - - private static final short DATA_GPS = 0x01; - private static final short DATA_LBS = 0x02; - private static final short DATA_STATUS = 0x03; - private static final short DATA_ODOMETER = 0x04; - private static final short DATA_ADC = 0x05; - private static final short DATA_GEOFENCE = 0x06; - private static final short DATA_OBD2 = 0x07; - private static final short DATA_FUEL = 0x08; - private static final short DATA_OBD2_ALARM = 0x09; - private static final short DATA_HARSH_DRIVER = 0x0A; - private static final short DATA_CANBUS = 0x0B; - private static final short DATA_J1708 = 0x0C; - private static final short DATA_VIN = 0x0D; - private static final short DATA_RFID = 0x0E; - private static final short DATA_EVENT = 0x10; - - private void decodeObd(Position position, ChannelBuffer buf, int length) { - - int end = buf.readerIndex() + length; - - while (buf.readerIndex() < end) { - int parameterLength = buf.getUnsignedByte(buf.readerIndex()) >> 4; - int mode = buf.readUnsignedByte() & 0x0F; - position.add(ObdDecoder.decode(mode, ChannelBuffers.hexDump(buf.readBytes(parameterLength - 1)))); - } - } - - private void decodeJ1708(Position position, ChannelBuffer buf, int length) { - - int end = buf.readerIndex() + length; - - while (buf.readerIndex() < end) { - int mark = buf.readUnsignedByte(); - int len = BitUtil.between(mark, 0, 6); - int type = BitUtil.between(mark, 6, 8); - int id = buf.readUnsignedByte(); - if (type == 3) { - id += 256; - } - String value = ChannelBuffers.hexDump(buf.readBytes(len - 1)); - if (type == 2 || type == 3) { - position.set("pid" + id, value); - } - } - } - - private void decodeDriverBehavior(Position position, ChannelBuffer buf) { - - int value = buf.readUnsignedByte(); - - if (BitUtil.check(value, 0)) { - position.set("rapidAcceleration", true); - } - if (BitUtil.check(value, 1)) { - position.set("roughBraking", true); - } - if (BitUtil.check(value, 2)) { - position.set("harshCourse", true); - } - if (BitUtil.check(value, 3)) { - position.set("noWarmUp", true); - } - if (BitUtil.check(value, 4)) { - position.set("longIdle", true); - } - if (BitUtil.check(value, 5)) { - position.set("fatigueDriving", true); - } - if (BitUtil.check(value, 6)) { - position.set("roughTerrain", true); - } - if (BitUtil.check(value, 7)) { - position.set("highRpm", true); - } - } - - private String decodeAlarm(int alarm) { - if (BitUtil.check(alarm, 0)) { - return Position.ALARM_POWER_OFF; - } - if (BitUtil.check(alarm, 1)) { - return Position.ALARM_MOVEMENT; - } - if (BitUtil.check(alarm, 2)) { - return Position.ALARM_OVERSPEED; - } - if (BitUtil.check(alarm, 4)) { - return Position.ALARM_GEOFENCE; - } - if (BitUtil.check(alarm, 10)) { - return Position.ALARM_SOS; - } - return null; - } - - private void decodeAdc(Position position, ChannelBuffer buf, int length) { - for (int i = 0; i < length / 2; i++) { - int value = buf.readUnsignedShort(); - int id = BitUtil.from(value, 12); - value = BitUtil.to(value, 12); - switch (id) { - case 0: - position.set(Position.KEY_POWER, value * (100 + 10) / 4096.0 - 10); - break; - case 1: - position.set(Position.PREFIX_TEMP + 1, value * (125 + 55) / 4096.0 - 55); - break; - case 2: - position.set(Position.KEY_BATTERY, value * (100 + 10) / 4096.0 - 10); - break; - case 3: - position.set(Position.PREFIX_ADC + 1, value * (100 + 10) / 4096.0 - 10); - break; - default: - position.set(Position.PREFIX_IO + id, value); - break; - } - } - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("*TS") - .number("dd,") // protocol version - .number("(d{15}),") // device id - .number("(dd)(dd)(dd)") // time - .number("(dd)(dd)(dd),") // date - .expression("([^#]+)") // command - .text("#") - .compile(); - - private Object decodeText(Channel channel, SocketAddress remoteAddress, String sentence) { - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)) - .setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - getLastLocation(position, dateBuilder.getDate()); - - position.set(Position.KEY_RESULT, parser.next()); - - return position; - } - - private Object decodeBinary(Channel channel, SocketAddress remoteAddress, ChannelBuffer buf) { - - buf.readUnsignedByte(); // header - buf.readUnsignedByte(); // version - buf.readUnsignedByte(); // type - - String imei = ChannelBuffers.hexDump(buf.readBytes(8)).substring(1); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - long seconds = buf.readUnsignedInt() & 0x7fffffffL; - seconds += 946684800L; // 2000-01-01 00:00 - seconds -= timeZone; - Date time = new Date(seconds * 1000); - - boolean hasLocation = false; - - while (buf.readableBytes() > 3) { - - int type = buf.readUnsignedByte(); - int length = type == DATA_CANBUS ? buf.readUnsignedShort() : buf.readUnsignedByte(); - - switch (type) { - - case DATA_GPS: - hasLocation = true; - position.setValid(true); - position.setLatitude(buf.readInt() / 1000000.0); - position.setLongitude(buf.readInt() / 1000000.0); - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedShort())); - position.setCourse(buf.readUnsignedShort()); - position.set(Position.KEY_HDOP, buf.readUnsignedShort()); - break; - - case DATA_LBS: - if (length == 11) { - position.setNetwork(new Network(CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedShort(), - buf.readUnsignedShort(), buf.readUnsignedInt(), -buf.readUnsignedByte()))); - } else { - position.setNetwork(new Network(CellTower.from( - buf.readUnsignedShort(), buf.readUnsignedShort(), - buf.readUnsignedShort(), buf.readUnsignedShort(), -buf.readUnsignedByte()))); - } - if (length > 9 && length != 11) { - buf.skipBytes(length - 9); - } - break; - - case DATA_STATUS: - int status = buf.readUnsignedShort(); - position.set(Position.KEY_IGNITION, BitUtil.check(status, 9)); - position.set(Position.KEY_STATUS, status); - position.set(Position.KEY_ALARM, decodeAlarm(buf.readUnsignedShort())); - break; - - case DATA_ODOMETER: - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt()); - break; - - case DATA_ADC: - decodeAdc(position, buf, length); - break; - - case DATA_GEOFENCE: - position.set("geofenceIn", buf.readUnsignedInt()); - position.set("geofenceAlarm", buf.readUnsignedInt()); - break; - - case DATA_OBD2: - decodeObd(position, buf, length); - break; - - case DATA_FUEL: - position.set(Position.KEY_FUEL_CONSUMPTION, buf.readUnsignedInt() / 10000.0); - break; - - case DATA_OBD2_ALARM: - decodeObd(position, buf, length); - break; - - case DATA_HARSH_DRIVER: - decodeDriverBehavior(position, buf); - break; - - case DATA_CANBUS: - position.set("can", ChannelBuffers.hexDump(buf.readBytes(length))); - break; - - case DATA_J1708: - decodeJ1708(position, buf, length); - break; - - case DATA_VIN: - position.set(Position.KEY_VIN, buf.readBytes(length).toString(StandardCharsets.US_ASCII)); - break; - - case DATA_RFID: - position.set(Position.KEY_DRIVER_UNIQUE_ID, - buf.readBytes(length - 1).toString(StandardCharsets.US_ASCII)); - position.set("authorized", buf.readUnsignedByte() != 0); - break; - - case DATA_EVENT: - position.set(Position.KEY_EVENT, buf.readUnsignedByte()); - if (length > 1) { - position.set("eventMask", buf.readUnsignedInt()); - } - break; - - default: - buf.skipBytes(length); - break; - } - } - - if (!hasLocation) { - getLastLocation(position, time); - } else { - position.setTime(time); - } - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - if (buf.getUnsignedByte(buf.readerIndex()) == 0xF8) { - - if (channel != null) { - ChannelBuffer response = ChannelBuffers.dynamicBuffer(); - response.writeByte(0xF8); - response.writeByte(DATA_GPS); - response.writeByte(0xFE); - response.writeShort(buf.getShort(response.writerIndex() - 1 - 2)); - response.writeShort(Checksum.crc16(Checksum.CRC16_XMODEM, response.toByteBuffer(1, 4))); - response.writeByte(0xF8); - channel.write(response); - } - - return decodeBinary(channel, remoteAddress, buf); - } else { - - if (channel != null) { - channel.write(ChannelBuffers.copiedBuffer(String.format("*TS01,ACK:%04X#", - Checksum.crc16(Checksum.CRC16_XMODEM, buf.toByteBuffer(1, buf.writerIndex() - 2))), - StandardCharsets.US_ASCII)); - } - - return decodeText(channel, remoteAddress, buf.toString(StandardCharsets.US_ASCII)); - } - } - -} diff --git a/src/org/traccar/protocol/UproProtocol.java b/src/org/traccar/protocol/UproProtocol.java deleted file mode 100644 index c00f859ee..000000000 --- a/src/org/traccar/protocol/UproProtocol.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2015 - 2016 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.StringEncoder; -import org.traccar.BaseProtocol; -import org.traccar.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class UproProtocol extends BaseProtocol { - - public UproProtocol() { - super("upro"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '#')); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new UproProtocolDecoder(UproProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/UproProtocolDecoder.java b/src/org/traccar/protocol/UproProtocolDecoder.java deleted file mode 100644 index 7a0dca8a2..000000000 --- a/src/org/traccar/protocol/UproProtocolDecoder.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright 2012 - 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.util.regex.Pattern; - -public class UproProtocolDecoder extends BaseProtocolDecoder { - - public UproProtocolDecoder(UproProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN_HEADER = new PatternBuilder() - .text("*") - .expression("..20") - .expression("([01])") // ack - .number("(d+),") // device id - .expression("(.)") // type - .expression("(.)") // subtype - .any() - .compile(); - - private static final Pattern PATTERN_LOCATION = new PatternBuilder() - .number("(dd)(dd)(dd)") // time (hhmmss) - .number("(dd)(dd)(dddd)") // latitude - .number("(ddd)(dd)(dddd)") // longitude - .number("(d)") // flags - .number("(dd)") // speed - .number("(dd)") // course - .number("(dd)(dd)(dd)") // date (ddmmyy) - .compile(); - - private void decodeLocation(Position position, String data) { - Parser parser = new Parser(PATTERN_LOCATION, data); - if (parser.matches()) { - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(true); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_MIN_MIN)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_MIN_MIN)); - - int flags = parser.nextInt(0); - position.setValid(BitUtil.check(flags, 0)); - if (!BitUtil.check(flags, 1)) { - position.setLatitude(-position.getLatitude()); - } - if (!BitUtil.check(flags, 2)) { - position.setLongitude(-position.getLongitude()); - } - - position.setSpeed(parser.nextInt(0) * 2); - position.setCourse(parser.nextInt(0) * 10); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - if (buf.getByte(buf.readerIndex()) != '*') { - throw new ParseException(null, 0); - } - - int headerIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '&'); - if (headerIndex < 0) { - headerIndex = buf.writerIndex(); - } - String header = buf.readBytes(headerIndex - buf.readerIndex()).toString(StandardCharsets.US_ASCII); - - Parser parser = new Parser(PATTERN_HEADER, header); - if (!parser.matches()) { - return null; - } - - boolean reply = parser.next().equals("1"); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - String type = parser.next(); - String subtype = parser.next(); - - if (reply && channel != null) { - channel.write("*MG20Y" + type + subtype + "#"); - } - - while (buf.readable()) { - - buf.readByte(); // skip delimiter - - byte dataType = buf.readByte(); - - int delimiterIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) '&'); - if (delimiterIndex < 0) { - delimiterIndex = buf.writerIndex(); - } - - ChannelBuffer data = buf.readBytes(delimiterIndex - buf.readerIndex()); - - switch (dataType) { - case 'A': - decodeLocation(position, data.toString(StandardCharsets.US_ASCII)); - break; - case 'B': - position.set(Position.KEY_STATUS, data.toString(StandardCharsets.US_ASCII)); - break; - case 'C': - long odometer = 0; - while (data.readable()) { - odometer <<= 4; - odometer += data.readByte() - (byte) '0'; - } - position.set(Position.KEY_ODOMETER, odometer * 2 * 1852 / 3600); - break; - case 'P': - position.setNetwork(new Network(CellTower.from( - Integer.parseInt(data.readBytes(4).toString(StandardCharsets.US_ASCII)), - Integer.parseInt(data.readBytes(4).toString(StandardCharsets.US_ASCII)), - Integer.parseInt(data.readBytes(4).toString(StandardCharsets.US_ASCII), 16), - Integer.parseInt(data.readBytes(4).toString(StandardCharsets.US_ASCII), 16)))); - break; - case 'Q': - position.set("obd-pid", ChannelBuffers.hexDump(data)); - break; - case 'R': - position.set("odb-travel", ChannelBuffers.hexDump(data)); - break; - case 'S': - position.set("obd-traffic", ChannelBuffers.hexDump(data)); - break; - default: - break; - } - - } - - if (position.getLatitude() != 0 && position.getLongitude() != 0) { - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/V680Protocol.java b/src/org/traccar/protocol/V680Protocol.java deleted file mode 100644 index 98c64830b..000000000 --- a/src/org/traccar/protocol/V680Protocol.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2015 - 2016 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.ConnectionlessBootstrap; -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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class V680Protocol extends BaseProtocol { - - public V680Protocol() { - super("v680"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "##")); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new V680ProtocolDecoder(V680Protocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new V680ProtocolDecoder(V680Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/V680ProtocolDecoder.java b/src/org/traccar/protocol/V680ProtocolDecoder.java deleted file mode 100644 index 079a8eb08..000000000 --- a/src/org/traccar/protocol/V680ProtocolDecoder.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2012 - 2016 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class V680ProtocolDecoder extends BaseProtocolDecoder { - - public V680ProtocolDecoder(V680Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .groupBegin() - .number("#(d+)#") // imei - .expression("([^#]*)#") // user - .groupEnd("?") - .number("(d+)#") // fix - .expression("([^#]+)#") // password - .expression("([^#]+)#") // event - .number("(d+)#") // packet number - .expression("([^#]+)?#?") // gsm base station - .expression("(?:[^#]+#)?") - .number("(d+.d+),([EW]),") // longitude - .number("(d+.d+),([NS]),") // latitude - .number("(d+.d+),") // speed - .number("(d+.?d*)?#") // course - .number("(dd)(dd)(dd)#") // date (ddmmyy) - .number("(dd)(dd)(dd)") // time (hhmmss) - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - sentence = sentence.trim(); - - if (sentence.length() == 16) { - - getDeviceSession(channel, remoteAddress, sentence.substring(1, sentence.length())); - - } else { - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession; - if (parser.hasNext()) { - deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - } else { - deviceSession = getDeviceSession(channel, remoteAddress); - } - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set("user", parser.next()); - position.setValid(parser.nextInt(0) > 0); - position.set("password", parser.next()); - position.set(Position.KEY_EVENT, parser.next()); - position.set("packet", parser.next()); - position.set("lbsData", parser.next()); - - double lon = parser.nextDouble(0); - boolean west = parser.next().equals("W"); - double lat = parser.nextDouble(0); - boolean south = parser.next().equals("S"); - - if (lat > 90 || lon > 180) { - int lonDegrees = (int) (lon * 0.01); - lon = (lon - lonDegrees * 100) / 60.0; - lon += lonDegrees; - - int latDegrees = (int) (lat * 0.01); - lat = (lat - latDegrees * 100) / 60.0; - lat += latDegrees; - } - - position.setLongitude(west ? -lon : lon); - position.setLatitude(south ? -lat : lat); - - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - int day = parser.nextInt(0); - int month = parser.nextInt(0); - if (day == 0 && month == 0) { - return null; // invalid date - } - - DateBuilder dateBuilder = new DateBuilder() - .setDate(parser.nextInt(0), month, day) - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - return position; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/VisiontekProtocol.java b/src/org/traccar/protocol/VisiontekProtocol.java deleted file mode 100644 index c6dd09562..000000000 --- a/src/org/traccar/protocol/VisiontekProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class VisiontekProtocol extends BaseProtocol { - - public VisiontekProtocol() { - super("visiontek"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, '#')); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new VisiontekProtocolDecoder(VisiontekProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/VisiontekProtocolDecoder.java b/src/org/traccar/protocol/VisiontekProtocolDecoder.java deleted file mode 100644 index f32c9fbfe..000000000 --- a/src/org/traccar/protocol/VisiontekProtocolDecoder.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2014 - 2016 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.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 VisiontekProtocolDecoder extends BaseProtocolDecoder { - - public VisiontekProtocolDecoder(VisiontekProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("$1,") - .expression("([^,]+),") // identifier - .number("(d+),").optional() // imei - .number("(dd),(dd),(dd),") // date (dd,mm,yy) - .number("(dd),(dd),(dd),") // time (hh,mm,ss) - .groupBegin() - .number("(dd)(dd).?(d+)([NS]),") // latitude - .number("(ddd)(dd).?(d+)([EW]),") // longitude - .or() - .number("(dd.d+)([NS]),") // latitude - .number("(ddd.d+)([EW]),") // longitude - .groupEnd() - .number("(d+.?d+),") // speed - .number("(d+),") // course - .groupBegin() - .number("(d+),") // altitude - .number("(d+),") // satellites - .number("(d+),") // odometer - .number("([01]),") // ignition - .number("([01]),") // input 1 - .number("([01]),") // input 2 - .number("([01]),") // immobilizer - .number("([01]),") // external battery status - .number("(d+),") // gsm - .or() - .number("(d+.d),") // hdop - .number("(d+),") // altitude - .number("(d+),") // odometer - .number("([01],[01],[01],[01]),") // input - .number("([01],[01],[01],[01]),") // output - .number("(d+.?d*),") // adc 1 - .number("(d+.?d*),") // adc 2 - .groupEnd("?") - .any() - .expression("([AV])") // validity - .number(",(d{10})").optional() // rfid - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next(), parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - if (parser.hasNext(8)) { - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_MIN_MIN_HEM)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_MIN_MIN_HEM)); - } - if (parser.hasNext(4)) { - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM)); - } - - position.setSpeed(UnitsConverter.knotsFromKph(Double.parseDouble( - parser.next().replace(".", "")) / 10)); - - position.setCourse(parser.nextDouble(0)); - - if (parser.hasNext(9)) { - position.setAltitude(parser.nextDouble(0)); - position.set(Position.KEY_SATELLITES, parser.nextInt()); - position.set(Position.KEY_ODOMETER, parser.nextInt(0) * 1000); - position.set(Position.KEY_IGNITION, parser.next().equals("1")); - position.set(Position.PREFIX_IO + 1, parser.next()); - position.set(Position.PREFIX_IO + 2, parser.next()); - position.set("immobilizer", parser.next()); - position.set(Position.KEY_CHARGE, parser.next().equals("1")); - position.set(Position.KEY_RSSI, parser.nextDouble()); - } - - if (parser.hasNext(7)) { - position.set(Position.KEY_HDOP, parser.nextDouble()); - position.setAltitude(parser.nextDouble(0)); - position.set(Position.KEY_ODOMETER, parser.nextInt(0) * 1000); - position.set(Position.KEY_INPUT, parser.next()); - position.set(Position.KEY_OUTPUT, parser.next()); - position.set(Position.PREFIX_ADC + 1, parser.next()); - position.set(Position.PREFIX_ADC + 2, parser.next()); - } - - position.setValid(parser.next().equals("A")); - - position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/Vt200FrameDecoder.java b/src/org/traccar/protocol/Vt200FrameDecoder.java deleted file mode 100644 index adde12118..000000000 --- a/src/org/traccar/protocol/Vt200FrameDecoder.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class Vt200FrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - int endIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) ')') + 1; - if (endIndex > 0) { - - ChannelBuffer frame = ChannelBuffers.dynamicBuffer(); - - while (buf.readerIndex() < endIndex) { - int b = buf.readByte(); - if (b == '=') { - frame.writeByte(buf.readByte() ^ '='); - } else { - frame.writeByte(b); - } - } - - return frame; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/Vt200Protocol.java b/src/org/traccar/protocol/Vt200Protocol.java deleted file mode 100644 index 59c61cb61..000000000 --- a/src/org/traccar/protocol/Vt200Protocol.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class Vt200Protocol extends BaseProtocol { - - public Vt200Protocol() { - super("vt200"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new Vt200FrameDecoder()); - pipeline.addLast("objectDecoder", new Vt200ProtocolDecoder(Vt200Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Vt200ProtocolDecoder.java b/src/org/traccar/protocol/Vt200ProtocolDecoder.java deleted file mode 100644 index 2ae24efbb..000000000 --- a/src/org/traccar/protocol/Vt200ProtocolDecoder.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -import org.traccar.helper.BcdUtil; -import org.traccar.helper.BitUtil; -import org.traccar.helper.DateBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.Arrays; -import java.util.Date; - -public class Vt200ProtocolDecoder extends BaseProtocolDecoder { - - public Vt200ProtocolDecoder(Vt200Protocol protocol) { - super(protocol); - } - - private static double decodeCoordinate(int value) { - int degrees = value / 1000000; - int minutes = value % 1000000; - return degrees + minutes * 0.0001 / 60; - } - - protected Date decodeDate(ChannelBuffer buf) { - DateBuilder dateBuilder = new DateBuilder() - .setDateReverse(BcdUtil.readInteger(buf, 2), BcdUtil.readInteger(buf, 2), BcdUtil.readInteger(buf, 2)) - .setTime(BcdUtil.readInteger(buf, 2), BcdUtil.readInteger(buf, 2), BcdUtil.readInteger(buf, 2)); - return dateBuilder.getDate(); - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(1); // header - - String id = ChannelBuffers.hexDump(buf.readBytes(6)); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id); - if (deviceSession == null) { - return null; - } - - int type = buf.readUnsignedShort(); - buf.readUnsignedShort(); // length - - if (type == 0x2086 || type == 0x2084 || type == 0x2082) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - buf.readUnsignedByte(); // data type - buf.readUnsignedShort(); // trip id - - position.setTime(decodeDate(buf)); - - position.setLatitude(decodeCoordinate(BcdUtil.readInteger(buf, 8))); - position.setLongitude(decodeCoordinate(BcdUtil.readInteger(buf, 9))); - - int flags = buf.readUnsignedByte(); - position.setValid(BitUtil.check(flags, 0)); - if (!BitUtil.check(flags, 1)) { - position.setLatitude(-position.getLatitude()); - } - if (!BitUtil.check(flags, 1)) { - position.setLongitude(-position.getLongitude()); - } - - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - position.setCourse(buf.readUnsignedByte() * 2); - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - position.set(Position.KEY_RSSI, buf.readUnsignedByte()); - position.set(Position.KEY_ODOMETER, buf.readUnsignedInt() * 1000); - position.set(Position.KEY_STATUS, buf.readUnsignedInt()); - - // additional data - - return position; - - } else if (type == 0x3088) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, null); - - buf.readUnsignedShort(); // trip id - buf.skipBytes(8); // imei - buf.skipBytes(8); // imsi - - position.set("tripStart", decodeDate(buf).getTime()); - position.set("tripEnd", decodeDate(buf).getTime()); - position.set("drivingTime", buf.readUnsignedShort()); - - position.set(Position.KEY_FUEL_CONSUMPTION, buf.readUnsignedInt()); - position.set(Position.KEY_ODOMETER_TRIP, buf.readUnsignedInt()); - - position.set("maxSpeed", UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - position.set("maxRpm", buf.readUnsignedShort()); - position.set("maxTemp", buf.readUnsignedByte() - 40); - position.set("hardAccelerationCount", buf.readUnsignedByte()); - position.set("hardBrakingCount", buf.readUnsignedByte()); - - for (String speedType : Arrays.asList("over", "high", "normal", "low")) { - position.set(speedType + "SpeedTime", buf.readUnsignedShort()); - position.set(speedType + "SpeedDistance", buf.readUnsignedInt()); - position.set(speedType + "SpeedFuel", buf.readUnsignedInt()); - } - - position.set("idleTime", buf.readUnsignedShort()); - position.set("idleFuel", buf.readUnsignedInt()); - - position.set("hardCorneringCount", buf.readUnsignedByte()); - position.set("overspeedCount", buf.readUnsignedByte()); - position.set("overheatCount", buf.readUnsignedShort()); - position.set("laneChangeCount", buf.readUnsignedByte()); - position.set("emergencyRefueling", buf.readUnsignedByte()); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/VtfmsFrameDecoder.java b/src/org/traccar/protocol/VtfmsFrameDecoder.java deleted file mode 100644 index 2e6033fcc..000000000 --- a/src/org/traccar/protocol/VtfmsFrameDecoder.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -public class VtfmsFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - int endIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) ')'); - if (endIndex > 0) { - endIndex += 1 + 3; - if (buf.writerIndex() >= endIndex) { - return buf.readBytes(endIndex - buf.readerIndex()); - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/VtfmsProtocol.java b/src/org/traccar/protocol/VtfmsProtocol.java deleted file mode 100644 index 61e0bf2b9..000000000 --- a/src/org/traccar/protocol/VtfmsProtocol.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.handler.codec.string.StringDecoder; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class VtfmsProtocol extends BaseProtocol { - - public VtfmsProtocol() { - super("vtfms"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new VtfmsFrameDecoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new VtfmsProtocolDecoder(VtfmsProtocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new VtfmsProtocolDecoder(VtfmsProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/VtfmsProtocolDecoder.java b/src/org/traccar/protocol/VtfmsProtocolDecoder.java deleted file mode 100644 index 5fb687e6d..000000000 --- a/src/org/traccar/protocol/VtfmsProtocolDecoder.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright 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.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 VtfmsProtocolDecoder extends BaseProtocolDecoder { - - private static final String[] DIRECTIONS = new String[] {"N", "NE", "E", "SE", "S", "SW", "W", "NW"}; - - public VtfmsProtocolDecoder(VtfmsProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .text("(") - .number("(d{15}),") // imei - .number("[0-9A-Z]{3}dd,") // packet count - .number("(dd),") // packet id - .number("[^,]*,") // reserved - .number("(d+)?,") // rssi - .number("(?:d+)?,") // fix status - .number("(d+)?,") // satellites - .number("[^,]*,") // reserved - .expression("([AV]),") // validity - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(dd)(dd)(dd),") // time (ddmmyy) - .number("(-?d+.d+),") // latitude - .number("(-?d+.d+),") // longitude - .number("(?:(d+)|([NESW]{1,2})),") // course - .number("(d+),") // speed - .number("(d+),") // hours - .number("(d+),") // idle hours - .expression("[KNT],") // antenna status - .number("(d+),") // odometer - .expression("([01]),") // power status - .number("(d+.d+),") // power voltage - .number("[^,]*,") // reserved - .number("(d+)?,") // fuel level - .number("(d+.d+),") // adc 1 - .number("[^,]*,") // reserved - .number("(d+.d+)?,") // adc 2 - .expression("([01]),") // di 1 - .expression("([01]),") // di 2 - .expression("([01]),") // di 3 - .expression("([01]),") // di 4 - .expression("([01]),") // do 1 - .expression("([01]),") // do 2 - .expression("([01]),") // do 3 - .number("[^,]*,") // reserved - .number("[^,]*") // reserved - .text(")") - .number("ddd") // checksum - .compile(); - - private String decodeAlarm(int value) { - switch (value) { - case 10: - return Position.ALARM_OVERSPEED; - case 14: - return Position.ALARM_POWER_CUT; - case 15: - return Position.ALARM_POWER_RESTORED; - case 32: - return Position.ALARM_BRAKING; - case 33: - return Position.ALARM_ACCELERATION; - default: - return null; - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_ALARM, decodeAlarm(parser.nextInt())); - position.set(Position.KEY_RSSI, parser.nextInt()); - position.set(Position.KEY_SATELLITES, parser.nextInt()); - - position.setValid(parser.next().equals("A")); - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.HMS_DMY)); - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - - if (parser.hasNext()) { - position.setCourse(parser.nextDouble(0)); - } - if (parser.hasNext()) { - String direction = parser.next(); - for (int i = 0; i < DIRECTIONS.length; i++) { - if (direction.equals(DIRECTIONS[i])) { - position.setCourse(i * 45.0); - break; - } - } - } - - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - - position.set(Position.KEY_HOURS, parser.nextInt()); - position.set("idleHours", parser.nextInt()); - position.set(Position.KEY_ODOMETER, parser.nextInt() * 100); - position.set(Position.KEY_CHARGE, parser.next().equals("1")); - position.set(Position.KEY_POWER, parser.nextDouble()); - position.set(Position.KEY_FUEL_LEVEL, parser.nextInt()); - position.set(Position.PREFIX_ADC + 1, parser.nextDouble()); - position.set(Position.PREFIX_ADC + 2, parser.nextDouble()); - 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_IN + 4, parser.nextInt()); - position.set(Position.PREFIX_OUT + 1, parser.nextInt()); - position.set(Position.PREFIX_OUT + 2, parser.nextInt()); - position.set(Position.PREFIX_OUT + 3, parser.nextInt()); - - return position; - } - -} diff --git a/src/org/traccar/protocol/WatchFrameDecoder.java b/src/org/traccar/protocol/WatchFrameDecoder.java deleted file mode 100644 index 826a8b4d0..000000000 --- a/src/org/traccar/protocol/WatchFrameDecoder.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; - -import java.nio.charset.StandardCharsets; - -public class WatchFrameDecoder extends FrameDecoder { - - public static final int MESSAGE_HEADER = 20; - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() >= MESSAGE_HEADER) { - ChannelBuffer lengthBuffer = ChannelBuffers.dynamicBuffer(); - buf.getBytes(buf.readerIndex() + MESSAGE_HEADER - 4 - 1, lengthBuffer, 4); - int length = Integer.parseInt(lengthBuffer.toString(StandardCharsets.US_ASCII), 16) + MESSAGE_HEADER + 1; - if (buf.readableBytes() >= length) { - ChannelBuffer frame = ChannelBuffers.dynamicBuffer(); - int endIndex = buf.readerIndex() + length; - while (buf.readerIndex() < endIndex) { - byte b = buf.readByte(); - if (b == 0x7D) { - switch (buf.readByte()) { - case 0x01: - frame.writeByte(0x7D); - break; - case 0x02: - frame.writeByte(0x5B); - break; - case 0x03: - frame.writeByte(0x5D); - break; - case 0x04: - frame.writeByte(0x2C); - break; - case 0x05: - frame.writeByte(0x2A); - break; - default: - throw new IllegalArgumentException(); - } - } else { - frame.writeByte(b); - } - } - return frame; - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/WatchProtocol.java b/src/org/traccar/protocol/WatchProtocol.java deleted file mode 100644 index 2be2dc9ae..000000000 --- a/src/org/traccar/protocol/WatchProtocol.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2015 - 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.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -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; - -public class WatchProtocol extends BaseProtocol { - - public WatchProtocol() { - super("watch"); - setSupportedDataCommands( - Command.TYPE_CUSTOM, - Command.TYPE_POSITION_SINGLE, - Command.TYPE_POSITION_PERIODIC, - Command.TYPE_SOS_NUMBER, - Command.TYPE_ALARM_SOS, - Command.TYPE_ALARM_BATTERY, - Command.TYPE_REBOOT_DEVICE, - Command.TYPE_ALARM_REMOVE, - Command.TYPE_SILENCE_TIME, - Command.TYPE_ALARM_CLOCK, - Command.TYPE_SET_PHONEBOOK, - Command.TYPE_VOICE_MESSAGE, - Command.TYPE_SET_TIMEZONE, - Command.TYPE_SET_INDICATOR); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new WatchFrameDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new WatchProtocolEncoder()); - pipeline.addLast("objectDecoder", new WatchProtocolDecoder(WatchProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/WatchProtocolDecoder.java b/src/org/traccar/protocol/WatchProtocolDecoder.java deleted file mode 100644 index 86dc9456d..000000000 --- a/src/org/traccar/protocol/WatchProtocolDecoder.java +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright 2015 - 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.BitUtil; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.CellTower; -import org.traccar.model.Network; -import org.traccar.model.Position; -import org.traccar.model.WifiAccessPoint; - -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.regex.Pattern; - -public class WatchProtocolDecoder extends BaseProtocolDecoder { - - public WatchProtocolDecoder(WatchProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN_POSITION = new PatternBuilder() - .number("(dd)(dd)(dd),") // date (ddmmyy) - .number("(dd)(dd)(dd),") // time (hhmmss) - .expression("([AV]),") // validity - .number(" *(-?d+.d+),") // latitude - .expression("([NS]),") - .number(" *(-?d+.d+),") // longitude - .expression("([EW])?,") - .number("(d+.d+),") // speed - .number("(d+.?d*),") // course - .number("(d+.?d*),") // altitude - .number("(d+),") // satellites - .number("(d+),") // rssi - .number("(d+),") // battery - .number("(d+),") // steps - .number("d+,") // tumbles - .number("(x+),") // status - .expression("(.*)") // cell and wifi - .compile(); - - private void sendResponse(Channel channel, String manufacturer, String id, String content) { - if (channel != null) { - channel.write(String.format( - "[%s*%s*%04x*%s]", manufacturer, id, content.length(), content)); - } - } - - private String decodeAlarm(int status) { - if (BitUtil.check(status, 0)) { - return Position.ALARM_LOW_BATTERY; - } else if (BitUtil.check(status, 1)) { - return Position.ALARM_GEOFENCE_EXIT; - } else if (BitUtil.check(status, 2)) { - return Position.ALARM_GEOFENCE_ENTER; - } else if (BitUtil.check(status, 3)) { - return Position.ALARM_OVERSPEED; - } else if (BitUtil.check(status, 16)) { - return Position.ALARM_SOS; - } else if (BitUtil.check(status, 17)) { - return Position.ALARM_LOW_BATTERY; - } else if (BitUtil.check(status, 18)) { - return Position.ALARM_GEOFENCE_EXIT; - } else if (BitUtil.check(status, 19)) { - return Position.ALARM_GEOFENCE_ENTER; - } else if (BitUtil.check(status, 20)) { - return Position.ALARM_REMOVING; - } else if (BitUtil.check(status, 21)) { - return Position.ALARM_FALL_DOWN; - } - return null; - } - - private void decodeTail(Position position, String data) { - String[] values = data.split(","); - int index = 0; - - Network network = new Network(); - - int cellCount = Integer.parseInt(values[index++]); - index += 1; // timing advance - int mcc = Integer.parseInt(values[index++]); - int mnc = Integer.parseInt(values[index++]); - - for (int i = 0; i < cellCount; i++) { - network.addCellTower(CellTower.from(mcc, mnc, - Integer.parseInt(values[index++]), Integer.parseInt(values[index++]), - Integer.parseInt(values[index++]))); - } - - if (index < values.length && !values[index].isEmpty()) { - int wifiCount = Integer.parseInt(values[index++]); - - for (int i = 0; i < wifiCount; i++) { - index += 1; // wifi name - network.addWifiAccessPoint(WifiAccessPoint.from( - values[index++], Integer.parseInt(values[index++]))); - } - } - - if (network.getCellTowers() != null || network.getWifiAccessPoints() != null) { - position.setNetwork(network); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - buf.skipBytes(1); // header - String manufacturer = buf.readBytes(2).toString(StandardCharsets.US_ASCII); - buf.skipBytes(1); // delimiter - - String id = buf.readBytes(10).toString(StandardCharsets.US_ASCII); - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, id); - if (deviceSession == null) { - return null; - } - - buf.skipBytes(1); // delimiter - buf.skipBytes(4); // length - buf.skipBytes(1); // delimiter - - buf.writerIndex(buf.writerIndex() - 1); // ignore ending - - int contentIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) ','); - if (contentIndex < 0) { - contentIndex = buf.writerIndex(); - } - - String type = buf.readBytes(contentIndex - buf.readerIndex()).toString(StandardCharsets.US_ASCII); - - if (contentIndex < buf.writerIndex()) { - buf.readerIndex(contentIndex + 1); - } - - if (type.equals("LK")) { - - sendResponse(channel, manufacturer, id, "LK"); - - if (buf.readable()) { - String[] values = buf.toString(StandardCharsets.US_ASCII).split(","); - if (values.length >= 3) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, null); - - position.set(Position.KEY_BATTERY_LEVEL, Integer.parseInt(values[2])); - - return position; - } - } - - } else if (type.equals("UD") || type.equals("UD2") || type.equals("UD3") - || type.equals("AL") || type.equals("WT")) { - - if (type.equals("AL")) { - sendResponse(channel, manufacturer, id, "AL"); - } - - Parser parser = new Parser(PATTERN_POSITION, buf.toString(StandardCharsets.US_ASCII)); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM)); - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.DEG_HEM)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - position.set(Position.KEY_SATELLITES, parser.nextInt(0)); - position.set(Position.KEY_RSSI, parser.nextInt(0)); - position.set(Position.KEY_BATTERY_LEVEL, parser.nextInt(0)); - - position.set(Position.KEY_STEPS, parser.nextInt(0)); - - int status = parser.nextHexInt(0); - position.set(Position.KEY_ALARM, decodeAlarm(status)); - if (BitUtil.check(status, 4)) { - position.set(Position.KEY_MOTION, true); - } - - decodeTail(position, parser.next()); - - return position; - - } else if (type.equals("TKQ")) { - - sendResponse(channel, manufacturer, id, "TKQ"); - - } else if (type.equals("PULSE") || type.equals("heart")) { - - if (buf.readable()) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, new Date()); - - position.setValid(false); - String pulse = buf.toString(StandardCharsets.US_ASCII); - position.set("pulse", pulse); - position.set(Position.KEY_RESULT, pulse); - - return position; - - } - - } else if (type.equals("img")) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, null); - - int timeIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), (byte) ','); - buf.readerIndex(timeIndex + 12 + 2); - position.set(Position.KEY_IMAGE, Context.getMediaManager().writeFile(id, buf, "jpg")); - - return position; - - } else if (type.equals("TK")) { - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - getLastLocation(position, null); - - position.set(Position.KEY_AUDIO, Context.getMediaManager().writeFile(id, buf, "amr")); - - return position; - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/WatchProtocolEncoder.java b/src/org/traccar/protocol/WatchProtocolEncoder.java deleted file mode 100644 index d2d3b52d1..000000000 --- a/src/org/traccar/protocol/WatchProtocolEncoder.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2016 - 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.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -import javax.xml.bind.DatatypeConverter; -import java.nio.charset.StandardCharsets; -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.TimeZone; - -public class WatchProtocolEncoder extends StringProtocolEncoder implements StringProtocolEncoder.ValueFormatter { - - @Override - public String formatValue(String key, Object value) { - if (key.equals(Command.KEY_TIMEZONE)) { - double offset = TimeZone.getTimeZone((String) value).getRawOffset() / 3600000.0; - DecimalFormat fmt = new DecimalFormat("+#.##;-#.##", DecimalFormatSymbols.getInstance(Locale.US)); - return fmt.format(offset); - } - - return null; - } - - - @Override - protected String formatCommand(Command command, String format, String... keys) { - String content = formatCommand(command, format, this, keys); - return String.format("[CS*%s*%04x*%s]", - getUniqueId(command.getDeviceId()), content.length(), content); - } - - private int getEnableFlag(Command command) { - if (command.getBoolean(Command.KEY_ENABLE)) { - return 1; - } else { - return 0; - } - } - - private static Map<Byte, Byte> mapping = new HashMap<>(); - - static { - mapping.put((byte) 0x7d, (byte) 0x01); - mapping.put((byte) 0x5B, (byte) 0x02); - mapping.put((byte) 0x5D, (byte) 0x03); - mapping.put((byte) 0x2C, (byte) 0x04); - mapping.put((byte) 0x2A, (byte) 0x05); - } - - private String getBinaryData(Command command) { - byte[] data = DatatypeConverter.parseHexBinary(command.getString(Command.KEY_DATA)); - - int encodedLength = data.length; - for (byte b : data) { - if (mapping.containsKey(b)) { - encodedLength += 1; - } - } - - int index = 0; - byte[] encodedData = new byte[encodedLength]; - - for (byte b : data) { - Byte replacement = mapping.get(b); - if (replacement != null) { - encodedData[index] = 0x7D; - index += 1; - encodedData[index] = replacement; - } else { - encodedData[index] = b; - } - index += 1; - } - - return new String(encodedData, StandardCharsets.US_ASCII); - } - - @Override - protected Object encodeCommand(Command command) { - - switch (command.getType()) { - case Command.TYPE_CUSTOM: - return formatCommand(command, command.getString(Command.KEY_DATA)); - case Command.TYPE_POSITION_SINGLE: - return formatCommand(command, "RG"); - case Command.TYPE_SOS_NUMBER: - return formatCommand(command, "SOS{%s},{%s}", Command.KEY_INDEX, Command.KEY_PHONE); - case Command.TYPE_ALARM_SOS: - return formatCommand(command, "SOSSMS," + getEnableFlag(command)); - case Command.TYPE_ALARM_BATTERY: - return formatCommand(command, "LOWBAT," + getEnableFlag(command)); - case Command.TYPE_REBOOT_DEVICE: - return formatCommand(command, "RESET"); - case Command.TYPE_ALARM_REMOVE: - return formatCommand(command, "REMOVE," + getEnableFlag(command)); - case Command.TYPE_SILENCE_TIME: - return formatCommand(command, "SILENCETIME,{%s}", Command.KEY_DATA); - case Command.TYPE_ALARM_CLOCK: - return formatCommand(command, "REMIND,{%s}", Command.KEY_DATA); - case Command.TYPE_SET_PHONEBOOK: - return formatCommand(command, "PHB,{%s}", Command.KEY_DATA); - case Command.TYPE_VOICE_MESSAGE: - return formatCommand(command, "TK," + getBinaryData(command)); - case Command.TYPE_POSITION_PERIODIC: - return formatCommand(command, "UPLOAD,{%s}", Command.KEY_FREQUENCY); - case Command.TYPE_SET_TIMEZONE: - return formatCommand(command, "LZ,,{%s}", Command.KEY_TIMEZONE); - case Command.TYPE_SET_INDICATOR: - return formatCommand(command, "FLOWER,{%s}", Command.KEY_DATA); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/WialonProtocol.java b/src/org/traccar/protocol/WialonProtocol.java deleted file mode 100644 index 02da154e2..000000000 --- a/src/org/traccar/protocol/WialonProtocol.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -import org.jboss.netty.handler.codec.string.StringDecoder; -import org.jboss.netty.handler.codec.string.StringEncoder; -import org.traccar.BaseProtocol; -import org.traccar.Context; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.nio.charset.StandardCharsets; -import java.util.List; - -public class WialonProtocol extends BaseProtocol { - - public WialonProtocol() { - super("wialon"); - setSupportedDataCommands( - Command.TYPE_REBOOT_DEVICE, - Command.TYPE_SEND_USSD, - Command.TYPE_IDENTIFICATION, - Command.TYPE_OUTPUT_CONTROL); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(4 * 1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - boolean utf8 = Context.getConfig().getBoolean(getName() + ".utf8"); - if (utf8) { - pipeline.addLast("stringDecoder", new StringDecoder(StandardCharsets.UTF_8)); - } else { - pipeline.addLast("stringDecoder", new StringDecoder()); - } - pipeline.addLast("objectEncoder", new WialonProtocolEncoder()); - pipeline.addLast("objectDecoder", new WialonProtocolDecoder(WialonProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/WialonProtocolDecoder.java b/src/org/traccar/protocol/WialonProtocolDecoder.java deleted file mode 100644 index 4eb3b9b8e..000000000 --- a/src/org/traccar/protocol/WialonProtocolDecoder.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class WialonProtocolDecoder extends BaseProtocolDecoder { - - public WialonProtocolDecoder(WialonProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("(dd)(dd)(dd);") // date (ddmmyy) - .number("(dd)(dd)(dd);") // time (hhmmss) - .number("(dd)(dd.d+);") // latitude - .expression("([NS]);") - .number("(ddd)(dd.d+);") // longitude - .expression("([EW]);") - .number("(d+.?d*)?;") // speed - .number("(d+.?d*)?;") // course - .number("(?:NA|(d+.?d*));") // altitude - .number("(?:NA|(d+))") // satellites - .groupBegin().text(";") - .number("(?:NA|(d+.?d*));") // hdop - .number("(?:NA|(d+));") // inputs - .number("(?:NA|(d+));") // outputs - .expression("(?:NA|([^;]*));") // adc - .expression("(?:NA|([^;]*));") // ibutton - .expression("(?:NA|(.*))") // params - .groupEnd("?") - .compile(); - - private void sendResponse(Channel channel, String prefix, Integer number) { - if (channel != null) { - StringBuilder response = new StringBuilder(prefix); - if (number != null) { - response.append(number); - } - response.append("\r\n"); - channel.write(response.toString()); - } - } - - private Position decodePosition(Channel channel, SocketAddress remoteAddress, String substring) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession == null) { - return null; - } - - Parser parser = new Parser(PATTERN, substring); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime(Parser.DateTimeFormat.DMY_HMS)); - - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - if (parser.hasNext()) { - int satellites = parser.nextInt(0); - position.setValid(satellites >= 3); - position.set(Position.KEY_SATELLITES, satellites); - } - - position.set(Position.KEY_HDOP, parser.nextDouble()); - position.set(Position.KEY_INPUT, parser.next()); - position.set(Position.KEY_OUTPUT, parser.next()); - - if (parser.hasNext()) { - String[] values = parser.next().split(","); - for (int i = 0; i < values.length; i++) { - position.set(Position.PREFIX_ADC + (i + 1), values[i]); - } - } - - position.set(Position.KEY_DRIVER_UNIQUE_ID, parser.next()); - - if (parser.hasNext()) { - String[] values = parser.next().split(","); - for (String param : values) { - Matcher paramParser = Pattern.compile("(.*):[1-3]:(.*)").matcher(param); - if (paramParser.matches()) { - try { - position.set(paramParser.group(1).toLowerCase(), Double.parseDouble(paramParser.group(2))); - } catch (NumberFormatException e) { - position.set(paramParser.group(1).toLowerCase(), paramParser.group(2)); - } - } - } - } - - return position; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - if (sentence.startsWith("#L#")) { - - String[] values = sentence.substring(3).split(";"); - - String imei = values[0].indexOf('.') >= 0 ? values[1] : values[0]; - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, imei); - if (deviceSession != null) { - sendResponse(channel, "#AL#", 1); - } - - } else if (sentence.startsWith("#P#")) { - - sendResponse(channel, "#AP#", null); // heartbeat - - } else if (sentence.startsWith("#SD#") || sentence.startsWith("#D#")) { - - Position position = decodePosition( - channel, remoteAddress, sentence.substring(sentence.indexOf('#', 1) + 1)); - - if (position != null) { - sendResponse(channel, "#AD#", 1); - return position; - } - - } else if (sentence.startsWith("#B#")) { - - String[] messages = sentence.substring(sentence.indexOf('#', 1) + 1).split("\\|"); - List<Position> positions = new LinkedList<>(); - - for (String message : messages) { - Position position = decodePosition(channel, remoteAddress, message); - if (position != null) { - position.set(Position.KEY_ARCHIVE, true); - positions.add(position); - } - } - - sendResponse(channel, "#AB#", messages.length); - if (!positions.isEmpty()) { - return positions; - } - - } else if (sentence.startsWith("#M#")) { - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - if (deviceSession != null) { - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - getLastLocation(position, new Date()); - position.setValid(false); - position.set(Position.KEY_RESULT, sentence.substring(sentence.indexOf('#', 1) + 1)); - sendResponse(channel, "#AM#", 1); - return position; - } - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/WialonProtocolEncoder.java b/src/org/traccar/protocol/WialonProtocolEncoder.java deleted file mode 100644 index 9c60a1356..000000000 --- a/src/org/traccar/protocol/WialonProtocolEncoder.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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 WialonProtocolEncoder extends StringProtocolEncoder { - - @Override - protected Object encodeCommand(Command command) { - switch (command.getType()) { - case Command.TYPE_REBOOT_DEVICE: - return formatCommand(command, "reboot\r\n"); - case Command.TYPE_SEND_USSD: - return formatCommand(command, "USSD:{%s}\r\n", Command.KEY_PHONE); - case Command.TYPE_IDENTIFICATION: - return formatCommand(command, "VER?\r\n"); - case Command.TYPE_OUTPUT_CONTROL: - return formatCommand(command, "L{%s}={%s}\r\n", Command.KEY_INDEX, Command.KEY_DATA); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - return null; - } -} diff --git a/src/org/traccar/protocol/WondexFrameDecoder.java b/src/org/traccar/protocol/WondexFrameDecoder.java deleted file mode 100644 index db65ff80f..000000000 --- a/src/org/traccar/protocol/WondexFrameDecoder.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2013 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; -import org.traccar.helper.StringFinder; - -public class WondexFrameDecoder extends FrameDecoder { - - private static final int KEEP_ALIVE_LENGTH = 8; - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < KEEP_ALIVE_LENGTH) { - return null; - } - - if (buf.getUnsignedByte(buf.readerIndex()) == 0xD0) { - - // Send response - ChannelBuffer frame = buf.readBytes(KEEP_ALIVE_LENGTH); - if (channel != null) { - channel.write(frame); - } - return frame; - - } else { - - int index = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new StringFinder("\r\n")); - if (index != -1) { - ChannelBuffer frame = buf.readBytes(index - buf.readerIndex()); - buf.skipBytes(2); - return frame; - } - - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/WondexProtocol.java b/src/org/traccar/protocol/WondexProtocol.java deleted file mode 100644 index ef25265aa..000000000 --- a/src/org/traccar/protocol/WondexProtocol.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2015 - 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.bootstrap.ConnectionlessBootstrap; -import org.jboss.netty.bootstrap.ServerBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -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; - -public class WondexProtocol extends BaseProtocol { - - public WondexProtocol() { - super("wondex"); - setTextCommandEncoder(new WondexProtocolEncoder()); - setSupportedCommands( - Command.TYPE_GET_DEVICE_STATUS, - Command.TYPE_GET_MODEM_STATUS, - Command.TYPE_REBOOT_DEVICE, - Command.TYPE_POSITION_SINGLE, - Command.TYPE_GET_VERSION, - Command.TYPE_IDENTIFICATION); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new WondexFrameDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new WondexProtocolEncoder()); - pipeline.addLast("objectDecoder", new WondexProtocolDecoder(WondexProtocol.this)); - } - }); - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectEncoder", new WondexProtocolEncoder()); - pipeline.addLast("objectDecoder", new WondexProtocolDecoder(WondexProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/WondexProtocolDecoder.java b/src/org/traccar/protocol/WondexProtocolDecoder.java deleted file mode 100644 index e27745f38..000000000 --- a/src/org/traccar/protocol/WondexProtocolDecoder.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2013 - 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -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.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.regex.Pattern; - -public class WondexProtocolDecoder extends BaseProtocolDecoder { - - public WondexProtocolDecoder(WondexProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("[^d]*") // header - .number("(d+),") // device identifier - .number("(dddd)(dd)(dd)") // date (yyyymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("(-?d+.d+),") // longitude - .number("(-?d+.d+),") // latitude - .number("(d+),") // speed - .number("(d+),") // course - .number("(-?d+.?d*),") // altitude - .number("(d+),") // satellites - .number("(d+),?") // event - .number("(d+.d+)V,").optional() // battery - .number("(d+.d+)?,?") // odometer - .number("(d+)?,?") // input - .number("(d+.d+)?,?") // adc1 - .number("(d+.d+)?,?") // adc2 - .number("(d+)?") // output - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - if (buf.getUnsignedByte(0) == 0xD0) { - - long deviceId = ((Long.reverseBytes(buf.getLong(0))) >> 32) & 0xFFFFFFFFL; - getDeviceSession(channel, remoteAddress, String.valueOf(deviceId)); - - return null; - } else if (buf.toString(StandardCharsets.US_ASCII).startsWith("$OK:") - || buf.toString(StandardCharsets.US_ASCII).startsWith("$ERR:") - || buf.toString(StandardCharsets.US_ASCII).startsWith("$MSG:")) { - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); - - Position position = new Position(); - position.setProtocol(getProtocolName()); - position.setDeviceId(deviceSession.getDeviceId()); - getLastLocation(position, new Date()); - position.set(Position.KEY_RESULT, buf.toString(StandardCharsets.US_ASCII)); - - return position; - } else { - - Parser parser = new Parser(PATTERN, buf.toString(StandardCharsets.US_ASCII)); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime()); - - position.setLongitude(parser.nextDouble(0)); - position.setLatitude(parser.nextDouble(0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - - int satellites = parser.nextInt(0); - position.setValid(satellites != 0); - position.set(Position.KEY_SATELLITES, satellites); - - position.set(Position.KEY_EVENT, parser.next()); - position.set(Position.KEY_BATTERY, parser.nextDouble()); - if (parser.hasNext()) { - position.set(Position.KEY_ODOMETER, parser.nextDouble(0) * 1000); - } - position.set(Position.KEY_INPUT, parser.next()); - position.set(Position.PREFIX_ADC + 1, parser.next()); - position.set(Position.PREFIX_ADC + 2, parser.next()); - position.set(Position.KEY_OUTPUT, parser.next()); - - return position; - } - - } - -} diff --git a/src/org/traccar/protocol/WondexProtocolEncoder.java b/src/org/traccar/protocol/WondexProtocolEncoder.java deleted file mode 100644 index 6258c1fe6..000000000 --- a/src/org/traccar/protocol/WondexProtocolEncoder.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2016 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.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class WondexProtocolEncoder extends StringProtocolEncoder { - @Override - protected Object encodeCommand(Command command) { - - initDevicePassword(command, "0000"); - - switch (command.getType()) { - case Command.TYPE_REBOOT_DEVICE: - return formatCommand(command, "$WP+REBOOT={%s}", Command.KEY_DEVICE_PASSWORD); - case Command.TYPE_GET_DEVICE_STATUS: - return formatCommand(command, "$WP+TEST={%s}", Command.KEY_DEVICE_PASSWORD); - case Command.TYPE_GET_MODEM_STATUS: - return formatCommand(command, "$WP+GSMINFO={%s}", Command.KEY_DEVICE_PASSWORD); - case Command.TYPE_IDENTIFICATION: - return formatCommand(command, "$WP+IMEI={%s}", Command.KEY_DEVICE_PASSWORD); - case Command.TYPE_POSITION_SINGLE: - return formatCommand(command, "$WP+GETLOCATION={%s}", Command.KEY_DEVICE_PASSWORD); - case Command.TYPE_GET_VERSION: - return formatCommand(command, "$WP+VER={%s}", Command.KEY_DEVICE_PASSWORD); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/XexunFrameDecoder.java b/src/org/traccar/protocol/XexunFrameDecoder.java deleted file mode 100644 index 801fb4d59..000000000 --- a/src/org/traccar/protocol/XexunFrameDecoder.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2012 - 2016 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.handler.codec.frame.FrameDecoder; -import org.traccar.helper.StringFinder; - -public class XexunFrameDecoder extends FrameDecoder { - - @Override - protected Object decode( - ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) throws Exception { - - if (buf.readableBytes() < 80) { - return null; - } - - int beginIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new StringFinder("GPRMC")); - if (beginIndex == -1) { - beginIndex = buf.indexOf(buf.readerIndex(), buf.writerIndex(), new StringFinder("GNRMC")); - if (beginIndex == -1) { - return null; - } - } - - int identifierIndex = buf.indexOf(beginIndex, buf.writerIndex(), new StringFinder("imei:")); - if (identifierIndex == -1) { - return null; - } - - int endIndex = buf.indexOf(identifierIndex, buf.writerIndex(), (byte) ','); - if (endIndex == -1) { - return null; - } - - buf.skipBytes(beginIndex - buf.readerIndex()); - - return buf.readBytes(endIndex - beginIndex + 1); - } - -} diff --git a/src/org/traccar/protocol/XexunProtocol.java b/src/org/traccar/protocol/XexunProtocol.java deleted file mode 100644 index b90cbfaaf..000000000 --- a/src/org/traccar/protocol/XexunProtocol.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2015 - 2016 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.frame.LineBasedFrameDecoder; -import org.jboss.netty.handler.codec.string.StringDecoder; -import org.jboss.netty.handler.codec.string.StringEncoder; -import org.traccar.BaseProtocol; -import org.traccar.Context; -import org.traccar.TrackerServer; -import org.traccar.model.Command; - -import java.util.List; - -public class XexunProtocol extends BaseProtocol { - - public XexunProtocol() { - super("xexun"); - setSupportedDataCommands( - Command.TYPE_ENGINE_STOP, - Command.TYPE_ENGINE_RESUME); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - boolean full = Context.getConfig().getBoolean(getName() + ".extended"); - if (full) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); // tracker bug \n\r - } else { - pipeline.addLast("frameDecoder", new XexunFrameDecoder()); - } - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectEncoder", new XexunProtocolEncoder()); - pipeline.addLast("objectDecoder", new XexunProtocolDecoder(XexunProtocol.this, full)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/XexunProtocolDecoder.java b/src/org/traccar/protocol/XexunProtocolDecoder.java deleted file mode 100644 index bb4b4f48c..000000000 --- a/src/org/traccar/protocol/XexunProtocolDecoder.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 2012 - 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.helper.DateBuilder; -import org.traccar.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class XexunProtocolDecoder extends BaseProtocolDecoder { - - private final boolean full; - - public XexunProtocolDecoder(XexunProtocol protocol, boolean full) { - super(protocol); - this.full = full; - } - - private static final Pattern PATTERN_BASIC = new PatternBuilder() - .expression("G[PN]RMC,") - .number("(?:(dd)(dd)(dd))?.?d*,") // time (hhmmss) - .expression("([AV]),") // validity - .number("(d*?)(d?d.d+),([NS]),") // latitude - .number("(d*?)(d?d.d+),([EW])?,") // longitude - .number("(d+.?d*),") // speed - .number("(d+.?d*)?,") // course - .number("(?:(dd)(dd)(dd))?,") // date (ddmmyy) - .expression("[^*]*").text("*") - .number("xx") // checksum - .expression("\\r\\n").optional() - .expression(",([FL]),") // signal - .expression("([^,]*),").optional() // alarm - .any() - .number("imei:(d+),") // imei - .compile(); - - private static final Pattern PATTERN_FULL = new PatternBuilder() - .any() - .number("(d+),") // serial - .expression("([^,]+)?,") // phone number - .expression(PATTERN_BASIC.pattern()) - .number("(d+),") // satellites - .number("(-?d+.d+)?,") // altitude - .number("[FL]:(d+.d+)V") // power - .any() - .compile(); - - private String decodeStatus(Position position, String value) { - if (value != null) { - switch (value.toLowerCase()) { - case "acc on": - case "accstart": - position.set(Position.KEY_IGNITION, true); - break; - case "acc off": - case "accstop": - position.set(Position.KEY_IGNITION, false); - break; - case "help me!": - position.set(Position.KEY_ALARM, Position.ALARM_SOS); - break; - case "low battery": - position.set(Position.KEY_ALARM, Position.ALARM_LOW_BATTERY); - break; - case "move!": - case "moved!": - position.set(Position.KEY_ALARM, Position.ALARM_MOVEMENT); - break; - default: - break; - } - } - return null; - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Pattern pattern = PATTERN_BASIC; - if (full) { - pattern = PATTERN_FULL; - } - - Parser parser = new Parser(pattern, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - if (full) { - position.set("serial", parser.next()); - position.set("number", parser.next()); - } - - DateBuilder dateBuilder = new DateBuilder() - .setTime(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - - position.setValid(parser.next().equals("A")); - position.setLatitude(parser.nextCoordinate()); - position.setLongitude(parser.nextCoordinate()); - - position.setSpeed(convertSpeed(parser.nextDouble(0), "kn")); - - position.setCourse(parser.nextDouble(0)); - - dateBuilder.setDateReverse(parser.nextInt(0), parser.nextInt(0), parser.nextInt(0)); - position.setTime(dateBuilder.getDate()); - - position.set("signal", parser.next()); - - decodeStatus(position, parser.next()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - if (full) { - position.set(Position.KEY_SATELLITES, parser.nextInt()); - - position.setAltitude(parser.nextDouble(0)); - - position.set(Position.KEY_POWER, parser.nextDouble(0)); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/XexunProtocolEncoder.java b/src/org/traccar/protocol/XexunProtocolEncoder.java deleted file mode 100644 index cdf3ac6f7..000000000 --- a/src/org/traccar/protocol/XexunProtocolEncoder.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2016 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.traccar.StringProtocolEncoder; -import org.traccar.helper.Log; -import org.traccar.model.Command; - -public class XexunProtocolEncoder extends StringProtocolEncoder { - - @Override - protected Object encodeCommand(Command command) { - - initDevicePassword(command, "123456"); - - switch (command.getType()) { - case Command.TYPE_ENGINE_STOP: - return formatCommand(command, "powercar{%s} 11", Command.KEY_DEVICE_PASSWORD); - case Command.TYPE_ENGINE_RESUME: - return formatCommand(command, "powercar{%s} 00", Command.KEY_DEVICE_PASSWORD); - default: - Log.warning(new UnsupportedOperationException(command.getType())); - break; - } - - return null; - } - -} diff --git a/src/org/traccar/protocol/XirgoProtocol.java b/src/org/traccar/protocol/XirgoProtocol.java deleted file mode 100644 index 9d7475308..000000000 --- a/src/org/traccar/protocol/XirgoProtocol.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2015 - 2016 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.ConnectionlessBootstrap; -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.CharacterDelimiterFrameDecoder; -import org.traccar.TrackerServer; - -import java.util.List; - -public class XirgoProtocol extends BaseProtocol { - - public XirgoProtocol() { - super("xirgo"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new CharacterDelimiterFrameDecoder(1024, "##")); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new XirgoProtocolDecoder(XirgoProtocol.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("objectDecoder", new XirgoProtocolDecoder(XirgoProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/XirgoProtocolDecoder.java b/src/org/traccar/protocol/XirgoProtocolDecoder.java deleted file mode 100644 index b1442170d..000000000 --- a/src/org/traccar/protocol/XirgoProtocolDecoder.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright 2015 - 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.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 { - - public XirgoProtocolDecoder(XirgoProtocol protocol) { - super(protocol); - } - - private Boolean newFormat; - - 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(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - 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(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.set(Position.KEY_EVENT, parser.next()); - - 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, 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; - } - -} diff --git a/src/org/traccar/protocol/Xt013Protocol.java b/src/org/traccar/protocol/Xt013Protocol.java deleted file mode 100644 index ad3e24df0..000000000 --- a/src/org/traccar/protocol/Xt013Protocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class Xt013Protocol extends BaseProtocol { - - public Xt013Protocol() { - super("xt013"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("objectDecoder", new Xt013ProtocolDecoder(Xt013Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Xt013ProtocolDecoder.java b/src/org/traccar/protocol/Xt013ProtocolDecoder.java deleted file mode 100644 index f1214fdb4..000000000 --- a/src/org/traccar/protocol/Xt013ProtocolDecoder.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * 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.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.DeviceSession; -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 Xt013ProtocolDecoder extends BaseProtocolDecoder { - - public Xt013ProtocolDecoder(Xt013Protocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .number("HI,d+").optional() - .text("TK,") - .number("(d+),") // imei - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .number("([+-]d+.d+),") // latitude - .number("([+-]d+.d+),") // longitude - .number("(d+),") // speed - .number("(d+),") // course - .number("d+,") - .number("(d+),") // altitude - .expression("([FL]),") // gps fix - .number("d+,") - .number("(d+),") // gps level - .number("x+,") - .number("x+,") - .number("(d+),") // gsm level - .expression("[^,]*,") - .number("(d+.d+),") // battery - .number("(d),") // charging - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - Parser parser = new Parser(PATTERN, (String) msg); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime()); - - position.setLatitude(parser.nextDouble(0)); - position.setLongitude(parser.nextDouble(0)); - position.setSpeed(UnitsConverter.knotsFromKph(parser.nextDouble(0))); - position.setCourse(parser.nextDouble(0)); - position.setAltitude(parser.nextDouble(0)); - position.setValid(parser.next().equals("F")); - - position.set(Position.KEY_SATELLITES, parser.nextInt()); - position.set(Position.KEY_RSSI, parser.nextDouble()); - position.set(Position.KEY_BATTERY, parser.nextDouble(0)); - position.set(Position.KEY_CHARGE, parser.next().equals("1")); - - return position; - } - -} diff --git a/src/org/traccar/protocol/Xt2400Protocol.java b/src/org/traccar/protocol/Xt2400Protocol.java deleted file mode 100644 index 0c5e9cd4c..000000000 --- a/src/org/traccar/protocol/Xt2400Protocol.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 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.bootstrap.ConnectionlessBootstrap; -import org.jboss.netty.channel.ChannelPipeline; -import org.traccar.BaseProtocol; -import org.traccar.TrackerServer; - -import java.util.List; - -public class Xt2400Protocol extends BaseProtocol { - - public Xt2400Protocol() { - super("xt2400"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ConnectionlessBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("objectDecoder", new Xt2400ProtocolDecoder(Xt2400Protocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/Xt2400ProtocolDecoder.java b/src/org/traccar/protocol/Xt2400ProtocolDecoder.java deleted file mode 100644 index 15e8558be..000000000 --- a/src/org/traccar/protocol/Xt2400ProtocolDecoder.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 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.buffer.ChannelBuffer; -import org.jboss.netty.channel.Channel; -import org.traccar.BaseProtocolDecoder; -import org.traccar.Context; -import org.traccar.DeviceSession; -import org.traccar.helper.UnitsConverter; -import org.traccar.model.Position; - -import javax.xml.bind.DatatypeConverter; -import java.net.SocketAddress; -import java.nio.charset.StandardCharsets; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Xt2400ProtocolDecoder extends BaseProtocolDecoder { - - public Xt2400ProtocolDecoder(Xt2400Protocol protocol) { - super(protocol); - - String config = Context.getConfig().getString(getProtocolName() + ".config"); - if (config != null) { - setConfig(config); - } - } - - private static final Map<Integer, Integer> TAG_LENGTH_MAP = new HashMap<>(); - - static { - int[] l1 = { - 0x01, 0x02, 0x04, 0x0b, 0x0c, 0x0d, 0x12, 0x13, - 0x16, 0x17, 0x1c, 0x1f, 0x23, 0x2c, 0x2d, 0x30, - 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x40, 0x41, - 0x53, 0x66, 0x69, 0x6a, 0x93, 0x94, 0x96 - }; - int[] l2 = { - 0x05, 0x09, 0x0a, 0x14, 0x15, 0x1d, 0x1e, 0x24, - 0x26, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, - 0x49, 0x57, 0x58, 0x59, 0x5a, 0x6b, 0x6f, 0x7A, - 0x7B, 0x7C, 0x7d, 0x7E, 0x7F, 0x80, 0x81, 0x82, - 0x83, 0x84, 0x85, 0x86 - }; - int[] l4 = { - 0x03, 0x06, 0x07, 0x08, 0x0e, 0x0f, 0x10, 0x11, - 0x18, 0x19, 0x1a, 0x1b, 0x20, 0x21, 0x22, 0x2e, - 0x2f, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, - 0x51, 0x52, 0x54, 0x55, 0x56, 0x5b, 0x5c, 0x5d, - 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x68, 0x6e, 0x71, - 0x72, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x87, - 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d - }; - for (int i : l1) { - TAG_LENGTH_MAP.put(i, 1); - } - for (int i : l2) { - TAG_LENGTH_MAP.put(i, 2); - } - for (int i : l4) { - TAG_LENGTH_MAP.put(i, 4); - } - TAG_LENGTH_MAP.put(0x95, 24); - } - - private static int getTagLength(int tag) { - Integer length = TAG_LENGTH_MAP.get(tag); - if (length == null) { - throw new IllegalArgumentException("Unknown tag: " + tag); - } - return length; - } - - private Map<Short, byte[]> formats = new HashMap<>(); - - public void setConfig(String configString) { - Pattern pattern = Pattern.compile(":wycfg pcr\\[\\d+\\] ([0-9a-fA-F]{2})[0-9a-fA-F]{2}([0-9a-fA-F]+)"); - Matcher matcher = pattern.matcher(configString); - while (matcher.find()) { - formats.put(Short.parseShort(matcher.group(1), 16), DatatypeConverter.parseHexBinary(matcher.group(2))); - } - } - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - ChannelBuffer buf = (ChannelBuffer) msg; - - byte[] format = null; - if (formats.size() > 1) { - format = formats.get(buf.getUnsignedByte(buf.readerIndex())); - } else if (!formats.isEmpty()) { - format = formats.values().iterator().next(); - } - - if (format == null) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - for (byte tag : format) { - switch ((int) tag) { - case 0x03: - DeviceSession deviceSession = getDeviceSession( - channel, remoteAddress, String.valueOf(buf.readUnsignedInt())); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - break; - case 0x04: - position.set(Position.KEY_EVENT, buf.readUnsignedByte()); - break; - case 0x05: - position.set(Position.KEY_INDEX, buf.readUnsignedShort()); - break; - case 0x06: - position.setTime(new Date(buf.readUnsignedInt() * 1000)); - break; - case 0x07: - position.setLatitude(buf.readInt() * 0.000001); - break; - case 0x08: - position.setLongitude(buf.readInt() * 0.000001); - break; - case 0x09: - position.setAltitude(buf.readShort() * 0.1); - break; - case 0x0a: - position.setCourse(buf.readShort() * 0.1); - break; - case 0x0b: - position.setSpeed(UnitsConverter.knotsFromKph(buf.readUnsignedByte())); - break; - case 0x10: - position.set(Position.KEY_ODOMETER_TRIP, buf.readUnsignedInt()); - break; - case 0x12: - position.set(Position.KEY_HDOP, buf.readUnsignedByte() * 0.1); - break; - case 0x13: - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); - break; - case 0x14: - position.set(Position.KEY_RSSI, buf.readShort()); - break; - case 0x16: - position.set(Position.KEY_BATTERY, buf.readUnsignedByte() * 0.1); - break; - case 0x17: - position.set(Position.KEY_POWER, buf.readUnsignedByte() * 0.1); - break; - case 0x57: - position.set(Position.KEY_OBD_SPEED, UnitsConverter.knotsFromKph(buf.readUnsignedShort())); - break; - case 0x65: - position.set(Position.KEY_VIN, buf.readBytes(17).toString(StandardCharsets.US_ASCII)); - break; - case 0x73: - position.set(Position.KEY_VERSION_FW, buf.readBytes(16).toString(StandardCharsets.US_ASCII).trim()); - break; - default: - buf.skipBytes(getTagLength(tag)); - break; - } - } - - if (position.getLatitude() != 0 && position.getLongitude() != 0) { - position.setValid(true); - } else { - getLastLocation(position, position.getDeviceTime()); - } - - return position; - } - -} diff --git a/src/org/traccar/protocol/YwtProtocol.java b/src/org/traccar/protocol/YwtProtocol.java deleted file mode 100644 index 412365ecb..000000000 --- a/src/org/traccar/protocol/YwtProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.frame.LineBasedFrameDecoder; -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 java.util.List; - -public class YwtProtocol extends BaseProtocol { - - public YwtProtocol() { - super("ywt"); - } - - @Override - public void initTrackerServers(List<TrackerServer> serverList) { - serverList.add(new TrackerServer(new ServerBootstrap(), getName()) { - @Override - protected void addSpecificHandlers(ChannelPipeline pipeline) { - pipeline.addLast("frameDecoder", new LineBasedFrameDecoder(1024)); - pipeline.addLast("stringEncoder", new StringEncoder()); - pipeline.addLast("stringDecoder", new StringDecoder()); - pipeline.addLast("objectDecoder", new YwtProtocolDecoder(YwtProtocol.this)); - } - }); - } - -} diff --git a/src/org/traccar/protocol/YwtProtocolDecoder.java b/src/org/traccar/protocol/YwtProtocolDecoder.java deleted file mode 100644 index 6a98ab9e7..000000000 --- a/src/org/traccar/protocol/YwtProtocolDecoder.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2013 - 2014 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.helper.Parser; -import org.traccar.helper.PatternBuilder; -import org.traccar.model.Position; - -import java.net.SocketAddress; -import java.util.regex.Pattern; - -public class YwtProtocolDecoder extends BaseProtocolDecoder { - - public YwtProtocolDecoder(YwtProtocol protocol) { - super(protocol); - } - - private static final Pattern PATTERN = new PatternBuilder() - .expression("%(..),") // type - .number("(d+):") // unit identifier - .number("d+,") // subtype - .number("(dd)(dd)(dd)") // date (yymmdd) - .number("(dd)(dd)(dd),") // time (hhmmss) - .expression("([EW])") - .number("(ddd.d{6}),") // longitude - .expression("([NS])") - .number("(dd.d{6}),") // latitude - .number("(d+)?,") // altitude - .number("(d+),") // speed - .number("(d+),") // course - .number("(d+),") // satellite - .expression("([^,]+),") // report identifier - .expression("([-0-9a-fA-F]+)") // status - .any() - .compile(); - - @Override - protected Object decode( - Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { - - String sentence = (String) msg; - - // Synchronization - if (sentence.startsWith("%SN") && channel != null) { - int start = sentence.indexOf(':'); - int end = start; - for (int i = 0; i < 4; i++) { - end = sentence.indexOf(',', end + 1); - } - if (end == -1) { - end = sentence.length(); - } - - channel.write("%AT+SN=" + sentence.substring(start, end)); - return null; - } - - Parser parser = new Parser(PATTERN, sentence); - if (!parser.matches()) { - return null; - } - - Position position = new Position(); - position.setProtocol(getProtocolName()); - - String type = parser.next(); - - DeviceSession deviceSession = getDeviceSession(channel, remoteAddress, parser.next()); - if (deviceSession == null) { - return null; - } - position.setDeviceId(deviceSession.getDeviceId()); - - position.setTime(parser.nextDateTime()); - - position.setLongitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG)); - position.setLatitude(parser.nextCoordinate(Parser.CoordinateFormat.HEM_DEG)); - position.setAltitude(parser.nextDouble(0)); - position.setSpeed(parser.nextDouble(0)); - position.setCourse(parser.nextDouble(0)); - - int satellites = parser.nextInt(0); - position.setValid(satellites >= 3); - position.set(Position.KEY_SATELLITES, satellites); - - String reportId = parser.next(); - - position.set(Position.KEY_STATUS, parser.next()); - - // Send response - if ((type.equals("KP") || type.equals("EP")) && channel != null) { - channel.write("%AT+" + type + "=" + reportId + "\r\n"); - } - - return position; - } - -} |