diff options
author | Ivan Muratov <binakot@gmail.com> | 2017-07-14 13:29:52 +0300 |
---|---|---|
committer | Ivan Muratov <binakot@gmail.com> | 2017-07-14 13:29:52 +0300 |
commit | c8f648e0261ad46e9301db35f161140aabad880a (patch) | |
tree | 7c83f7f3d5fe02b1dc02a0cb0f3e5e93e85e59f4 /src/org/traccar/protocol/Arnavi4FrameDecoder.java | |
parent | 36eeb5c4fa86f6516585819bb76ca7b73fa4d28a (diff) | |
download | trackermap-server-c8f648e0261ad46e9301db35f161140aabad880a.tar.gz trackermap-server-c8f648e0261ad46e9301db35f161140aabad880a.tar.bz2 trackermap-server-c8f648e0261ad46e9301db35f161140aabad880a.zip |
Upgrade the frame decoder and remove unnecessary check for the last end sign byte in protocol decoder.
Protocol decoder read the buffer until its over, because frame decoder garantee the correct package length.
Added additional tests for frame decoding.
Diffstat (limited to 'src/org/traccar/protocol/Arnavi4FrameDecoder.java')
-rw-r--r-- | src/org/traccar/protocol/Arnavi4FrameDecoder.java | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/org/traccar/protocol/Arnavi4FrameDecoder.java b/src/org/traccar/protocol/Arnavi4FrameDecoder.java index a50ece641..bb130e6bb 100644 --- a/src/org/traccar/protocol/Arnavi4FrameDecoder.java +++ b/src/org/traccar/protocol/Arnavi4FrameDecoder.java @@ -50,10 +50,18 @@ public class Arnavi4FrameDecoder extends FrameDecoder { return buf.readBytes(HEADER_LENGTH); } - int parcelNumber = buf.getByte(1) & 0xFF; - if (buf.getByte(0) == PACKAGE_START_SIGN && buf.getByte(buf.readableBytes() - 1) == PACKAGE_END_SIGN - && parcelNumber >= PACKAGE_MIN_PARCEL_NUMBER && parcelNumber <= PACKAGE_MAX_PARCEL_NUMBER) { - return buf; + int index = buf.getByte(1) & 0xFF; // parcel number + if (buf.getByte(0) == PACKAGE_START_SIGN + && index >= PACKAGE_MIN_PARCEL_NUMBER && index <= PACKAGE_MAX_PARCEL_NUMBER) { + + // package: 1 byte start sign, 1 byte parcel number, packets, 1 byte end sign + int packetStartIndex = 2; + while (packetStartIndex + 8 < buf.readableBytes() && buf.getByte(packetStartIndex) != PACKAGE_END_SIGN) { + // packet: 1 byte type, 2 bytes length, 4 bytes unixtime, length-bytes data, 1 byte crc + packetStartIndex += buf.getUnsignedShort(packetStartIndex + 1) + 8; + } + + return buf.readBytes(packetStartIndex + 1); } return null; |