From f9da745ca13052396c40c4e8f99da7cd4ed14d3c Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sun, 7 Oct 2012 22:22:40 +1300 Subject: Progress protocol template --- opengts.cfg | 8 +- src/org/traccar/Server.java | 21 ++++- src/org/traccar/TrackerServer.java | 9 +++ .../traccar/protocol/ProgressProtocolDecoder.java | 93 ++++++++++++++++++++++ 4 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 src/org/traccar/protocol/ProgressProtocolDecoder.java diff --git a/opengts.cfg b/opengts.cfg index fa1676d57..6ab52c6d8 100644 --- a/opengts.cfg +++ b/opengts.cfg @@ -6,9 +6,9 @@ com.mysql.jdbc.Driver - jdbc:mysql://localhost/gts?allowMultiQueries=true - root - root + jdbc:mysql://[DATABASE] + [USER] + [PASSWORD] 300 @@ -48,7 +48,7 @@ true - /home/user/Documents/tracker-server.log + [LOG] true diff --git a/src/org/traccar/Server.java b/src/org/traccar/Server.java index 7df1a463a..7dcabe084 100644 --- a/src/org/traccar/Server.java +++ b/src/org/traccar/Server.java @@ -499,5 +499,24 @@ public class Server { serverList.add(server); } } - + + private void initProgressServer(Properties properties) throws SQLException { + String protocol = "progress"; + if (isProtocolEnabled(properties, protocol)) { + + TrackerServer server = new TrackerServer(getProtocolPort(properties, protocol)); + server.setEndianness(java.nio.ByteOrder.LITTLE_ENDIAN); + final Integer resetDelay = getProtocolResetDelay(properties, protocol); + + server.setPipelineFactory(new GenericPipelineFactory(server, dataManager, isLoggerEnabled(), geocoder) { + protected void addSpecificHandlers(ChannelPipeline pipeline) { + pipeline.addLast("frameDecoder", new LengthFieldBasedFrameDecoder(1024, 2, 2, 0, 0)); + pipeline.addLast("objectDecoder", new ProgressProtocolDecoder(getDataManager(), resetDelay)); + } + }); + + serverList.add(server); + } + } + } diff --git a/src/org/traccar/TrackerServer.java b/src/org/traccar/TrackerServer.java index da889d0a3..488186606 100644 --- a/src/org/traccar/TrackerServer.java +++ b/src/org/traccar/TrackerServer.java @@ -16,8 +16,10 @@ package org.traccar; import java.net.InetSocketAddress; +import java.nio.ByteOrder; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ServerBootstrap; +import org.jboss.netty.buffer.HeapChannelBufferFactory; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.group.ChannelGroup; import org.jboss.netty.channel.group.ChannelGroupFuture; @@ -59,6 +61,13 @@ public class TrackerServer extends ServerBootstrap { port = newPort; } + /** + * Set endianness + */ + void setEndianness(ByteOrder byteOrder) { + setOption("child.bufferFactory", new HeapChannelBufferFactory(byteOrder)); + } + /** * Opened channels */ diff --git a/src/org/traccar/protocol/ProgressProtocolDecoder.java b/src/org/traccar/protocol/ProgressProtocolDecoder.java new file mode 100644 index 000000000..15cffbbda --- /dev/null +++ b/src/org/traccar/protocol/ProgressProtocolDecoder.java @@ -0,0 +1,93 @@ +/* + * Copyright 2012 Anton Tananaev (anton.tananaev@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 java.nio.charset.Charset; +import org.jboss.netty.buffer.ChannelBuffer; +import org.jboss.netty.channel.Channel; +import org.jboss.netty.channel.ChannelHandlerContext; +import org.traccar.GenericProtocolDecoder; +import org.traccar.model.DataManager; +import org.traccar.model.Position; + +/** + * Progress tracker protocol decoder + */ +public class ProgressProtocolDecoder extends GenericProtocolDecoder { + + /** + * Device ID + */ + private long deviceId; + + /** + * Initialize + */ + public ProgressProtocolDecoder(DataManager dataManager, Integer resetDelay) { + super(dataManager, resetDelay); + } + + /* + * Message types + */ + static final int MSG_NULL = 0; + static final int MSG_IDENT = 1; + static final int MSG_IDENT_FULL = 2; + static final int MSG_POINT = 10; + static final int MSG_LOG_SYNC = 100; + static final int MSG_LOGMSG = 101; + static final int MSG_TEXT = 102; + static final int MSG_ALARM = 200; + static final int MSG_ALARM_RECIEVED = 201; + + /** + * Decode message + */ + protected Object decode( + ChannelHandlerContext ctx, Channel channel, Object msg) + throws Exception { + + ChannelBuffer buf = (ChannelBuffer) msg; + int type = buf.readUnsignedShort(); + int length = buf.readUnsignedShort(); + + // Authentication + if (type == MSG_IDENT || type == MSG_IDENT_FULL) { + long id = buf.readUnsignedInt(); + length = buf.readUnsignedShort(); + buf.skipBytes(length); + length = buf.readUnsignedShort(); + String imei = buf.readBytes(length).toString(Charset.defaultCharset()); + deviceId = getDataManager().getDeviceByImei(imei).getId(); + } + + // Position + else if (type == MSG_POINT || type == MSG_ALARM) { + Position position = new Position(); + position.setDeviceId(deviceId); + // TODO: parse messages here + + if (type == MSG_ALARM) { + // TODO: send MSG_ALARM_RECIEVED / channel.write(...); + } + + return position; + } + + return null; + } + +} -- cgit v1.2.3