This is an automated email from the ASF dual-hosted git repository. sruehl pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
commit 572e16bcf7287bebf47c501152675ff37854fc65 Author: Sebastian Rühl <sru...@apache.org> AuthorDate: Wed Jun 13 09:45:55 2018 +0200 ADS/AMS log unexpected frames --- .../plc4x/java/ads/api/serial/types/FragmentNumber.java | 14 ++++++++++++++ .../plc4x/java/ads/protocol/Payload2SerialProtocol.java | 7 +++++++ .../Payload2SerialProtocolExampleConversationTest.java | 4 ++++ 3 files changed, 25 insertions(+) diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/serial/types/FragmentNumber.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/serial/types/FragmentNumber.java index 808049a..6c43809 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/serial/types/FragmentNumber.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/serial/types/FragmentNumber.java @@ -21,6 +21,9 @@ package org.apache.plc4x.java.ads.api.serial.types; import io.netty.buffer.ByteBuf; import org.apache.plc4x.java.ads.api.util.ByteValue; +import static java.lang.Integer.toHexString; +import static org.apache.commons.lang3.StringUtils.leftPad; + public class FragmentNumber extends ByteValue { public static final int NUM_BYTES = 1; @@ -41,4 +44,15 @@ public class FragmentNumber extends ByteValue { return new FragmentNumber(byteBuf); } + public byte getAsByte() { + return getBytes()[0]; + } + + @Override + public String toString() { + return super.toString() + "{" + + "byteValue=" + (getAsByte() & 0xFF) + + ",hexValue=0x" + leftPad(toHexString(getAsByte() & 0xFF), NUM_BYTES * 2, "0") + + "}"; + } } \ No newline at end of file diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/Payload2SerialProtocol.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/Payload2SerialProtocol.java index 70a7932..95193d0 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/Payload2SerialProtocol.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/Payload2SerialProtocol.java @@ -70,6 +70,13 @@ public class Payload2SerialProtocol extends MessageToMessageCodec<ByteBuf, ByteB TransmitterAddress transmitterAddress = TransmitterAddress.of(byteBuf); ReceiverAddress receiverAddress = ReceiverAddress.of(byteBuf); FragmentNumber fragmentNumber = FragmentNumber.of(byteBuf); + int expectedFrameNumber = fragmentCounter.get() - 1; + if (expectedFrameNumber < 0) { + expectedFrameNumber = 255; + } + if (fragmentNumber.getAsByte() != expectedFrameNumber) { + LOGGER.warn("Unexpected fragment {} received. Expected {}", fragmentNumber, expectedFrameNumber); + } UserDataLength userDataLength = UserDataLength.of(byteBuf); UserData userData; byte userDataLengthAsByte = userDataLength.getAsByte(); diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/Payload2SerialProtocolExampleConversationTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/Payload2SerialProtocolExampleConversationTest.java index 06b1a21..1f58276 100644 --- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/Payload2SerialProtocolExampleConversationTest.java +++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/Payload2SerialProtocolExampleConversationTest.java @@ -25,6 +25,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.util.concurrent.EventExecutor; import io.netty.util.concurrent.ScheduledFuture; import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.plc4x.java.ads.api.commands.AdsReadRequest; import org.apache.plc4x.java.ads.api.commands.AdsReadResponse; import org.apache.plc4x.java.ads.api.commands.types.*; @@ -48,6 +49,7 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; import static org.apache.plc4x.java.ads.util.Assert.byteArrayEqualsTo; import static org.mockito.Mockito.*; @@ -68,6 +70,7 @@ public class Payload2SerialProtocolExampleConversationTest { public void setUp() { ExecutorService executorService = Executors.newFixedThreadPool(10); channelHandlerContextMock = mock(ChannelHandlerContext.class, RETURNS_DEEP_STUBS); + when(channelHandlerContextMock.toString()).thenReturn("ChannelHandlerContextMock"); when(channelHandlerContextMock.executor()).then(_ign -> { EventExecutor eventExecutor = mock(EventExecutor.class); when(eventExecutor.schedule(any(Callable.class), anyLong(), any())) @@ -124,6 +127,7 @@ public class Payload2SerialProtocolExampleConversationTest { @Test public void exampleConversation() throws Exception { + FieldUtils.writeDeclaredField(SUT, "fragmentCounter", new AtomicInteger(6), true); // 1. Terminal --> PLC : Request of 2 bytre data int[] exampleRequestInt = { /*Magic Cookie */ 0x01, 0xA5, -- To stop receiving notification emails like this one, please contact sru...@apache.org.