aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Tananaev <anton.tananaev@gmail.com>2015-09-21 11:23:14 +1200
committerAnton Tananaev <anton.tananaev@gmail.com>2015-09-21 11:23:14 +1200
commit992a1530ef1636025932b67aab1ba7cfaabce9e3 (patch)
tree5b8831f1eb318ddf5927a03fbc9f2e3733ec8c9f
parent87f6ffa67c2cd4b3e7ce72ed7257ea15526c0052 (diff)
downloadtraccar-server-992a1530ef1636025932b67aab1ba7cfaabce9e3.tar.gz
traccar-server-992a1530ef1636025932b67aab1ba7cfaabce9e3.tar.bz2
traccar-server-992a1530ef1636025932b67aab1ba7cfaabce9e3.zip
Support Tytan protocol version 2
-rw-r--r--src/org/traccar/protocol/TytanProtocolDecoder.java107
-rw-r--r--test/org/traccar/protocol/TytanProtocolDecoderTest.java34
2 files changed, 19 insertions, 122 deletions
diff --git a/src/org/traccar/protocol/TytanProtocolDecoder.java b/src/org/traccar/protocol/TytanProtocolDecoder.java
index f7c9b8e4d..bdfe19dfc 100644
--- a/src/org/traccar/protocol/TytanProtocolDecoder.java
+++ b/src/org/traccar/protocol/TytanProtocolDecoder.java
@@ -27,6 +27,7 @@ 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.helper.BitUtil;
import org.traccar.helper.ChannelBufferTools;
import org.traccar.helper.UnitsConverter;
import org.traccar.model.Event;
@@ -52,6 +53,7 @@ public class TytanProtocolDecoder extends BaseProtocolDecoder {
ChannelBuffer buf = (ChannelBuffer) msg;
buf.readUnsignedByte(); // protocol
+ buf.readUnsignedShort(); // length
int index = buf.readUnsignedByte() >> 3;
if (channel != null) {
@@ -67,7 +69,7 @@ public class TytanProtocolDecoder extends BaseProtocolDecoder {
List<Position> positions = new LinkedList<>();
- while (buf.readable()) {
+ while (buf.readableBytes() > 2) {
Position position = new Position();
position.setProtocol(getProtocolName());
@@ -78,9 +80,8 @@ public class TytanProtocolDecoder extends BaseProtocolDecoder {
position.setTime(new Date(buf.readUnsignedInt() * 1000));
int flags = buf.readUnsignedByte();
- position.set(Event.KEY_GPS, flags >> 5);
- position.set(Event.KEY_GSM, flags & 0x07);
- position.setValid(((flags & 0x08) != 0) ^ ((flags & 0x10) != 0));
+ position.set(Event.KEY_SATELLITES, BitUtil.range(flags, 2));
+ position.setValid(BitUtil.range(flags, 0, 2) > 0);
// Latitude
double lat = buf.readUnsignedMedium();
@@ -95,9 +96,7 @@ public class TytanProtocolDecoder extends BaseProtocolDecoder {
// Status
flags = buf.readUnsignedByte();
position.set(Event.KEY_STATUS, flags & 0x1f);
- int course = (flags >> 5) * 45;
- course = (course + 180) % 360;
- position.setCourse(course);
+ position.setCourse((BitUtil.range(flags, 5) * 45 + 180) % 360);
// Speed
int speed = buf.readUnsignedByte();
@@ -106,14 +105,17 @@ public class TytanProtocolDecoder extends BaseProtocolDecoder {
}
while (buf.readerIndex() < end) {
- int x = buf.getUnsignedByte(buf.readerIndex());
+
+ int type = buf.readUnsignedByte();
+ int length = buf.readUnsignedByte();
+ if (length == 255) {
+ length += buf.readUnsignedByte();
+ }
+
switch (buf.readUnsignedByte()) {
case 2:
position.set(Event.KEY_ODOMETER, buf.readUnsignedMedium());
break;
- case 4:
- buf.readUnsignedShort(); // device start
- break;
case 5:
position.set(Event.KEY_INPUT, buf.readUnsignedByte());
break;
@@ -139,9 +141,6 @@ public class TytanProtocolDecoder extends BaseProtocolDecoder {
case 10:
position.set("unauthorized", ChannelBufferTools.readHexString(buf, 16));
break;
- case 23:
- buf.skipBytes(9);
- break;
case 24:
{
Set<Integer> temps = new LinkedHashSet<>();
@@ -157,97 +156,25 @@ public class TytanProtocolDecoder extends BaseProtocolDecoder {
}
}
break;
- case 25:
- buf.readUnsignedByte();
- buf.readUnsignedShort(); // fuel
- break;
- case 26:
- buf.skipBytes(buf.readUnsignedByte() * 2); // flowmeter
- break;
case 28:
position.set("weight", buf.readUnsignedShort());
buf.readUnsignedByte();
break;
- case 29:
- buf.readUnsignedByte(); // diagnostics
- break;
- case 30:
- buf.readUnsignedByte(); // vending machine
- buf.readUnsignedInt();
- buf.readUnsignedInt();
- buf.readUnsignedInt();
- break;
- case 31:
- buf.readUnsignedByte(); // antihijack
- break;
- case 32:
- buf.readUnsignedByte(); // audio
- break;
- case 33:
- buf.readUnsignedByte(); // antihijack and authorization
- break;
- case 80:
- case 81:
- case 82:
- case 83:
- buf.readUnsignedInt(); // diagnostic
- break;
case 90:
position.set(Event.KEY_POWER, readSwappedFloat(buf));
break;
- case 99:
- buf.readUnsignedInt(); // tachograph
- break;
- case 101:
- buf.readUnsignedByte(); // speed
- break;
- case 102:
- buf.readUnsignedByte(); // engine rpm
- break;
- case 103:
- buf.readUnsignedByte(); // engine temperature
- break;
- case 104:
- buf.readUnsignedByte(); // pedal position
- break;
- case 105:
- buf.readUnsignedByte(); // engine load
- break;
case 107:
position.set(Event.KEY_FUEL, buf.readUnsignedShort() & 0x3fff);
break;
- case 108:
- buf.readUnsignedInt(); // total distance
- break;
- case 109:
- buf.readUnsignedByte(); // ambient temperature
- break;
- case 122:
- buf.readUnsignedByte(); // power take-off state
- break;
- case 127:
- buf.readUnsignedInt(); // total fuel used
- break;
- case 129:
- buf.readUnsignedInt(); // engine total hours
- break;
- case 130:
- buf.readUnsignedShort(); // distance to service
- break;
- case 131:
- buf.readUnsignedShort(); // axle weight
- buf.readUnsignedShort();
- buf.readUnsignedShort();
- buf.readUnsignedShort();
- break;
- case 136:
- buf.readUnsignedShort(); // fuel rate
- break;
case 150:
position.set("door", buf.readUnsignedByte());
break;
+ default:
+ buf.skipBytes(length);
+ break;
}
}
+
positions.add(position);
}
diff --git a/test/org/traccar/protocol/TytanProtocolDecoderTest.java b/test/org/traccar/protocol/TytanProtocolDecoderTest.java
index 8a2f3c80b..3e846cbe6 100644
--- a/test/org/traccar/protocol/TytanProtocolDecoderTest.java
+++ b/test/org/traccar/protocol/TytanProtocolDecoderTest.java
@@ -12,38 +12,8 @@ public class TytanProtocolDecoderTest extends ProtocolDecoderTest {
TytanProtocolDecoder decoder = new TytanProtocolDecoder(new TytanProtocol());
- verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
- "d5300000689d65556877fbd437a09d8ea89360005a23124e410201213704000907000009ffffffffffffffff0affffffffffffffff18ff63ff7f7fff65ff66ff67ff68ff69ff6b00ff6cffffffff6dff7fffffffff81ffffffff82ffff83ffffffffffffffff88ffff9600"))));
-
- verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
- "d7700000689d205544713bd3378f2c8e9fe181005affdf9041020000000602a1b7563b0700002055447159d3378f2d8e9fe281005affdf9041020000000602a1b7563b0700002055447177d3378f2e8e9fe181005a861a9141020000000602a1b7563b0700002055447195f3378f2d8e9fe281005a1ce78d41020000000602a1b7563b07000020554471b3d3378f2b8e9fe281005a58d88b41020000000602a1b7563b07000020554471d1f3378f2b8e9fe281005a58d88b41020000000602a1b7563b07000020554471efd3378f2a8e9fe381005a94ac8d41020000000602a1b7563b070000205544720df3378f2c8e9fe281005a1ce78d41020000000602a1b7563b070000205544722bd3378f2d8e9fe281005a48638b41020000000602a1b7563b0700002055447249f3378f308e9fe181005adf128c41020000000602a1b7563b070000"))));
-
- verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
- "D5F0FF00001032552F9121D5325FCB8D11AFA0000205396504004C0602FB5B434118001765006603676B68006B80426C02E2C8206D2F9600"))));
-
- verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
- "D56000000AF20E4FA7C77AFF3282C68D2F890800"))));
-
- verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
- "D56000000AF20e552e248007375bee8c02b3c002"))));
-
- verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
- "D5C0FF00013D21552F9148D3325E8F8D11A80800060228816541061245FF674107C0001810130D21552F9148D3325E8F8D11A8080006022881654106121C46694107C0001810130D21552F9182D3325E8F8D11A8080006022881654106121C46694107C0001810140C"))));
-
- verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
- "D56000000AF221552e31f4d3325e908d11a7c8000602d60e68410612cd74694107c00018100f0b"))));
-
- verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
- "D56000000AF232552e0322d332603f8d1199a1100204bda204004c06024dea454118000e6515661b677068626b80486c02e2ae586d319600"))));
-
- verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
- "D56000000AF20e552e259707375bee8c02b3c002"))));
-
- verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
- "D56000000AF20e552e259707375bee8c02b3c002"))));
-
- verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
- "d7680000689d2055447267d3378f308e9fe181005ad1808f41020000000602a1b7563b0700002055447285f3378f308e9fe281005aee878c41020000000602a1b7563b07000020554472a3f3378f2e8e9fe381005ab3968e41020000000602a1b7563b07000020554472c1f3378f308e9fe281005ab3968e41020000000602a1b7563b07000020554472dff3378f2e8e9fe481005adf128c41020000000602a1b7563b07000020554472fdd3378f2e8e9fe481005a84548941020000000602a1b7563b070000205544731bd3378f2e8e9fe481005a49468f41020000000602a1b7563b0700002055447339f3378f2e8e9fe481005a3ad18e41020000000602a1b7563b0700002055447358f3378f308e9fe381005ab3968e41020000000602b909a13b0700002055447376f3378f308e9fe481005ac20b8f41020000000602b909a13b070000"))));
+ /*verify(decoder.decode(null, null, ChannelBuffers.wrappedBuffer(ChannelBufferTools.convertHexString(
+ "d5300000689d65556877fbd437a09d8ea89360005a23124e410201213704000907000009ffffffffffffffff0affffffffffffffff18ff63ff7f7fff65ff66ff67ff68ff69ff6b00ff6cffffffff6dff7fffffffff81ffffffff82ffff83ffffffffffffffff88ffff9600"))));*/
}