diff options
Diffstat (limited to 'src/org/traccar/protocol/NavisFrameDecoder.java')
-rw-r--r-- | src/org/traccar/protocol/NavisFrameDecoder.java | 40 |
1 files changed, 15 insertions, 25 deletions
diff --git a/src/org/traccar/protocol/NavisFrameDecoder.java b/src/org/traccar/protocol/NavisFrameDecoder.java index 0146243cd..8a0bb0b9a 100644 --- a/src/org/traccar/protocol/NavisFrameDecoder.java +++ b/src/org/traccar/protocol/NavisFrameDecoder.java @@ -18,39 +18,31 @@ package org.traccar.protocol; 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; import org.traccar.BasePipelineFactory; public class NavisFrameDecoder extends BaseFrameDecoder { - private int flexDataSize; // bytes - private static final int NTCB_HEADER_LENGTH = 16; private static final int NTCB_LENGTH_OFFSET = 12; private static final int FLEX_HEADER_LENGTH = 2; - private static final int MAX_FRAME_LENGTH = 65551; + + private int flexDataSize; + + public void setFlexDataSize(int flexDataSize) { + this.flexDataSize = flexDataSize; + } @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { - // Check minimum length - if (buf.readableBytes() < 1) { - return null; - } - - if (buf.readableBytes() > MAX_FRAME_LENGTH) { - throw new TooLongFrameException(); - } - if (buf.getByte(buf.readerIndex()) == 0x7F) { - // FLEX keep alive frame - return buf.readRetainedSlice(1); + return buf.readRetainedSlice(1); // keep alive } - if (ctx != null) { + if (ctx != null && flexDataSize == 0) { NavisProtocolDecoder protocolDecoder = BasePipelineFactory.getHandler(ctx.pipeline(), NavisProtocolDecoder.class); if (protocolDecoder != null) { @@ -59,7 +51,7 @@ public class NavisFrameDecoder extends BaseFrameDecoder { } if (flexDataSize > 0) { - // FLEX frame + if (buf.readableBytes() > FLEX_HEADER_LENGTH) { int length = 0; String type = buf.toString(buf.readerIndex(), 2, StandardCharsets.US_ASCII); @@ -97,23 +89,21 @@ public class NavisFrameDecoder extends BaseFrameDecoder { return buf.readRetainedSlice(buf.readableBytes()); } } + } else { - // NTCB frame + if (buf.readableBytes() < NTCB_HEADER_LENGTH) { return null; } - int length = buf.getUnsignedShortLE(buf.readerIndex() + NTCB_LENGTH_OFFSET); - if (buf.readableBytes() >= NTCB_HEADER_LENGTH + length) { - return buf.readRetainedSlice(NTCB_HEADER_LENGTH + length); + int length = NTCB_HEADER_LENGTH + buf.getUnsignedShortLE(buf.readerIndex() + NTCB_LENGTH_OFFSET); + if (buf.readableBytes() >= length) { + return buf.readRetainedSlice(length); } + } return null; } - public void setFlexDataSize(int flexDataSize) { - this.flexDataSize = flexDataSize; - } - } |