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
The following commit(s) were added to refs/heads/master by this push: new 31f061f + Refactored value visualization + Added negative test for crc checksum calculation 31f061f is described below commit 31f061f64de219b646a4b4c5a9c424484a3fc72b Author: Sebastian Rühl <sru...@apache.org> AuthorDate: Thu Mar 22 09:49:58 2018 +0100 + Refactored value visualization + Added negative test for crc checksum calculation --- .../apache/plc4x/java/ads/api/util/ByteValue.java | 2 +- .../java/ads/api/util/UnsignedIntLEByteValue.java | 8 +++++- .../ads/api/util/UnsignedShortLEByteValue.java | 8 ++++-- .../java/ads/protocol/Payload2SerialProtocol.java | 20 +++++++------- ...load2SerialProtocolExampleConversationTest.java | 31 ++++++++++++++++++++++ 5 files changed, 55 insertions(+), 14 deletions(-) diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteValue.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteValue.java index 602bab0..561aba2 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteValue.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/ByteValue.java @@ -99,6 +99,6 @@ public class ByteValue implements ByteReadable { @Override public String toString() { // TODO: maybe we could find a way to implement this to string - return getClass().getSimpleName() + "@" + Integer.toHexString(hashCode()) + "{value=" + value.length + "bytes}"; + return getClass().getSimpleName() + "@" + Integer.toHexString(hashCode()) + "{bytes=" + value.length + "}"; } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/UnsignedIntLEByteValue.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/UnsignedIntLEByteValue.java index 820d9a3..db477b9 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/UnsignedIntLEByteValue.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/UnsignedIntLEByteValue.java @@ -22,6 +22,9 @@ import io.netty.buffer.ByteBuf; import java.nio.ByteBuffer; +import static java.lang.Long.toHexString; +import static org.apache.commons.lang3.StringUtils.leftPad; + public abstract class UnsignedIntLEByteValue extends ByteValue { public static final int UNSIGNED_INT_LE_NUM_BYTES = 4; @@ -90,6 +93,9 @@ public abstract class UnsignedIntLEByteValue extends ByteValue { @Override public String toString() { - return String.valueOf(getAsLong()); + return super.toString() + "{" + + "longValue=" + getAsLong() + + ",hexValue=0x" + leftPad(toHexString(getAsLong()), UNSIGNED_INT_LE_NUM_BYTES, "0") + + "} "; } } diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/UnsignedShortLEByteValue.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/UnsignedShortLEByteValue.java index 01fe3df..9a43332 100644 --- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/UnsignedShortLEByteValue.java +++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/api/util/UnsignedShortLEByteValue.java @@ -22,6 +22,9 @@ import io.netty.buffer.ByteBuf; import java.nio.ByteBuffer; +import static java.lang.Integer.toHexString; +import static org.apache.commons.lang3.StringUtils.leftPad; + public abstract class UnsignedShortLEByteValue extends ByteValue { public static final int UNSIGNED_SHORT_LE_NUM_BYTES = 2; @@ -88,8 +91,9 @@ public abstract class UnsignedShortLEByteValue extends ByteValue { @Override public String toString() { - return getClass().getSimpleName() + "{" + + return super.toString() + "{" + "intValue=" + getAsInt() + - "} " + super.toString(); + ",hexValue=0x" + leftPad(toHexString(getAsInt()), UNSIGNED_SHORT_LE_NUM_BYTES, "0") + + "}"; } } 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 6326891..7234f37 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 @@ -19,6 +19,8 @@ package org.apache.plc4x.java.ads.protocol; import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToMessageCodec; import org.apache.plc4x.java.ads.api.serial.AmsSerialAcknowledgeFrame; @@ -32,9 +34,6 @@ import org.slf4j.LoggerFactory; import java.util.List; -import static java.lang.Integer.toHexString; -import static org.apache.commons.lang3.StringUtils.leftPad; - public class Payload2SerialProtocol extends MessageToMessageCodec<ByteBuf, ByteBuf> { private static final Logger LOGGER = LoggerFactory.getLogger(Payload2TcpProtocol.class); @@ -69,6 +68,11 @@ public class Payload2SerialProtocol extends MessageToMessageCodec<ByteBuf, ByteB case AmsSerialFrame.ID: AmsSerialFrame amsSerialFrame = AmsSerialFrame.of(magicCookie, transmitterAddress, receiverAddress, fragmentNumber, userDataLength, userData, crc); LOGGER.debug("Ams Serial Frame received {}", amsSerialFrame); + // TODO: check if this is the right way to ack a package. + ChannelFuture channelFuture = channelHandlerContext.writeAndFlush(AmsSerialAcknowledgeFrame.of(transmitterAddress, receiverAddress, fragmentNumber)); + channelFuture.addListener((ChannelFutureListener) future -> { + // TODO: we might wait for the ack-frame to be transmitted before we forward the package + }); out.add(userData.getByteBuf()); break; case AmsSerialAcknowledgeFrame.ID: @@ -80,13 +84,9 @@ public class Payload2SerialProtocol extends MessageToMessageCodec<ByteBuf, ByteB LOGGER.debug("Ams Serial Reset Frame received {}", amsSerialResetFrame); break; } - int calculatedCrc16 = DigestUtil.calculateCrc16(magicCookie, transmitterAddress, receiverAddress, fragmentNumber, userDataLength, userData); - if (!crc.equals(CRC.of(calculatedCrc16))) { - throw new PlcProtocolException("CRC checksum wrong. Got " - + "0x" + leftPad(toHexString(crc.getAsInt()), 4, "0") - + " expected " - + "0x" + leftPad(toHexString(calculatedCrc16), 4, "0") - ); + CRC calculatedCrc = CRC.of(DigestUtil.calculateCrc16(magicCookie, transmitterAddress, receiverAddress, fragmentNumber, userDataLength, userData)); + if (!crc.equals(calculatedCrc)) { + throw new PlcProtocolException("CRC checksum wrong. Got " + crc + " expected " + calculatedCrc); } if (byteBuf.readableBytes() > 0) { 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 3cf2c38..f273fb0 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 @@ -32,6 +32,7 @@ import org.apache.plc4x.java.ads.api.serial.AmsSerialAcknowledgeFrame; import org.apache.plc4x.java.ads.api.serial.AmsSerialFrame; import org.apache.plc4x.java.ads.api.serial.types.FragmentNumber; import org.apache.plc4x.java.ads.api.serial.types.UserData; +import org.apache.plc4x.java.api.exceptions.PlcProtocolException; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -62,6 +63,36 @@ public class Payload2SerialProtocolExampleConversationTest { SUT = new Payload2SerialProtocol(); } + @Test(expected = PlcProtocolException.class) + public void testWrongCrc() throws Exception { + int[] exampleRequestInt = { + /*Magic Cookie */ 0x01, 0xA5, + /*Sender */ 0x00, + /*Empfaenger */ 0x00, + /*Fragmentnummer */ 0x06, + /*Datenlaenge */ 0x2C, + /*NetID Empfaenger*/ 0xC0, 0xA8, 0x64, 0xAE, 0x01, 0x01, + /*Port Nummer */ 0x21, 0x03, + /*NetID Sender */ 0xC0, 0xA8, 0x64, 0x9C, 0x01, 0x01, + /*Portnummer */ 0x01, 0x80, + /*Kommando lesen */ 0x02, 0x00, + /*Status */ 0x04, 0x00, + /*Anzahl Datenbyte*/ 0x0C, 0x00, 0x00, 0x00, + /*Fehlercode */ 0x00, 0x00, 0x00, 0x00, + /*InvokeID */ 0x07, 0x00, 0x00, 0x00, + /*Index Gruppe */ 0x05, 0xF0, 0x00, 0x00, + /*Index Offset */ 0x04, 0x00, 0x00, 0x9D, + /*Anzahl Byte */ 0x02, 0x00, 0x00, 0x00, + // This Checksum is flipped to provoke exception + /*Checksumme */ 0x28, 0x79, + }; + byte[] exampleRequest = ArrayUtils.toPrimitive(Arrays + .stream(exampleRequestInt) + .mapToObj(value -> (byte) value) + .toArray(Byte[]::new)); + SUT.decode(channelHandlerContextMock, Unpooled.wrappedBuffer(exampleRequest), new ArrayList<>()); + } + @Test public void exampleConversation() throws Exception { // 1. Terminal --> PLC : Request of 2 bytre data -- To stop receiving notification emails like this one, please contact sru...@apache.org.