aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2018-05-15 17:08:04 +1200
committerAnton Tananaev <anton.tananaev@gmail.com>2018-05-15 17:08:04 +1200
commit723bb89389f4de335a9a6527da62fb58c18b154c (patch)
treebcbcbdad088de13abdae221557498e965911ba24 /src
parent2bf146c30d332aad1eaa856d5db026290e02e089 (diff)
downloadtraccar-server-723bb89389f4de335a9a6527da62fb58c18b154c.tar.gz
traccar-server-723bb89389f4de335a9a6527da62fb58c18b154c.tar.bz2
traccar-server-723bb89389f4de335a9a6527da62fb58c18b154c.zip
Implement Telemax protocol
Diffstat (limited to 'src')
-rw-r--r--src/org/traccar/protocol/TelemaxProtocol.java47
-rw-r--r--src/org/traccar/protocol/TelemaxProtocolDecoder.java111
2 files changed, 158 insertions, 0 deletions
diff --git a/src/org/traccar/protocol/TelemaxProtocol.java b/src/org/traccar/protocol/TelemaxProtocol.java
new file mode 100644
index 000000000..5dee95c8e
--- /dev/null
+++ b/src/org/traccar/protocol/TelemaxProtocol.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 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 TelemaxProtocol extends BaseProtocol {
+
+ public TelemaxProtocol() {
+ super("telemax");
+ }
+
+ @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 TelemaxProtocolDecoder(TelemaxProtocol.this));
+ }
+ });
+ }
+
+}
diff --git a/src/org/traccar/protocol/TelemaxProtocolDecoder.java b/src/org/traccar/protocol/TelemaxProtocolDecoder.java
new file mode 100644
index 000000000..a52a83133
--- /dev/null
+++ b/src/org/traccar/protocol/TelemaxProtocolDecoder.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2018 Anton Tananaev (anton@traccar.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 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.model.Position;
+
+import java.net.SocketAddress;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+public class TelemaxProtocolDecoder extends BaseProtocolDecoder {
+
+ public TelemaxProtocolDecoder(TelemaxProtocol protocol) {
+ super(protocol);
+ }
+
+ private String readValue(String sentence, int[] index, int length) {
+ String value = sentence.substring(index[0], index[0] + length);
+ index[0] += length;
+ return value;
+ }
+
+ @Override
+ protected Object decode(
+ Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {
+
+ String sentence = (String) msg;
+
+ if (sentence.startsWith("%")) {
+ int length = Integer.parseInt(sentence.substring(1, 3));
+ getDeviceSession(channel, remoteAddress, sentence.substring(3, 3 + length));
+ return null;
+ }
+
+ DeviceSession deviceSession = getDeviceSession(channel, remoteAddress);
+ if (deviceSession == null) {
+ return null;
+ }
+
+ int[] index = {0};
+
+ if (!readValue(sentence, index, 1).equals("Y")) {
+ return null;
+ }
+
+ readValue(sentence, index, 8); // command id
+ readValue(sentence, index, 6); // password
+ readValue(sentence, index, Integer.parseInt(readValue(sentence, index, 2), 16)); // unit id
+ readValue(sentence, index, 2); // frame count
+
+ readValue(sentence, index, 2); // data format
+
+ int interval = Integer.parseInt(readValue(sentence, index, 4), 16);
+
+ readValue(sentence, index, 2); // info flags
+ readValue(sentence, index, 2); // version
+
+ int count = Integer.parseInt(readValue(sentence, index, 2), 16);
+
+ Date time = null;
+ List<Position> positions = new LinkedList<>();
+
+ for (int i = 0; i < count; i++) {
+
+ Position position = new Position(getProtocolName());
+ position.setDeviceId(deviceSession.getDeviceId());
+
+ int speed = Integer.parseInt(readValue(sentence, index, 2), 16);
+
+ position.setValid(BitUtil.check(speed, 7));
+ position.setSpeed(BitUtil.to(speed, 7));
+
+ position.setLongitude((Integer.parseInt(readValue(sentence, index, 6), 16) - 5400000) / 30000.0);
+ position.setLatitude((Integer.parseInt(readValue(sentence, index, 6), 16) - 5400000) / 30000.0);
+
+ if (i == 0 | i == count - 1) {
+ time = new SimpleDateFormat("yyMMddhhmmss").parse(readValue(sentence, index, 12));
+ position.set(Position.KEY_STATUS, readValue(sentence, index, 8));
+ } else {
+ time = new Date(time.getTime() + interval * 1000);
+ }
+
+ position.setTime(time);
+
+ positions.add(position);
+
+ }
+
+ return positions;
+ }
+
+}