diff options
-rw-r--r-- | src/org/traccar/protocol/TzoneProtocolDecoder.java | 133 | ||||
-rw-r--r-- | test/org/traccar/protocol/TzoneProtocolDecoderTest.java | 12 |
2 files changed, 100 insertions, 45 deletions
diff --git a/src/org/traccar/protocol/TzoneProtocolDecoder.java b/src/org/traccar/protocol/TzoneProtocolDecoder.java index 6f6ff3878..1537c0107 100644 --- a/src/org/traccar/protocol/TzoneProtocolDecoder.java +++ b/src/org/traccar/protocol/TzoneProtocolDecoder.java @@ -57,6 +57,53 @@ public class TzoneProtocolDecoder extends BaseProtocolDecoder { } } + private boolean decodeGps(Position position, ByteBuf buf, int hardware) { + + int blockLength = buf.readUnsignedShort(); + int blockEnd = buf.readerIndex() + blockLength; + + if (blockLength < 22) { + return false; + } + + position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); + + double lat; + double lon; + + if (hardware == 0x10A || hardware == 0x10B) { + lat = buf.readUnsignedInt() / 600000.0; + lon = buf.readUnsignedInt() / 600000.0; + } else { + lat = buf.readUnsignedInt() / 100000.0 / 60.0; + lon = buf.readUnsignedInt() / 100000.0 / 60.0; + } + + position.setFixTime(new DateBuilder() + .setDate(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) + .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()).getDate()); + + position.setSpeed(buf.readUnsignedShort() * 0.01); + + position.set(Position.KEY_ODOMETER, buf.readUnsignedMedium()); + + int flags = buf.readUnsignedShort(); + position.setCourse(BitUtil.to(flags, 9)); + if (!BitUtil.check(flags, 10)) { + lat = -lat; + } + position.setLatitude(lat); + if (BitUtil.check(flags, 9)) { + lon = -lon; + } + position.setLongitude(lon); + position.setValid(BitUtil.check(flags, 11)); + + buf.readerIndex(blockEnd); + + return true; + } + private void decodeCards(Position position, ByteBuf buf) { int index = 1; @@ -108,6 +155,38 @@ public class TzoneProtocolDecoder extends BaseProtocolDecoder { } + private void decodeTags(Position position, ByteBuf buf) { + + int blockLength = buf.readUnsignedShort(); + int blockEnd = buf.readerIndex() + blockLength; + + if (blockLength > 0) { + + buf.readUnsignedByte(); // tag type + + int count = buf.readUnsignedByte(); + int tagLength = buf.readUnsignedByte(); + + for (int i = 1; i <= count; i++) { + int tagEnd = buf.readerIndex() + tagLength; + + buf.readUnsignedByte(); // status + buf.readUnsignedShortLE(); // battery voltage + + position.set(Position.PREFIX_TEMP + i, (buf.readShortLE() & 0x3fff) * 0.1); + + buf.readUnsignedByte(); // humidity + buf.readUnsignedByte(); // rssi + + buf.readerIndex(tagEnd); + } + + } + + buf.readerIndex(blockEnd); + + } + @Override protected Object decode( Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { @@ -140,54 +219,18 @@ public class TzoneProtocolDecoder extends BaseProtocolDecoder { // GPS info - int blockLength = buf.readUnsignedShort(); - int blockEnd = buf.readerIndex() + blockLength; - - if (blockLength < 22) { - return null; - } - - position.set(Position.KEY_SATELLITES, buf.readUnsignedByte()); + if (hardware == 0x406 || !decodeGps(position, buf, hardware)) { - double lat; - double lon; + getLastLocation(position, position.getDeviceTime()); - if (hardware == 0x10A || hardware == 0x10B) { - lat = buf.readUnsignedInt() / 600000.0; - lon = buf.readUnsignedInt() / 600000.0; - } else { - lat = buf.readUnsignedInt() / 100000.0 / 60.0; - lon = buf.readUnsignedInt() / 100000.0 / 60.0; } - position.setFixTime(new DateBuilder() - .setDate(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()) - .setTime(buf.readUnsignedByte(), buf.readUnsignedByte(), buf.readUnsignedByte()).getDate()); - - position.setSpeed(buf.readUnsignedShort() * 0.01); - - position.set(Position.KEY_ODOMETER, buf.readUnsignedMedium()); - - int flags = buf.readUnsignedShort(); - position.setCourse(BitUtil.to(flags, 9)); - if (!BitUtil.check(flags, 10)) { - lat = -lat; - } - position.setLatitude(lat); - if (BitUtil.check(flags, 9)) { - lon = -lon; - } - position.setLongitude(lon); - position.setValid(BitUtil.check(flags, 11)); - - buf.readerIndex(blockEnd); - // LBS info - blockLength = buf.readUnsignedShort(); - blockEnd = buf.readerIndex() + blockLength; + int blockLength = buf.readUnsignedShort(); + int blockEnd = buf.readerIndex() + blockLength; - if (blockLength > 0 && (hardware == 0x10A || hardware == 0x10B)) { + if (blockLength > 0 && (hardware == 0x10A || hardware == 0x10B || hardware == 0x406)) { position.setNetwork(new Network( CellTower.fromLacCid(buf.readUnsignedShort(), buf.readUnsignedShort()))); } @@ -226,7 +269,7 @@ public class TzoneProtocolDecoder extends BaseProtocolDecoder { buf.readerIndex(blockEnd); - if (hardware == 0x10A || hardware == 0x10B) { + if (hardware == 0x10B) { decodeCards(position, buf); @@ -237,6 +280,12 @@ public class TzoneProtocolDecoder extends BaseProtocolDecoder { } + if (hardware == 0x406) { + + decodeTags(position, buf); + + } + return position; } diff --git a/test/org/traccar/protocol/TzoneProtocolDecoderTest.java b/test/org/traccar/protocol/TzoneProtocolDecoderTest.java index c309abce1..fd1e29312 100644 --- a/test/org/traccar/protocol/TzoneProtocolDecoderTest.java +++ b/test/org/traccar/protocol/TzoneProtocolDecoderTest.java @@ -10,6 +10,12 @@ public class TzoneProtocolDecoderTest extends ProtocolTest { TzoneProtocolDecoder decoder = new TzoneProtocolDecoder(new TzoneProtocol()); + verifyAttributes(decoder, binary( + "545a005b24240406010800000866050033819630120911071824000472bd8e5b0008aac01b07019b04bb002f00040b06161154000e100132ff2006161152000e080096ff4606161151000e1e0101ff1406161156000db6405bff490024469e0d0a")); + + verifyAttributes(decoder, binary( + "545a006624240406010800000866050033819630120911070e1d000472bd8e5b0008aac01b17019b04bc003a00050b06161151000e1e00ffff1406161152000e08008aff4706161154000e100134ff1f06161156000db0406cff4906161155000df44011ff4e0023811a0d0a")); + verifyPosition(decoder, binary( "545a005624240111010e0000086169303626931411091b151d2600160801de26ec002f633411091b151d2500000000160c0000040d2a34df000eaa4000001b37016000000000319c0000000000000000000000000000003a84240d0a")); @@ -33,13 +39,13 @@ public class TzoneProtocolDecoderTest extends ProtocolTest { "545A00912424010B021E000008661040203754350F061807083800160400CE5ADC041447620F0618070838000A0000060C7C0004253378370010AAC000000C37018504E500000000800000000000000000390B0A0014061113000000051200140610600014061220001000133800140610070010001473001000151100101500640010000920001000148400000000000000F2EF570D0A"), position("2015-06-24 07:08:56.000", true, 22.53946, 114.06310)); - verifyNull(decoder, binary( + verifyAttributes(decoder, binary( "545A009E2424010A0205000008637710225481290F010F081E33000000000010A0C000310E35000005840000000000000000000000000066140A00140612200010001511001406101000140612490014061308001015006400051400170014061012000000050200140612470000000504001406100700140612510014061260001015012000000005080014061252001406130900101501410000000506000853A40D0A")); - verifyNull(decoder, binary( + verifyAttributes(decoder, binary( "545A00992424010A0205000008637710225481290F010F082634000000000010A0C000311035000005870000000000000000000000000061130A000000050800101500640014061251001406130800051400170010150141001406101000140612200014061309000000050200140610070014061260001406124900140612470014061012001406125200100015110010150120000000050400183E8A0D0A")); - verifyNull(decoder, binary( + verifyAttributes(decoder, binary( "545A00942424010A0205000008637710225481290F010F091C1F000000000010A1C000310F3500000586000000000000000000000000005C120A001406101000140612490014061012001406125200000005040000000502001015012000000005080010001511001406122000140612600014061247001406130900140610070010150141000514001700140612510010150064007A907C0D0A")); } |