From fc707a69c3c95223ecb8e263d7de32a72ec84af3 Mon Sep 17 00:00:00 2001 From: Evgeny S Maksimov Date: Thu, 17 Jan 2019 19:05:23 +0300 Subject: Implemented FLEX 1.0 extension support for Navis (NTCB) protocol --- src/org/traccar/protocol/NavisFrameDecoder.java | 80 +++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/org/traccar/protocol/NavisFrameDecoder.java (limited to 'src/org/traccar/protocol/NavisFrameDecoder.java') diff --git a/src/org/traccar/protocol/NavisFrameDecoder.java b/src/org/traccar/protocol/NavisFrameDecoder.java new file mode 100644 index 000000000..2480629ac --- /dev/null +++ b/src/org/traccar/protocol/NavisFrameDecoder.java @@ -0,0 +1,80 @@ +/* + * Copyright 2019 Anton Tananaev (anton@traccar.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +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 org.traccar.BaseFrameDecoder; + +public class NavisFrameDecoder extends BaseFrameDecoder { + + private static final int NTCB_HEADER_LENGHT = 16; + private static final int NTCB_LENGHT_OFFSET = 12; + private static final int MAX_FRAME_LENGHT = 65551; + + private static byte src8Checksum(ByteBuf buf, int length) { + byte sum = (byte) 0xFF; + for (int i = 0; i < length; i++) { + sum ^= buf.getUnsignedByte(i); + for (int j = 0; j < 8; j++) { + sum = (sum & 0x80) != 0 ? (byte) ((sum << 1) ^ 0x31) : (byte) (sum << 1); + } + } + return sum; + } + + @Override + protected Object decode( + ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { + + // Check minimum length + if (buf.readableBytes() < 1) { + return null; + } + + if (buf.getByte(buf.readerIndex()) == 0x7F) { + // FLEX keep alive frame + return buf.readRetainedSlice(1); + } else if (buf.getByte(buf.readerIndex()) == 0x7E /* "~" */) { + // FLEX frame + if (buf.readableBytes() > MAX_FRAME_LENGHT) { + throw new TooLongFrameException(); + } + + if (src8Checksum(buf, buf.readableBytes() - 1) == buf.getByte(buf.readableBytes() - 1)) { + return buf.readRetainedSlice(buf.readableBytes()); + } + } else { + // NTCB frame + if (buf.readableBytes() < NTCB_HEADER_LENGHT) { + return null; + } + + int length = buf.getUnsignedShortLE(buf.readerIndex() + NTCB_LENGHT_OFFSET); + if (buf.readableBytes() >= NTCB_HEADER_LENGHT + length) { + if (buf.readableBytes() > MAX_FRAME_LENGHT) { + throw new TooLongFrameException(); + } + return buf.readRetainedSlice(NTCB_HEADER_LENGHT + length); + } + } + + return null; + } + +} -- cgit v1.2.3 From cbe838ad644ce5e787f080e292bc332e50efa4a0 Mon Sep 17 00:00:00 2001 From: Evgeny S Maksimov Date: Fri, 18 Jan 2019 21:48:41 +0300 Subject: Added strict implementation for frame decoder --- src/org/traccar/protocol/NavisFrameDecoder.java | 55 +++++++++++++++++----- src/org/traccar/protocol/NavisProtocol.java | 6 +-- src/org/traccar/protocol/NavisProtocolDecoder.java | 48 ++++++++++++++----- 3 files changed, 82 insertions(+), 27 deletions(-) (limited to 'src/org/traccar/protocol/NavisFrameDecoder.java') diff --git a/src/org/traccar/protocol/NavisFrameDecoder.java b/src/org/traccar/protocol/NavisFrameDecoder.java index 2480629ac..aa057b51f 100644 --- a/src/org/traccar/protocol/NavisFrameDecoder.java +++ b/src/org/traccar/protocol/NavisFrameDecoder.java @@ -25,17 +25,13 @@ public class NavisFrameDecoder extends BaseFrameDecoder { private static final int NTCB_HEADER_LENGHT = 16; private static final int NTCB_LENGHT_OFFSET = 12; + private static final int FLEX_HEADER_LENGHT = 2; private static final int MAX_FRAME_LENGHT = 65551; - private static byte src8Checksum(ByteBuf buf, int length) { - byte sum = (byte) 0xFF; - for (int i = 0; i < length; i++) { - sum ^= buf.getUnsignedByte(i); - for (int j = 0; j < 8; j++) { - sum = (sum & 0x80) != 0 ? (byte) ((sum << 1) ^ 0x31) : (byte) (sum << 1); - } - } - return sum; + private final NavisProtocolDecoder protocolDecoder; + + public NavisFrameDecoder(NavisProtocolDecoder protocolDecoder) { + this.protocolDecoder = protocolDecoder; } @Override @@ -52,12 +48,49 @@ public class NavisFrameDecoder extends BaseFrameDecoder { return buf.readRetainedSlice(1); } else if (buf.getByte(buf.readerIndex()) == 0x7E /* "~" */) { // FLEX frame + if (protocolDecoder.getFLEXDataSize() == 0) { + return null; + } if (buf.readableBytes() > MAX_FRAME_LENGHT) { throw new TooLongFrameException(); } - if (src8Checksum(buf, buf.readableBytes() - 1) == buf.getByte(buf.readableBytes() - 1)) { - return buf.readRetainedSlice(buf.readableBytes()); + if (buf.readableBytes() > FLEX_HEADER_LENGHT) { + int length = 0; + switch (buf.getByte(buf.readerIndex() + 1)) { + // FLEX 1.0 + case 0x41: // "A" + length = protocolDecoder.getFLEXDataSize() + * buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGHT) + 2; + break; + case 0x54: // "T" + length = protocolDecoder.getFLEXDataSize() + 5; + break; + case 0x43: // "C" + length = protocolDecoder.getFLEXDataSize() + 1; + break; + // FLEX 2.0 (Extra packages) + case 0x45: // "E" + length++; + for (int i = 0; i < buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGHT); i++) { + if (buf.readableBytes() > FLEX_HEADER_LENGHT + length + 1) { + length += buf.getUnsignedShort(length + FLEX_HEADER_LENGHT) + 2; + } else { + return null; + } + } + length++; + break; + case 0x58: // "X" + length = buf.getUnsignedShortLE(buf.readerIndex() + FLEX_HEADER_LENGHT) + 7; + break; + default: + break; + } + + if (buf.readableBytes() >= FLEX_HEADER_LENGHT + length) { + return buf.readRetainedSlice(buf.readableBytes()); + } } } else { // NTCB frame diff --git a/src/org/traccar/protocol/NavisProtocol.java b/src/org/traccar/protocol/NavisProtocol.java index 4250ba4dc..628b78fd4 100644 --- a/src/org/traccar/protocol/NavisProtocol.java +++ b/src/org/traccar/protocol/NavisProtocol.java @@ -25,10 +25,10 @@ public class NavisProtocol extends BaseProtocol { addServer(new TrackerServer(false, getName()) { @Override protected void addProtocolHandlers(PipelineBuilder pipeline) { - pipeline.addLast(new NavisFrameDecoder()); - pipeline.addLast(new NavisProtocolDecoder(NavisProtocol.this)); + NavisProtocolDecoder protocolDecoder = new NavisProtocolDecoder(NavisProtocol.this); + pipeline.addLast(new NavisFrameDecoder(protocolDecoder)); + pipeline.addLast(protocolDecoder); } }); } - } diff --git a/src/org/traccar/protocol/NavisProtocolDecoder.java b/src/org/traccar/protocol/NavisProtocolDecoder.java index 3c5abc2a4..71dd1bcc7 100644 --- a/src/org/traccar/protocol/NavisProtocolDecoder.java +++ b/src/org/traccar/protocol/NavisProtocolDecoder.java @@ -35,11 +35,15 @@ import java.util.LinkedList; import java.util.List; import java.util.Date; +// DEBUG: +import org.traccar.helper.DataConverter; + public class NavisProtocolDecoder extends BaseProtocolDecoder { private String prefix; private long deviceUniqueId, serverId; - private int flexDataSize; // bits + private int flexDataSize; // bytes + private int flexBitfieldDataSize; // bits private final byte[] flexBitfield; private byte flexProtocolVersion, flexStructVersion; private static final Logger LOGGER = LoggerFactory.getLogger(NavisProtocolDecoder.class); @@ -311,14 +315,15 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { } private ParseResult parseFLEXPosition(DeviceSession deviceSession, ByteBuf buf) { - LOGGER.info("DEBUG: id={} parseFLEXPosition_START", deviceSession.getDeviceId()); + LOGGER.info("DEBUG: id={} parseFLEXPosition_START, flexDataSize={}, flexBitfield[]={}", + deviceSession.getDeviceId(), flexBitfieldDataSize, DataConverter.printHex(flexBitfield)); Position position = new Position(getProtocolName()); position.setDeviceId(deviceSession.getDeviceId()); long index = 0; - for (int i = 0; i < flexDataSize; i++) { + for (int i = 0; i < flexBitfieldDataSize; i++) { if ((flexBitfield[(int) (i / 8)] & (0x80 >> i % 8)) == 0) { // Skip FLEX data field continue; @@ -505,7 +510,7 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { buf.skipBytes(2); break; case 68: // CAN Speed - position.set("can-speed", buf.readByte()); + position.set("can-speed", buf.readUnsignedByte()); break; default: break; @@ -535,7 +540,7 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { private Object processFLEXArray(DeviceSession deviceSession, Channel channel, ByteBuf buf) { List positions = new LinkedList<>(); int count = buf.readUnsignedByte(); - LOGGER.info("DEBUG: id={} processFLEXArray_COUNT={}", deviceSession.getDeviceId(), count); + for (int i = 0; i < count; i++) { Position position = parseFLEXPosition(deviceSession, buf).getPosition(); if (position.getFixTime() != null) { @@ -556,12 +561,18 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { } private Object processFLEXNegotiation(Channel channel, ByteBuf buf) { - if (buf.readByte() != (byte) 0xB0) { + int[] fieldsSizes = {4, 2, 4, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 2, 4, 4, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 4, 2, 1, 4, 2, 2, 2, 2, 2, 1, 1, + 1, 2, 4, 2, 1}; + + if ((byte) buf.readUnsignedByte() != (byte) 0xB0) { return null; } - flexProtocolVersion = buf.readByte(); - flexStructVersion = buf.readByte(); + flexProtocolVersion = (byte) buf.readUnsignedByte(); + flexStructVersion = (byte) buf.readUnsignedByte(); if (flexProtocolVersion != (byte) 0x0A && flexProtocolVersion != (byte) 0x14) { return null; } @@ -569,11 +580,18 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { return null; } - flexDataSize = buf.readByte(); - if (flexDataSize > 122) { + flexBitfieldDataSize = buf.readUnsignedByte(); + if (flexBitfieldDataSize > 122) { return null; } - buf.readBytes(flexBitfield, 0, (int) Math.ceil(flexDataSize / 8)); + buf.readBytes(flexBitfield, 0, (int) Math.ceil((double) flexBitfieldDataSize / 8)); + + flexDataSize = 0; + for (int i = 0; i < flexBitfieldDataSize; i++) { + if ((flexBitfield[(int) (i / 8)] & (0x80 >> i % 8)) != 0) { + flexDataSize += fieldsSizes[i]; + } + } ByteBuf response = Unpooled.buffer(9); response.writeCharSequence("* Date: Sat, 19 Jan 2019 21:03:27 +0300 Subject: Fixed typos --- src/org/traccar/protocol/NavisFrameDecoder.java | 34 ++++++++++++------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'src/org/traccar/protocol/NavisFrameDecoder.java') diff --git a/src/org/traccar/protocol/NavisFrameDecoder.java b/src/org/traccar/protocol/NavisFrameDecoder.java index aa057b51f..b82a3a5fb 100644 --- a/src/org/traccar/protocol/NavisFrameDecoder.java +++ b/src/org/traccar/protocol/NavisFrameDecoder.java @@ -23,10 +23,10 @@ import org.traccar.BaseFrameDecoder; public class NavisFrameDecoder extends BaseFrameDecoder { - private static final int NTCB_HEADER_LENGHT = 16; - private static final int NTCB_LENGHT_OFFSET = 12; - private static final int FLEX_HEADER_LENGHT = 2; - private static final int MAX_FRAME_LENGHT = 65551; + 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 final NavisProtocolDecoder protocolDecoder; @@ -51,17 +51,17 @@ public class NavisFrameDecoder extends BaseFrameDecoder { if (protocolDecoder.getFLEXDataSize() == 0) { return null; } - if (buf.readableBytes() > MAX_FRAME_LENGHT) { + if (buf.readableBytes() > MAX_FRAME_LENGTH) { throw new TooLongFrameException(); } - if (buf.readableBytes() > FLEX_HEADER_LENGHT) { + if (buf.readableBytes() > FLEX_HEADER_LENGTH) { int length = 0; switch (buf.getByte(buf.readerIndex() + 1)) { // FLEX 1.0 case 0x41: // "A" length = protocolDecoder.getFLEXDataSize() - * buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGHT) + 2; + * buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGTH) + 2; break; case 0x54: // "T" length = protocolDecoder.getFLEXDataSize() + 5; @@ -72,9 +72,9 @@ public class NavisFrameDecoder extends BaseFrameDecoder { // FLEX 2.0 (Extra packages) case 0x45: // "E" length++; - for (int i = 0; i < buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGHT); i++) { - if (buf.readableBytes() > FLEX_HEADER_LENGHT + length + 1) { - length += buf.getUnsignedShort(length + FLEX_HEADER_LENGHT) + 2; + for (int i = 0; i < buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGTH); i++) { + if (buf.readableBytes() > FLEX_HEADER_LENGTH + length + 1) { + length += buf.getUnsignedShort(length + FLEX_HEADER_LENGTH) + 2; } else { return null; } @@ -82,28 +82,28 @@ public class NavisFrameDecoder extends BaseFrameDecoder { length++; break; case 0x58: // "X" - length = buf.getUnsignedShortLE(buf.readerIndex() + FLEX_HEADER_LENGHT) + 7; + length = buf.getUnsignedShortLE(buf.readerIndex() + FLEX_HEADER_LENGTH) + 7; break; default: break; } - if (buf.readableBytes() >= FLEX_HEADER_LENGHT + length) { + if (buf.readableBytes() >= FLEX_HEADER_LENGTH + length) { return buf.readRetainedSlice(buf.readableBytes()); } } } else { // NTCB frame - if (buf.readableBytes() < NTCB_HEADER_LENGHT) { + if (buf.readableBytes() < NTCB_HEADER_LENGTH) { return null; } - int length = buf.getUnsignedShortLE(buf.readerIndex() + NTCB_LENGHT_OFFSET); - if (buf.readableBytes() >= NTCB_HEADER_LENGHT + length) { - if (buf.readableBytes() > MAX_FRAME_LENGHT) { + int length = buf.getUnsignedShortLE(buf.readerIndex() + NTCB_LENGTH_OFFSET); + if (buf.readableBytes() >= NTCB_HEADER_LENGTH + length) { + if (buf.readableBytes() > MAX_FRAME_LENGTH) { throw new TooLongFrameException(); } - return buf.readRetainedSlice(NTCB_HEADER_LENGHT + length); + return buf.readRetainedSlice(NTCB_HEADER_LENGTH + length); } } -- cgit v1.2.3 From b4a655445b6ad7a0ef96193a616f8bdec182ca54 Mon Sep 17 00:00:00 2001 From: Evgeny S Maksimov Date: Mon, 21 Jan 2019 23:17:04 +0300 Subject: Naming convention fix --- src/org/traccar/protocol/NavisFrameDecoder.java | 8 +-- src/org/traccar/protocol/NavisProtocolDecoder.java | 64 +++++++++++----------- 2 files changed, 36 insertions(+), 36 deletions(-) (limited to 'src/org/traccar/protocol/NavisFrameDecoder.java') diff --git a/src/org/traccar/protocol/NavisFrameDecoder.java b/src/org/traccar/protocol/NavisFrameDecoder.java index b82a3a5fb..1d77c0d65 100644 --- a/src/org/traccar/protocol/NavisFrameDecoder.java +++ b/src/org/traccar/protocol/NavisFrameDecoder.java @@ -48,7 +48,7 @@ public class NavisFrameDecoder extends BaseFrameDecoder { return buf.readRetainedSlice(1); } else if (buf.getByte(buf.readerIndex()) == 0x7E /* "~" */) { // FLEX frame - if (protocolDecoder.getFLEXDataSize() == 0) { + if (protocolDecoder.getFlexDataSize() == 0) { return null; } if (buf.readableBytes() > MAX_FRAME_LENGTH) { @@ -60,14 +60,14 @@ public class NavisFrameDecoder extends BaseFrameDecoder { switch (buf.getByte(buf.readerIndex() + 1)) { // FLEX 1.0 case 0x41: // "A" - length = protocolDecoder.getFLEXDataSize() + length = protocolDecoder.getFlexDataSize() * buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGTH) + 2; break; case 0x54: // "T" - length = protocolDecoder.getFLEXDataSize() + 5; + length = protocolDecoder.getFlexDataSize() + 5; break; case 0x43: // "C" - length = protocolDecoder.getFLEXDataSize() + 1; + length = protocolDecoder.getFlexDataSize() + 1; break; // FLEX 2.0 (Extra packages) case 0x45: // "E" diff --git a/src/org/traccar/protocol/NavisProtocolDecoder.java b/src/org/traccar/protocol/NavisProtocolDecoder.java index 93e751012..ed2562125 100644 --- a/src/org/traccar/protocol/NavisProtocolDecoder.java +++ b/src/org/traccar/protocol/NavisProtocolDecoder.java @@ -91,7 +91,7 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { } } - private ParseResult parseNTCBPosition(DeviceSession deviceSession, ByteBuf buf) { + private ParseResult parseNtcbPosition(DeviceSession deviceSession, ByteBuf buf) { Position position = new Position(getProtocolName()); position.setDeviceId(deviceSession.getDeviceId()); @@ -278,13 +278,13 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { return new ParseResult(index, position); } - private Object processNTCBSingle(DeviceSession deviceSession, Channel channel, ByteBuf buf) { - ParseResult result = parseNTCBPosition(deviceSession, buf); + private Object processNtcbSingle(DeviceSession deviceSession, Channel channel, ByteBuf buf) { + ParseResult result = parseNtcbPosition(deviceSession, buf); ByteBuf response = Unpooled.buffer(7); response.writeCharSequence("* positions = new LinkedList<>(); int count = buf.readUnsignedByte(); for (int i = 0; i < count; i++) { - Position position = parseNTCBPosition(deviceSession, buf).getPosition(); + Position position = parseNtcbPosition(deviceSession, buf).getPosition(); if (position.getFixTime() != null) { positions.add(position); } @@ -307,7 +307,7 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { ByteBuf response = Unpooled.buffer(7); response.writeCharSequence("* positions = new LinkedList<>(); int count = buf.readUnsignedByte(); @@ -563,7 +563,7 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { ByteBuf response = Unpooled.buffer(6); response.writeCharSequence(flexHeader, StandardCharsets.US_ASCII); response.writeByte(count); - sendFLEXReply(channel, response); + sendFlexReply(channel, response); if (positions.isEmpty()) { return null; @@ -572,7 +572,7 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { return positions; } - private Object processFLEXNegotiation(Channel channel, ByteBuf buf) { + private Object processFlexNegotiation(Channel channel, ByteBuf buf) { if ((byte) buf.readUnsignedByte() != (byte) 0xB0) { return null; } @@ -604,7 +604,7 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { response.writeByte(0xB0); response.writeByte(flexProtocolVersion); response.writeByte(flexStructVersion); - sendNTCBReply(channel, response); + sendNtcbReply(channel, response); return null; } @@ -612,7 +612,7 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { private Object processHandshake(Channel channel, SocketAddress remoteAddress, ByteBuf buf) { buf.skipBytes(1); // Colon symbol if (getDeviceSession(channel, remoteAddress, buf.toString(StandardCharsets.US_ASCII)) != null) { - sendNTCBReply(channel, Unpooled.copiedBuffer("*A" - return processNTCBArray(deviceSession, channel, buf); + return processNtcbArray(deviceSession, channel, buf); case 0x543E2A: // "*>T" - return processNTCBSingle(deviceSession, channel, buf); + return processNtcbSingle(deviceSession, channel, buf); case 0x463E2A: // "*>F" (*>FLEX) buf.skipBytes(3); - return processFLEXNegotiation(channel, buf); + return processFlexNegotiation(channel, buf); default: break; } @@ -735,7 +735,7 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { return null; } - public int getFLEXDataSize() { + public int getFlexDataSize() { return flexDataSize; } } -- cgit v1.2.3 From a652d928263b473648f43d4f64c06549792eb653 Mon Sep 17 00:00:00 2001 From: Evgeny S Maksimov Date: Wed, 30 Jan 2019 01:28:35 +0300 Subject: Frame decoder refactoring --- src/org/traccar/protocol/NavisFrameDecoder.java | 29 +++++++++++++------------ 1 file changed, 15 insertions(+), 14 deletions(-) (limited to 'src/org/traccar/protocol/NavisFrameDecoder.java') 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) { -- cgit v1.2.3 From da9e3571f686816c07159fb834ec8b9e6eaa3cda Mon Sep 17 00:00:00 2001 From: Evgeny S Maksimov Date: Thu, 31 Jan 2019 12:57:36 +0300 Subject: Review fixes --- src/org/traccar/protocol/NavisFrameDecoder.java | 11 +-- src/org/traccar/protocol/NavisProtocolDecoder.java | 100 +++++++-------------- .../traccar/protocol/NavisFrameDecoderTest.java | 21 +++-- .../traccar/protocol/NavisProtocolDecoderTest.java | 34 +++---- 4 files changed, 68 insertions(+), 98 deletions(-) (limited to 'src/org/traccar/protocol/NavisFrameDecoder.java') diff --git a/src/org/traccar/protocol/NavisFrameDecoder.java b/src/org/traccar/protocol/NavisFrameDecoder.java index ff367ba77..9a3b3d45c 100644 --- a/src/org/traccar/protocol/NavisFrameDecoder.java +++ b/src/org/traccar/protocol/NavisFrameDecoder.java @@ -44,6 +44,10 @@ public class NavisFrameDecoder extends BaseFrameDecoder { 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); @@ -51,10 +55,6 @@ public class NavisFrameDecoder extends BaseFrameDecoder { if (protocolDecoder.getFlexDataSize() > 0) { // FLEX frame - if (buf.readableBytes() > MAX_FRAME_LENGTH) { - throw new TooLongFrameException(); - } - if (buf.readableBytes() > FLEX_HEADER_LENGTH) { int length = 0; String type = buf.toString(buf.readerIndex(), 2, StandardCharsets.US_ASCII); @@ -101,9 +101,6 @@ public class NavisFrameDecoder extends BaseFrameDecoder { int length = buf.getUnsignedShortLE(buf.readerIndex() + NTCB_LENGTH_OFFSET); if (buf.readableBytes() >= NTCB_HEADER_LENGTH + length) { - if (buf.readableBytes() > MAX_FRAME_LENGTH) { - throw new TooLongFrameException(); - } return buf.readRetainedSlice(NTCB_HEADER_LENGTH + length); } } diff --git a/src/org/traccar/protocol/NavisProtocolDecoder.java b/src/org/traccar/protocol/NavisProtocolDecoder.java index 912e47369..d3b3f9932 100644 --- a/src/org/traccar/protocol/NavisProtocolDecoder.java +++ b/src/org/traccar/protocol/NavisProtocolDecoder.java @@ -18,8 +18,6 @@ package org.traccar.protocol; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.traccar.BaseProtocolDecoder; import org.traccar.DeviceSession; import org.traccar.NetworkMessage; @@ -44,7 +42,6 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { private int flexDataSize; // bytes private int flexBitfieldDataSize; // bits private final byte[] flexBitfield; - private static final Logger LOGGER = LoggerFactory.getLogger(NavisProtocolDecoder.class); private static final int[] FLEX_FIELDS_SIZES = {4, 2, 4, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 2, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 1, 4, 2, 2, 2, 2, 2, 1, 1, 1, 2, 4, 2, 1, /* FLEX 2.0 */ 8, 2, 1, 16, 4, 2, 4, 37, 1, @@ -323,12 +320,6 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { return BitUtil.check(flexBitfield[byteIndex], 7 - bitIndex); } - private void skipFlexField(int index, ByteBuf buf) { - if (index < FLEX_FIELDS_SIZES.length) { - buf.skipBytes(FLEX_FIELDS_SIZES[index]); - } - } - private ParseResult parseFlexPosition(DeviceSession deviceSession, ByteBuf buf) { Position position = new Position(getProtocolName()); @@ -342,7 +333,6 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { for (int i = 0; i < flexBitfieldDataSize; i++) { if (!checkFlexBitfield(i)) { - // skip FLEX field continue; } @@ -458,29 +448,14 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { case 51: position.set(Position.PREFIX_TEMP + (i - 43), buf.readByte()); break; - case 68: // CAN Speed + case 68: position.set("can-speed", buf.readUnsignedByte()); break; // FLEX 2.0 case 69: int satVisible = 0; for (int k = 0; k < 8; k++) { - switch (k) { - case 0: - int satVisibleGLONASS = buf.readUnsignedByte(); - position.set("sat-visible-glonass", satVisibleGLONASS); - satVisible += satVisibleGLONASS; - break; - case 1: - int satVisibleGPS = buf.readUnsignedByte(); - position.set("sat-visible-gps", satVisibleGPS); - satVisible += satVisibleGPS; - break; - default: - // Don't detalize Galileo, Compass, Beidou, DORIS, IRNSS, QZSS - satVisible += buf.readUnsignedByte(); - break; - } + satVisible += buf.readUnsignedByte(); } position.set(Position.KEY_SATELLITES_VISIBLE, satVisible); break; @@ -489,7 +464,9 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { position.set(Position.KEY_PDOP, buf.readUnsignedByte() * 0.1); break; default: - skipFlexField(i, buf); + if (i < FLEX_FIELDS_SIZES.length) { + buf.skipBytes(FLEX_FIELDS_SIZES[i]); + } break; } } @@ -505,7 +482,6 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { long index = 0; int length = buf.readUnsignedShort(); - // Check buffer size and struct version if (length <= buf.readableBytes() && buf.readUnsignedByte() == 0x0A) { buf.readUnsignedByte(); // length of static part @@ -586,12 +562,10 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { return null; } - byte flexProtocolVersion, flexStructVersion; - - flexProtocolVersion = (byte) buf.readUnsignedByte(); - flexStructVersion = (byte) buf.readUnsignedByte(); - if ((flexProtocolVersion == (byte) 0x0A || flexProtocolVersion == (byte) 0x14) - && (flexStructVersion == (byte) 0x0A || flexStructVersion == (byte) 0x14)) { + byte flexProtocolVersion = (byte) buf.readUnsignedByte(); + byte flexStructVersion = (byte) buf.readUnsignedByte(); + if ((flexProtocolVersion == 0x0A || flexProtocolVersion == 0x14) + && (flexStructVersion == 0x0A || flexStructVersion == 0x14)) { flexBitfieldDataSize = buf.readUnsignedByte(); if (flexBitfieldDataSize > 122) { @@ -674,20 +648,16 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { } else { DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); if (deviceSession != null) { - try { - switch (type) { - case "*>A": - return processNtcbArray(deviceSession, channel, buf); - case "*>T": - return processNtcbSingle(deviceSession, channel, buf); - case "*>F": // "*>FLEX" - buf.skipBytes(3); - return processFlexNegotiation(channel, buf); - default: - break; - } - } catch (IndexOutOfBoundsException error) { - LOGGER.warn("Navis NTCB message parsing error", error); + switch (type) { + case "*>A": + return processNtcbArray(deviceSession, channel, buf); + case "*>T": + return processNtcbSingle(deviceSession, channel, buf); + case "*>F": + buf.skipBytes(3); + return processFlexNegotiation(channel, buf); + default: + break; } } } @@ -707,24 +677,20 @@ public class NavisProtocolDecoder extends BaseProtocolDecoder { DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); if (deviceSession != null) { - try { - switch (type) { - // FLEX 1.0 - case "~A": - return processFlexArray(this::parseFlexPosition, type, deviceSession, channel, buf); - case "~T": - case "~C": - return processFlexSingle(this::parseFlexPosition, type, deviceSession, channel, buf); - // FLEX 2.0 (Extra packages) - case "~E": - return processFlexArray(this::parseFlex20Position, type, deviceSession, channel, buf); - case "~X": - return processFlexSingle(this::parseFlex20Position, type, deviceSession, channel, buf); - default: - break; - } - } catch (IndexOutOfBoundsException error) { - LOGGER.warn("Navis FLEX message parsing error", error); + switch (type) { + // FLEX 1.0 + case "~A": + return processFlexArray(this::parseFlexPosition, type, deviceSession, channel, buf); + case "~T": + case "~C": + return processFlexSingle(this::parseFlexPosition, type, deviceSession, channel, buf); + // FLEX 2.0 (Extra packages) + case "~E": + return processFlexArray(this::parseFlex20Position, type, deviceSession, channel, buf); + case "~X": + return processFlexSingle(this::parseFlex20Position, type, deviceSession, channel, buf); + default: + break; } } diff --git a/test/org/traccar/protocol/NavisFrameDecoderTest.java b/test/org/traccar/protocol/NavisFrameDecoderTest.java index 069f03d1b..5e8d8fd36 100644 --- a/test/org/traccar/protocol/NavisFrameDecoderTest.java +++ b/test/org/traccar/protocol/NavisFrameDecoderTest.java @@ -7,30 +7,33 @@ import org.junit.Test; public class NavisFrameDecoderTest extends ProtocolTest { @Test - public void testDecode() throws Exception { + public void testDecodeNtcb() throws Exception { NavisProtocolDecoder protocolDecoder = new NavisProtocolDecoder(null); NavisFrameDecoder frameDecoder = new NavisFrameDecoder(protocolDecoder); - // Handshake - verifyNull(protocolDecoder, binary( - "404E5443010000007B000000130044342A3E533A383631373835303035323035303739")); - - // NTCB F5.2 - Single verifyFrame(binary( "404e5443010000000000000059009adb2a3e54250000000000ff1500040b0a1008291838001200760ee600000000000000000000000f1500040b0a10ac20703fb1aec23f00000000320149668f430000000000000000000000000000000000000000000000f3808080"), frameDecoder.decode(null, null, binary("404e5443010000000000000059009adb2a3e54250000000000ff1500040b0a1008291838001200760ee600000000000000000000000f1500040b0a10ac20703fb1aec23f00000000320149668f430000000000000000000000000000000000000000000000f3808080"))); - // FLEX 1.0 - Negotiation + } + + @Test + public void testDecodeFlex10() throws Exception { + + NavisProtocolDecoder protocolDecoder = new NavisProtocolDecoder(null); + NavisFrameDecoder frameDecoder = new NavisFrameDecoder(protocolDecoder); + + verifyNull(protocolDecoder, binary( + "404e544301000000c9b5f602130046c52a3e533a383639363936303439373232383235")); + verifyNull(protocolDecoder, binary( "404e544301000000aaecf6021300c8712a3e464c4558b00a0a45ffff300a08080f8388")); - // FLEX 1.0 - Single verifyFrame(binary( "7e54040000000400000030129957405c000b00632f9857405ccace03021e129101a103000000000000c4005ba3fe3b00000000120046100000000000001aff7f000080bfffff80000080bfffffffff9f"), frameDecoder.decode(null, null, binary("7e54040000000400000030129957405c000b00632f9857405ccace03021e129101a103000000000000c4005ba3fe3b00000000120046100000000000001aff7f000080bfffff80000080bfffffffff9f"))); - // FLEX 1.0 - Array (1 message) verifyFrame(binary( "7e4101080000000917c057405c002b001833c057405cbbce030225129101a00300007c6102408900400c1b3cfce3b23a12004710e000000000001bff7f000080bfffff80000080bfffffffffb2"), frameDecoder.decode(null, null, binary("7e4101080000000917c057405c002b001833c057405cbbce030225129101a00300007c6102408900400c1b3cfce3b23a12004710e000000000001bff7f000080bfffff80000080bfffffffffb2"))); diff --git a/test/org/traccar/protocol/NavisProtocolDecoderTest.java b/test/org/traccar/protocol/NavisProtocolDecoderTest.java index 5bf0c84bc..33a6bab24 100644 --- a/test/org/traccar/protocol/NavisProtocolDecoderTest.java +++ b/test/org/traccar/protocol/NavisProtocolDecoderTest.java @@ -7,20 +7,20 @@ import org.junit.Test; public class NavisProtocolDecoderTest extends ProtocolTest { @Test - public void testDecode() throws Exception { + public void testDecodeNtcb() throws Exception { NavisProtocolDecoder decoder = new NavisProtocolDecoder(null); - // Handshake verifyNull(decoder, binary( "404E5443010000007B000000130044342A3E533A383631373835303035323035303739")); - // NTCB F5.2 - Single + verifyNull(decoder, binary( + "404E5443010000007B000000130047372A3E533A383631373835303035313236303639")); + verifyPosition(decoder, binary( "404e5443010000000000000059009adb2a3e54250000000000ff1500040b0a1008291838001200760ee600000000000000000000000f1500040b0a10ac20703fb1aec23f00000000320149668f430000000000000000000000000000000000000000000000f3808080"), position("2016-11-11 21:00:04.000", true, 53.74336, 87.14437)); - // NTCB 5.2 - Array (1 message) verifyPositions(decoder, binary( "404e544300000000040000005a00c6812a3e410125e3a60700011705071503011030210c0000fa200910e6000000000000000000000001082106150010ae97643f88a39f3f0000000090001fcc6c450000000000000000000000000000000000000000000000f6808080")); @@ -30,44 +30,48 @@ public class NavisProtocolDecoderTest extends ProtocolTest { verifyPositions(decoder, binary( "404E5443010000007B0000005A0050692A3E410125DB0E00000015110707110A0C0880630000AA39A2381600020000000000000000000C110708110A0CB389793F1AEF263F00000000120034F516440000000000000000000000FAFF000000FAFF000000FAFF80808080")); - // NTCB 6.0 - Single verifyPosition(decoder, binary( "404e544301000000cdfbf5027200852e2a3e5406aa170000c11116162410001310a9110e80996b281003000a0008000000000000000000d207d207ffffff00fbff00fbff00fbff00fbff00fbff00fbff00fbff2d808080ffffffffffff2b161624100013509b0302b0f89201830500000000000037002fb8cf43eed5843a35003500"), position("2019-01-16 22:22:36.000", true, 56.31800, 44.01523)); - // NTCB 6.0 - Array (1 message) verifyPositions(decoder, binary( "404e54430100000045635902730081972a3e4101060b7e0e000b171328050d00133029110e00bc6141100200000000000000000000000000d207d307ffffff00fbff00fbff00fbff00fbff00fbff00fbff00fbff02808080ffffffffffff4f1328050d001371cd0302c5109101a60300000000000000003d1b37470000000096009600")); + } + + @Test + public void testDecodeFlex10() throws Exception { + + NavisProtocolDecoder decoder = new NavisProtocolDecoder(null); + + verifyNull(decoder, binary( + "404e544301000000c9b5f602130046c52a3e533a383639363936303439373232383235")); - // FLEX 1.0 - Negotiation verifyNull(decoder, binary( "404e544301000000aaecf6021300c8712a3e464c4558b00a0a45ffff300a08080f8388")); - // FLEX 1.0 - Single verifyPosition(decoder, binary( "7e54040000000400000030129957405c000b00632f9857405ccace03021e129101a103000000000000c4005ba3fe3b00000000120046100000000000001aff7f000080bfffff80000080bfffffffff9f"), position("2019-01-17 10:23:20.000", true, 56.33996, 43.80762)); - // FLEX 1.0 - Array (1 message) verifyPositions(decoder, binary( "7e4101080000000917c057405c002b001833c057405cbbce030225129101a00300007c6102408900400c1b3cfce3b23a12004710e000000000001bff7f000080bfffff80000080bfffffffffb2")); + } - decoder = new NavisProtocolDecoder(null); + @Test + public void testDecodeFlex20() throws Exception { + + NavisProtocolDecoder decoder = new NavisProtocolDecoder(null); - // Handshake verifyNull(decoder, binary( - "404E5443010000007B000000130047372A3E533A383631373835303035313236303639")); + "404e544301000000a9eef602130043fb2a3e533a383639363936303439373337333835")); - // FLEX 2.0 - Negotiation verifyNull(decoder, binary( "404e544301000000a9eef6021a003f8e2a3e464c4558b014147afffff008080800000e00000000000000")); - // FLEX 2.0 - Single verifyPosition(decoder, binary( "7e5428000000280000002111d16b435c00a900154bd16b435ce19e030259f6920133050000b7623e429300c9e7f03f2ba45a3e1f001f007b6c5910850f0100001629080a000000000000060947"), position("2019-01-19 18:26:25.000", true, 56.31952, 44.01423)); - // FLEX 2.0 - Array (1 message) verifyPositions(decoder, binary( "7e4101270000000b17b16b435c00a9000d4bb26b435caaa2030229f29201620500000000000093004493d53fee892d3e1f001f00ac6c591081f00000001700080a0000000000000609f2")); } -- cgit v1.2.3 From a3c540a952b5136b1de2900c8947847f70b39446 Mon Sep 17 00:00:00 2001 From: Evgeny S Maksimov Date: Fri, 1 Feb 2019 00:56:35 +0300 Subject: Frame decoder refactoring --- src/org/traccar/protocol/NavisFrameDecoder.java | 30 ++++++++++++++-------- src/org/traccar/protocol/NavisProtocol.java | 5 ++-- .../traccar/protocol/NavisFrameDecoderTest.java | 12 +++------ 3 files changed, 24 insertions(+), 23 deletions(-) (limited to 'src/org/traccar/protocol/NavisFrameDecoder.java') diff --git a/src/org/traccar/protocol/NavisFrameDecoder.java b/src/org/traccar/protocol/NavisFrameDecoder.java index 9a3b3d45c..0146243cd 100644 --- a/src/org/traccar/protocol/NavisFrameDecoder.java +++ b/src/org/traccar/protocol/NavisFrameDecoder.java @@ -21,20 +21,17 @@ 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 final NavisProtocolDecoder protocolDecoder; - - public NavisFrameDecoder(NavisProtocolDecoder protocolDecoder) { - this.protocolDecoder = protocolDecoder; - } - @Override protected Object decode( ChannelHandlerContext ctx, Channel channel, ByteBuf buf) throws Exception { @@ -53,7 +50,15 @@ public class NavisFrameDecoder extends BaseFrameDecoder { return buf.readRetainedSlice(1); } - if (protocolDecoder.getFlexDataSize() > 0) { + if (ctx != null) { + NavisProtocolDecoder protocolDecoder = + BasePipelineFactory.getHandler(ctx.pipeline(), NavisProtocolDecoder.class); + if (protocolDecoder != null) { + flexDataSize = protocolDecoder.getFlexDataSize(); + } + } + + if (flexDataSize > 0) { // FLEX frame if (buf.readableBytes() > FLEX_HEADER_LENGTH) { int length = 0; @@ -61,14 +66,13 @@ public class NavisFrameDecoder extends BaseFrameDecoder { switch (type) { // FLEX 1.0 case "~A": - length = protocolDecoder.getFlexDataSize() - * buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGTH) + 1 + 1; + length = flexDataSize * buf.getByte(buf.readerIndex() + FLEX_HEADER_LENGTH) + 1 + 1; break; case "~T": - length = protocolDecoder.getFlexDataSize() + 4 + 1; + length = flexDataSize + 4 + 1; break; case "~C": - length = protocolDecoder.getFlexDataSize() + 1; + length = flexDataSize + 1; break; // FLEX 2.0 (Extra packages) case "~E": @@ -108,4 +112,8 @@ public class NavisFrameDecoder extends BaseFrameDecoder { return null; } + public void setFlexDataSize(int flexDataSize) { + this.flexDataSize = flexDataSize; + } + } diff --git a/src/org/traccar/protocol/NavisProtocol.java b/src/org/traccar/protocol/NavisProtocol.java index 628b78fd4..db0eba8c1 100644 --- a/src/org/traccar/protocol/NavisProtocol.java +++ b/src/org/traccar/protocol/NavisProtocol.java @@ -25,9 +25,8 @@ public class NavisProtocol extends BaseProtocol { addServer(new TrackerServer(false, getName()) { @Override protected void addProtocolHandlers(PipelineBuilder pipeline) { - NavisProtocolDecoder protocolDecoder = new NavisProtocolDecoder(NavisProtocol.this); - pipeline.addLast(new NavisFrameDecoder(protocolDecoder)); - pipeline.addLast(protocolDecoder); + pipeline.addLast(new NavisFrameDecoder()); + pipeline.addLast(new NavisProtocolDecoder(NavisProtocol.this)); } }); } diff --git a/test/org/traccar/protocol/NavisFrameDecoderTest.java b/test/org/traccar/protocol/NavisFrameDecoderTest.java index 5e8d8fd36..0ebfeacd2 100644 --- a/test/org/traccar/protocol/NavisFrameDecoderTest.java +++ b/test/org/traccar/protocol/NavisFrameDecoderTest.java @@ -9,8 +9,7 @@ public class NavisFrameDecoderTest extends ProtocolTest { @Test public void testDecodeNtcb() throws Exception { - NavisProtocolDecoder protocolDecoder = new NavisProtocolDecoder(null); - NavisFrameDecoder frameDecoder = new NavisFrameDecoder(protocolDecoder); + NavisFrameDecoder frameDecoder = new NavisFrameDecoder(); verifyFrame(binary( "404e5443010000000000000059009adb2a3e54250000000000ff1500040b0a1008291838001200760ee600000000000000000000000f1500040b0a10ac20703fb1aec23f00000000320149668f430000000000000000000000000000000000000000000000f3808080"), @@ -21,14 +20,9 @@ public class NavisFrameDecoderTest extends ProtocolTest { @Test public void testDecodeFlex10() throws Exception { - NavisProtocolDecoder protocolDecoder = new NavisProtocolDecoder(null); - NavisFrameDecoder frameDecoder = new NavisFrameDecoder(protocolDecoder); + NavisFrameDecoder frameDecoder = new NavisFrameDecoder(); - verifyNull(protocolDecoder, binary( - "404e544301000000c9b5f602130046c52a3e533a383639363936303439373232383235")); - - verifyNull(protocolDecoder, binary( - "404e544301000000aaecf6021300c8712a3e464c4558b00a0a45ffff300a08080f8388")); + frameDecoder.setFlexDataSize(73); verifyFrame(binary( "7e54040000000400000030129957405c000b00632f9857405ccace03021e129101a103000000000000c4005ba3fe3b00000000120046100000000000001aff7f000080bfffff80000080bfffffffff9f"), -- cgit v1.2.3