diff options
author | Anton Tananaev <anton.tananaev@gmail.com> | 2015-10-31 18:49:49 +1300 |
---|---|---|
committer | Anton Tananaev <anton.tananaev@gmail.com> | 2015-10-31 18:49:49 +1300 |
commit | a76e8d71083ef44384b541d33bab92eb096902d2 (patch) | |
tree | 98008bd95fc2394bd9c498acc7d9b4097a8eeae9 | |
parent | 1c488e9f1896d8f4ced142cb303169e45cbd27fb (diff) | |
download | traccar-server-a76e8d71083ef44384b541d33bab92eb096902d2.tar.gz traccar-server-a76e8d71083ef44384b541d33bab92eb096902d2.tar.bz2 traccar-server-a76e8d71083ef44384b541d33bab92eb096902d2.zip |
Support Castel heartbeat messages
-rw-r--r-- | src/org/traccar/protocol/CastelProtocolDecoder.java | 32 | ||||
-rw-r--r-- | test/org/traccar/protocol/CastelProtocolDecoderTest.java | 3 |
2 files changed, 34 insertions, 1 deletions
diff --git a/src/org/traccar/protocol/CastelProtocolDecoder.java b/src/org/traccar/protocol/CastelProtocolDecoder.java index 7f8009389..09d314dae 100644 --- a/src/org/traccar/protocol/CastelProtocolDecoder.java +++ b/src/org/traccar/protocol/CastelProtocolDecoder.java @@ -49,6 +49,8 @@ public class CastelProtocolDecoder extends BaseProtocolDecoder { private static final short MSG_CC_LOGIN = 0x4001; private static final short MSG_CC_LOGIN_RESPONSE = (short) 0x8001; + private static final short MSG_CC_HEARTBEAT = 0x4206; + private static final short MSG_CC_HEARTBEAT_RESPONSE = (short) 0x8206; private Position readPosition(ChannelBuffer buf) { @@ -177,7 +179,35 @@ public class CastelProtocolDecoder extends BaseProtocolDecoder { } else { - if (type == MSG_CC_LOGIN) { + if (type == MSG_CC_HEARTBEAT) { + + sendResponse(channel, remoteAddress, version, id, MSG_CC_HEARTBEAT_RESPONSE, null); + + if (buf.readUnsignedByte() == 0x01) { + int count = buf.readUnsignedByte(); + List<Position> positions = new LinkedList<>(); + + for (int i = 0; i < count; i++) { + Position position = readPosition(buf); + + position.set(Event.KEY_STATUS, buf.readUnsignedInt()); + position.set(Event.KEY_BATTERY, buf.readUnsignedByte()); + position.set(Event.KEY_ODOMETER, buf.readUnsignedInt()); + + buf.readUnsignedByte(); // geo-fencing id + buf.readUnsignedByte(); // geo-fencing flags + buf.readUnsignedByte(); // additional flags + + position.set(Event.KEY_LAC, buf.readUnsignedShort()); + position.set(Event.KEY_CELL, buf.readUnsignedShort()); + + positions.add(position); + } + + return positions; + } + + } else if (type == MSG_CC_LOGIN) { sendResponse(channel, remoteAddress, version, id, MSG_CC_LOGIN_RESPONSE, null); diff --git a/test/org/traccar/protocol/CastelProtocolDecoderTest.java b/test/org/traccar/protocol/CastelProtocolDecoderTest.java index fe1514738..576c2c772 100644 --- a/test/org/traccar/protocol/CastelProtocolDecoderTest.java +++ b/test/org/traccar/protocol/CastelProtocolDecoderTest.java @@ -13,6 +13,9 @@ public class CastelProtocolDecoderTest extends ProtocolDecoderTest { CastelProtocolDecoder decoder = new CastelProtocolDecoder(new CastelProtocol()); + verifyNothing(decoder, binary(ByteOrder.LITTLE_ENDIAN, + "404044000c3631313135303030303935360000000000000000420600011e0a0f0b1312864fcd08c07a13030100640acf000004000a000000000000007ba083a66ad80d0a")); + verifyPosition(decoder, binary(ByteOrder.LITTLE_ENDIAN, "40405c000c363131313530303030393536000000000000000040011c0a0f0e362dca53cd0860831303000000000300000000ff000000000000007ba083a650542d3639305f56312e312e320050542d3639302056312e32008a020d0a")); |