You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/02/16 08:47:03 UTC

[incubator-plc4x] branch feature/Beckhoff_ADS_protocol updated: + implement basic fake serialization for ADS. + Fixed tests and protocol implementation

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch feature/Beckhoff_ADS_protocol
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git


The following commit(s) were added to refs/heads/feature/Beckhoff_ADS_protocol by this push:
     new ad93bf0  + implement basic fake serialization for ADS. + Fixed tests and protocol implementation
ad93bf0 is described below

commit ad93bf0aee91c79ef3a2f68165b002907a27d41a
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Feb 16 09:46:59 2018 +0100

    + implement basic fake serialization for ADS.
    + Fixed tests and protocol implementation
---
 plc4j/protocols/ads/pom.xml                        |   1 -
 .../org/apache/plc4x/java/ads/ADSPlcDriver.java    |   8 +-
 .../java/ads/connection/ADSPlcConnection.java      |   2 +-
 .../plc4x/java/ads/netty/Plc4XADSProtocol.java     | 153 ++++++++++++++++++++-
 .../apache/plc4x/java/ads/ADSPlcDriverTest.java    |   1 -
 5 files changed, 154 insertions(+), 11 deletions(-)

diff --git a/plc4j/protocols/ads/pom.xml b/plc4j/protocols/ads/pom.xml
index 3e1339f..53dd86a 100644
--- a/plc4j/protocols/ads/pom.xml
+++ b/plc4j/protocols/ads/pom.xml
@@ -67,7 +67,6 @@
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
-      <version>3.7</version>
     </dependency>
 
     <dependency>
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/ADSPlcDriver.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/ADSPlcDriver.java
index 0210f99..9df2f3f 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/ADSPlcDriver.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/ADSPlcDriver.java
@@ -27,6 +27,8 @@ import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -70,7 +72,11 @@ public class ADSPlcDriver implements PlcDriver {
         AMSNetId sourceAmsNetId = StringUtils.isNotBlank(sourceAmsNetIdString) ? AMSNetId.of(sourceAmsNetIdString) : null;
         String sourceAmsPortString = matcher.group("sourceAmsPort");
         AMSPort sourceAmsPort = StringUtils.isNotBlank(sourceAmsPortString) ? AMSPort.of(sourceAmsPortString) : null;
-        return new ADSPlcConnection(host, port, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort);
+        try {
+            return new ADSPlcConnection(InetAddress.getByName(host), port, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort);
+        } catch (UnknownHostException e) {
+            throw new PlcConnectionException(e);
+        }
     }
 
     @Override
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/ADSPlcConnection.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/ADSPlcConnection.java
index 1d050d9..9b52907 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/ADSPlcConnection.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/ADSPlcConnection.java
@@ -64,7 +64,7 @@ public class ADSPlcConnection extends AbstractPlcConnection implements PlcReader
     }
 
     public ADSPlcConnection(InetAddress address, Integer port, AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort) {
-        super(new TcpSocketChannelFactory(address, port));
+        super(new TcpSocketChannelFactory(address, port != null ? port : TCP_PORT));
         this.targetAmsNetId = targetAmsNetId;
         this.targetAmsPort = targetAmsPort;
         this.sourceAmsNetId = sourceAmsNetId;
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocol.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocol.java
index 9430e91..db9cbb6 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocol.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/netty/Plc4XADSProtocol.java
@@ -18,8 +18,11 @@ under the License.
 */
 package org.apache.plc4x.java.ads.netty;
 
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.handler.codec.MessageToMessageCodec;
+import org.apache.commons.lang3.SerializationUtils;
 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.ADSWriteRequest;
@@ -46,6 +49,7 @@ import org.apache.plc4x.java.api.types.ResponseCode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.Serializable;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -98,9 +102,15 @@ public class Plc4XADSProtocol extends MessageToMessageCodec<AMSTCPPaket, PlcRequ
         Invoke invokeId = Invoke.of(correlationBuilder.incrementAndGet());
         IndexGroup indexGroup = IndexGroup.of(adsAddress.getIndexGroup());
         IndexOffset indexOffset = IndexOffset.of(adsAddress.getIndexOffset());
-        // TODO: implement serialization
-        Length length = Length.of(1);
-        Data data = Data.of(new byte[]{0x42});
+        ByteBuf buffer = Unpooled.buffer();
+        for (Object o : writeRequestItem.getValues()) {
+            // TODO: we need custom serialization here as java types don't really help here
+            byte[] serialize = SerializationUtils.serialize((Serializable) o);
+            buffer.writeBytes(serialize);
+        }
+        byte[] bytes = buffer.array();
+        Length length = Length.of(bytes.length);
+        Data data = Data.of(bytes);
         AMSTCPPaket amstcpPaket = new ADSWriteRequest(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, indexGroup, indexOffset, length, data);
         out.add(amstcpPaket);
     }
@@ -177,18 +187,147 @@ public class Plc4XADSProtocol extends MessageToMessageCodec<AMSTCPPaket, PlcRequ
 
         ResponseCode responseCode = decodeResponseCode(responseMessage.getResult());
         byte[] bytes = responseMessage.getData().getBytes();
+        // TODO: we need custom serialization here as java types don't really help here
+        Object deserialize = SerializationUtils.deserialize(bytes);
 
-        // TODO: implement deserialization
         if (plcReadRequest instanceof TypeSafePlcReadRequest) {
-            return new TypeSafePlcReadResponse((TypeSafePlcReadRequest) plcReadRequest, Collections.singletonList(new ReadResponseItem<>(requestItem, responseCode, Collections.singletonList(bytes))));
+            return new TypeSafePlcReadResponse((TypeSafePlcReadRequest) plcReadRequest, Collections.singletonList(new ReadResponseItem<>(requestItem, responseCode, Collections.singletonList(deserialize))));
         } else {
             return new PlcReadResponse(plcReadRequest, Collections.singletonList(new ReadResponseItem<>(requestItem, responseCode, Collections.singletonList(bytes))));
         }
     }
 
     private ResponseCode decodeResponseCode(Result result) {
-        // TODO: complete mapping
-        return result.getAsLong() == 0 ? ResponseCode.OK : ResponseCode.INTERNAL_ERROR;
+        switch (result.toAdsReturnCode()) {
+            case ADS_CODE_0:
+                return ResponseCode.OK;
+            case ADS_CODE_1:
+                return ResponseCode.INTERNAL_ERROR;
+            case ADS_CODE_2:
+            case ADS_CODE_3:
+            case ADS_CODE_4:
+            case ADS_CODE_5:
+                return ResponseCode.INTERNAL_ERROR;
+            case ADS_CODE_6:
+            case ADS_CODE_7:
+                return ResponseCode.INVALID_ADDRESS;
+            case ADS_CODE_8:
+            case ADS_CODE_9:
+            case ADS_CODE_10:
+            case ADS_CODE_11:
+            case ADS_CODE_12:
+            case ADS_CODE_13:
+            case ADS_CODE_14:
+            case ADS_CODE_15:
+            case ADS_CODE_16:
+            case ADS_CODE_17:
+            case ADS_CODE_18:
+            case ADS_CODE_19:
+            case ADS_CODE_20:
+            case ADS_CODE_21:
+            case ADS_CODE_22:
+            case ADS_CODE_23:
+            case ADS_CODE_24:
+            case ADS_CODE_25:
+            case ADS_CODE_26:
+            case ADS_CODE_27:
+            case ADS_CODE_28:
+            case ADS_CODE_1280:
+            case ADS_CODE_1281:
+            case ADS_CODE_1282:
+            case ADS_CODE_1283:
+            case ADS_CODE_1284:
+            case ADS_CODE_1285:
+            case ADS_CODE_1286:
+            case ADS_CODE_1287:
+            case ADS_CODE_1288:
+            case ADS_CODE_1289:
+            case ADS_CODE_1290:
+            case ADS_CODE_1291:
+            case ADS_CODE_1292:
+            case ADS_CODE_1293:
+            case ADS_CODE_1792:
+            case ADS_CODE_1793:
+            case ADS_CODE_1794:
+            case ADS_CODE_1795:
+            case ADS_CODE_1796:
+            case ADS_CODE_1797:
+            case ADS_CODE_1798:
+            case ADS_CODE_1799:
+            case ADS_CODE_1800:
+            case ADS_CODE_1801:
+            case ADS_CODE_1802:
+            case ADS_CODE_1803:
+            case ADS_CODE_1804:
+            case ADS_CODE_1805:
+            case ADS_CODE_1806:
+            case ADS_CODE_1807:
+            case ADS_CODE_1808:
+            case ADS_CODE_1809:
+            case ADS_CODE_1810:
+            case ADS_CODE_1811:
+            case ADS_CODE_1812:
+            case ADS_CODE_1813:
+            case ADS_CODE_1814:
+            case ADS_CODE_1815:
+            case ADS_CODE_1816:
+            case ADS_CODE_1817:
+            case ADS_CODE_1818:
+            case ADS_CODE_1819:
+            case ADS_CODE_1820:
+            case ADS_CODE_1821:
+            case ADS_CODE_1822:
+            case ADS_CODE_1823:
+            case ADS_CODE_1824:
+            case ADS_CODE_1825:
+            case ADS_CODE_1826:
+            case ADS_CODE_1827:
+            case ADS_CODE_1828:
+            case ADS_CODE_1836:
+            case ADS_CODE_1856:
+            case ADS_CODE_1857:
+            case ADS_CODE_1858:
+            case ADS_CODE_1859:
+            case ADS_CODE_1860:
+            case ADS_CODE_1861:
+            case ADS_CODE_1862:
+            case ADS_CODE_1863:
+            case ADS_CODE_1864:
+            case ADS_CODE_1872:
+            case ADS_CODE_1873:
+            case ADS_CODE_1874:
+            case ADS_CODE_1875:
+            case ADS_CODE_1876:
+            case ADS_CODE_1877:
+            case ADS_CODE_4096:
+            case ADS_CODE_4097:
+            case ADS_CODE_4098:
+            case ADS_CODE_4099:
+            case ADS_CODE_4100:
+            case ADS_CODE_4101:
+            case ADS_CODE_4102:
+            case ADS_CODE_4103:
+            case ADS_CODE_4104:
+            case ADS_CODE_4105:
+            case ADS_CODE_4106:
+            case ADS_CODE_4107:
+            case ADS_CODE_4108:
+            case ADS_CODE_4109:
+            case ADS_CODE_4110:
+            case ADS_CODE_4111:
+            case ADS_CODE_4112:
+            case ADS_CODE_4119:
+            case ADS_CODE_4120:
+            case ADS_CODE_4121:
+            case ADS_CODE_4122:
+            case ADS_CODE_10060:
+            case ADS_CODE_10061:
+            case ADS_CODE_10065:
+                return ResponseCode.INTERNAL_ERROR;
+            case UNKNOWN:
+                return ResponseCode.INTERNAL_ERROR;
+        }
+        throw new IllegalStateException(result.toAdsReturnCode() + " not mapped");
     }
 
 }
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSPlcDriverTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSPlcDriverTest.java
index f62376a..c614885 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSPlcDriverTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/ADSPlcDriverTest.java
@@ -39,7 +39,6 @@ public class ADSPlcDriverTest {
     public void getConnection() throws Exception {
         ADSPlcConnection adsConnection = (ADSPlcConnection)
             new PlcDriverManager().getConnection("ads://localhost:" + tcpHexDumper.getPort() + "/0.0.0.0.0.0:13");
-        assertEquals(adsConnection.getHostName(), "localhost");
         assertEquals(adsConnection.getTargetAmsNetId().toString(), "0.0.0.0.0.0");
         assertEquals(adsConnection.getTargetAmsPort().toString(), "13");
         adsConnection.close();

-- 
To stop receiving notification emails like this one, please contact
sruehl@apache.org.