diff options
author | Evgeny S Maksimov <me@vragam.net> | 2019-01-30 01:28:35 +0300 |
---|---|---|
committer | Evgeny S Maksimov <me@vragam.net> | 2019-01-30 01:28:35 +0300 |
commit | a652d928263b473648f43d4f64c06549792eb653 (patch) | |
tree | 8436436c954c841c0dfa30898db7ea0dd43ab957 /src/org/traccar | |
parent | ac13cf5611d40358eed31983399324fd4b68a8db (diff) | |
download | traccar-server-a652d928263b473648f43d4f64c06549792eb653.tar.gz traccar-server-a652d928263b473648f43d4f64c06549792eb653.tar.bz2 traccar-server-a652d928263b473648f43d4f64c06549792eb653.zip |
Frame decoder refactoring
Diffstat (limited to 'src/org/traccar')
-rw-r--r-- | src/org/traccar/protocol/NavisFrameDecoder.java | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/src/org/traccar/protocol/NavisFrameDecoder.java b/src/org/traccar/protocol/NavisFrameDecoder.java index 1d77c0d65..ff367ba77 100644 --- a/src/org/traccar/protocol/NavisFrameDecoder.java +++ b/src/org/traccar/protocol/NavisFrameDecoder.java @@ -19,6 +19,7 @@ import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.TooLongFrameException; +import java.nio.charset.StandardCharsets; import org.traccar.BaseFrameDecoder; public class NavisFrameDecoder extends BaseFrameDecoder { @@ -46,31 +47,31 @@ public class NavisFrameDecoder extends BaseFrameDecoder { if (buf.getByte(buf.readerIndex()) == 0x7F) { // FLEX keep alive frame return buf.readRetainedSlice(1); - } else if (buf.getByte(buf.readerIndex()) == 0x7E /* "~" */) { + } + + if (protocolDecoder.getFlexDataSize() > 0) { // FLEX frame - if (protocolDecoder.getFlexDataSize() == 0) { - return null; - } if (buf.readableBytes() > MAX_FRAME_LENGTH) { throw new TooLongFrameException(); } if (buf.readableBytes() > FLEX_HEADER_LENGTH) { int length = 0; - switch (buf.getByte(buf.readerIndex() + 1)) { + String type = buf.toString(buf.readerIndex(), 2, StandardCharsets.US_ASCII); + switch (type) { // FLEX 1.0 - case 0x41: // "A" + case "~A": length = protocolDecoder.getFlexDataSize() - * buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGTH) + 2; + * buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGTH) + 1 + 1; break; - case 0x54: // "T" - length = protocolDecoder.getFlexDataSize() + 5; + case "~T": + length = protocolDecoder.getFlexDataSize() + 4 + 1; break; - case 0x43: // "C" + case "~C": length = protocolDecoder.getFlexDataSize() + 1; break; // FLEX 2.0 (Extra packages) - case 0x45: // "E" + case "~E": length++; for (int i = 0; i < buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGTH); i++) { if (buf.readableBytes() > FLEX_HEADER_LENGTH + length + 1) { @@ -81,11 +82,11 @@ public class NavisFrameDecoder extends BaseFrameDecoder { } length++; break; - case 0x58: // "X" - length = buf.getUnsignedShortLE(buf.readerIndex() + FLEX_HEADER_LENGTH) + 7; + case "~X": + length = buf.getUnsignedShortLE(buf.readerIndex() + FLEX_HEADER_LENGTH) + 4 + 1; break; default: - break; + return null; } if (buf.readableBytes() >= FLEX_HEADER_LENGTH + length) { |