diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2012-10-07 22:22:40 +1300 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2012-10-07 22:22:40 +1300 |
commit | f9da745ca13052396c40c4e8f99da7cd4ed14d3c (patch) | |
tree | 1374cac87060c8feee0ca5be178a1f337a39d9c0 | |
parent | ba8ece8a5b1c784f96c306e3fcbe6c612a1e4f97 (diff) | |
download | traccar-server-f9da745ca13052396c40c4e8f99da7cd4ed14d3c.tar.gz traccar-server-f9da745ca13052396c40c4e8f99da7cd4ed14d3c.tar.bz2 traccar-server-f9da745ca13052396c40c4e8f99da7cd4ed14d3c.zip |
Progress protocol template
-rw-r--r-- | opengts.cfg | 8 | ||||
-rw-r--r-- | src/org/traccar/Server.java | 21 | ||||
-rw-r--r-- | src/org/traccar/TrackerServer.java | 9 | ||||
-rw-r--r-- | src/org/traccar/protocol/ProgressProtocolDecoder.java | 93 |
4 files changed, 126 insertions, 5 deletions
diff --git a/opengts.cfg b/opengts.cfg index fa1676d57..6ab52c6d8 100644 --- a/opengts.cfg +++ b/opengts.cfg @@ -6,9 +6,9 @@ <!-- Global confiduration --> <entry key="database.driver">com.mysql.jdbc.Driver</entry> - <entry key="database.url">jdbc:mysql://localhost/gts?allowMultiQueries=true</entry> - <entry key="database.user">root</entry> - <entry key="database.password">root</entry> + <entry key="database.url">jdbc:mysql://[DATABASE]</entry> + <entry key="database.user">[USER]</entry> + <entry key="database.password">[PASSWORD]</entry> <!-- Database refresh delay in seconds --> <entry key="database.refreshDelay">300</entry> @@ -48,7 +48,7 @@ <!-- Logging options --> <entry key="logger.enable">true</entry> - <entry key="logger.file">/home/user/Documents/tracker-server.log</entry> + <entry key="logger.file">[LOG]</entry> <!-- Xexun server configuration --> <entry key="xexun.enable">true</entry> 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; @@ -60,6 +62,13 @@ public class TrackerServer extends ServerBootstrap { } /** + * Set endianness + */ + void setEndianness(ByteOrder byteOrder) { + setOption("child.bufferFactory", new HeapChannelBufferFactory(byteOrder)); + } + + /** * Opened channels */ private ChannelGroup allChannels = new DefaultChannelGroup(); 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; + } + +} |