diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2015-09-21 11:23:14 +1200 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2015-09-21 11:23:14 +1200 |
commit | 992a1530ef1636025932b67aab1ba7cfaabce9e3 (patch) | |
tree | 5b8831f1eb318ddf5927a03fbc9f2e3733ec8c9f | |
parent | 87f6ffa67c2cd4b3e7ce72ed7257ea15526c0052 (diff) | |
download | traccar-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.java | 107 | ||||
-rw-r--r-- | test/org/traccar/protocol/TytanProtocolDecoderTest.java | 34 |
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"))));*/ } |