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:19:36 UTC
[incubator-plc4x] branch feature/Beckhoff_ADS_protocol updated: use
AbstractPlcConnection and improved implementation of it.
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 2a582d0 use AbstractPlcConnection and improved implementation of it.
2a582d0 is described below
commit 2a582d0304937230bdcb672866cde862b2a6733f
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Feb 16 09:19:32 2018 +0100
use AbstractPlcConnection and improved implementation of it.
---
plc4j/protocols/ads/pom.xml | 5 ++
.../java/ads/connection/ADSPlcConnection.java | 95 ++++++----------------
.../java/ads/connection/ADSPlcConnectionTests.java | 7 +-
.../base/connection/AbstractPlcConnection.java | 25 ++++--
.../plc4x/java/s7/connection/S7PlcConnection.java | 21 +++--
5 files changed, 60 insertions(+), 93 deletions(-)
diff --git a/plc4j/protocols/ads/pom.xml b/plc4j/protocols/ads/pom.xml
index cce37d3..3e1339f 100644
--- a/plc4j/protocols/ads/pom.xml
+++ b/plc4j/protocols/ads/pom.xml
@@ -41,6 +41,11 @@
</dependency>
<dependency>
<groupId>org.apache.plc4x</groupId>
+ <artifactId>plc4j-protocol-driver-base</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.plc4x</groupId>
<artifactId>plc4j-core</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>runtime</scope>
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 3e6c9ce..1d050d9 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
@@ -18,35 +18,30 @@ under the License.
*/
package org.apache.plc4x.java.ads.connection;
-import io.netty.bootstrap.Bootstrap;
-import io.netty.channel.*;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelPipeline;
import org.apache.plc4x.java.ads.api.generic.types.AMSNetId;
import org.apache.plc4x.java.ads.api.generic.types.AMSPort;
import org.apache.plc4x.java.ads.model.ADSAddress;
import org.apache.plc4x.java.ads.netty.ADSProtocol;
import org.apache.plc4x.java.ads.netty.Plc4XADSProtocol;
-import org.apache.plc4x.java.api.connection.AbstractPlcConnection;
import org.apache.plc4x.java.api.connection.PlcReader;
import org.apache.plc4x.java.api.connection.PlcWriter;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
import org.apache.plc4x.java.api.exceptions.PlcException;
import org.apache.plc4x.java.api.messages.*;
import org.apache.plc4x.java.api.model.Address;
+import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory;
import java.net.InetAddress;
-import java.net.UnknownHostException;
import java.util.concurrent.CompletableFuture;
public class ADSPlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter {
public static final int TCP_PORT = 48898;
- private final String hostName;
-
- private final Integer suppliedPort;
-
private final AMSNetId targetAmsNetId;
private final AMSPort targetAmsPort;
@@ -55,35 +50,25 @@ public class ADSPlcConnection extends AbstractPlcConnection implements PlcReader
private final AMSPort sourceAmsPort;
- private EventLoopGroup workerGroup;
- private Channel channel;
- private boolean connected;
-
- public ADSPlcConnection(String hostName, AMSNetId targetAmsNetId, AMSPort targetAmsPort) {
- this(hostName, targetAmsNetId, targetAmsPort, generateAMSNetId(), generateAMSPort());
+ public ADSPlcConnection(InetAddress address, AMSNetId targetAmsNetId, AMSPort targetAmsPort) {
+ this(address, targetAmsNetId, targetAmsPort, generateAMSNetId(), generateAMSPort());
}
- public ADSPlcConnection(String hostName, Integer port, AMSNetId targetAmsNetId, AMSPort targetAmsPort) {
- this(hostName, port, targetAmsNetId, targetAmsPort, generateAMSNetId(), generateAMSPort());
+ public ADSPlcConnection(InetAddress address, Integer port, AMSNetId targetAmsNetId, AMSPort targetAmsPort) {
+ this(address, port, targetAmsNetId, targetAmsPort, generateAMSNetId(), generateAMSPort());
}
- public ADSPlcConnection(String hostName, AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort) {
- this(hostName, null, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort);
+ public ADSPlcConnection(InetAddress address, AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort) {
+ this(address, null, targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort);
}
- public ADSPlcConnection(String hostName, Integer port, AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort) {
- this.hostName = hostName;
- this.suppliedPort = port;
+ public ADSPlcConnection(InetAddress address, Integer port, AMSNetId targetAmsNetId, AMSPort targetAmsPort, AMSNetId sourceAmsNetId, AMSPort sourceAmsPort) {
+ super(new TcpSocketChannelFactory(address, port));
this.targetAmsNetId = targetAmsNetId;
this.targetAmsPort = targetAmsPort;
this.sourceAmsNetId = sourceAmsNetId;
this.sourceAmsPort = sourceAmsPort;
- connected = false;
- }
-
- public String getHostName() {
- return hostName;
}
public AMSNetId getTargetAmsNetId() {
@@ -103,48 +88,16 @@ public class ADSPlcConnection extends AbstractPlcConnection implements PlcReader
}
@Override
- public void connect() throws PlcConnectionException {
- workerGroup = new NioEventLoopGroup();
-
- try {
- InetAddress serverInetAddress = InetAddress.getByName(hostName);
-
- Bootstrap bootstrap = new Bootstrap();
- bootstrap.group(workerGroup);
- bootstrap.channel(NioSocketChannel.class);
- bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
- bootstrap.option(ChannelOption.TCP_NODELAY, true);
- bootstrap.handler(new ChannelInitializer() {
- @Override
- protected void initChannel(Channel channel) throws Exception {
- // Build the protocol stack for communicating with the ads protocol.
- ChannelPipeline pipeline = channel.pipeline();
- pipeline.addLast(new Plc4XADSProtocol(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort));
- pipeline.addLast(new ADSProtocol());
- }
- });
- // Start the client.
- ChannelFuture f = bootstrap.connect(serverInetAddress, suppliedPort != null ? suppliedPort : TCP_PORT).sync();
- f.awaitUninterruptibly();
- // Wait till the session is finished initializing.
- channel = f.channel();
- connected = true;
- } catch (UnknownHostException e) {
- throw new PlcConnectionException("Unknown Host " + hostName, e);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- throw new PlcConnectionException(e);
- }
- }
-
- @Override
- public boolean isConnected() {
- return connected;
- }
-
- @Override
- public void close() throws Exception {
- workerGroup.shutdownGracefully();
+ protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) {
+ return new ChannelInitializer() {
+ @Override
+ protected void initChannel(Channel channel) {
+ // Build the protocol stack for communicating with the ads protocol.
+ ChannelPipeline pipeline = channel.pipeline();
+ pipeline.addLast(new Plc4XADSProtocol(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort));
+ pipeline.addLast(new ADSProtocol());
+ }
+ };
}
@Override
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/ADSPlcConnectionTests.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/ADSPlcConnectionTests.java
index 5045643..c29008b 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/ADSPlcConnectionTests.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/ADSPlcConnectionTests.java
@@ -26,6 +26,8 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import java.net.InetAddress;
+
import static org.junit.Assert.*;
public class ADSPlcConnectionTests {
@@ -33,8 +35,8 @@ public class ADSPlcConnectionTests {
private ADSPlcConnection adsPlcConnection;
@Before
- public void setUp() {
- adsPlcConnection = new ADSPlcConnection("localhost", AMSNetId.of("0.0.0.0.0.0"), AMSPort.of(13));
+ public void setUp() throws Exception {
+ adsPlcConnection = new ADSPlcConnection(InetAddress.getByName("localhost"), AMSNetId.of("0.0.0.0.0.0"), AMSPort.of(13));
}
@After
@@ -44,7 +46,6 @@ public class ADSPlcConnectionTests {
@Test
public void initialState() {
- assertTrue("Hostname is incorrect", adsPlcConnection.getHostName().equalsIgnoreCase("localhost"));
assertEquals(adsPlcConnection.getTargetAmsNetId().toString(), "0.0.0.0.0.0");
assertEquals(adsPlcConnection.getTargetAmsPort().toString(), "13");
}
diff --git a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java b/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
index 1545802..fa8adfa 100644
--- a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
+++ b/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
@@ -32,15 +32,22 @@ import java.util.concurrent.ExecutionException;
public abstract class AbstractPlcConnection implements PlcConnection {
- private final ChannelFactory channelFactory;
- private Channel channel;
- private boolean connected;
+ protected final ChannelFactory channelFactory;
+ protected final boolean awaitSessionSetupComplete;
+ protected Channel channel;
+ protected boolean connected;
- public AbstractPlcConnection(ChannelFactory channelFactory) {
+ protected AbstractPlcConnection(ChannelFactory channelFactory) {
+ this(channelFactory, false);
+ }
+
+ protected AbstractPlcConnection(ChannelFactory channelFactory, boolean awaitSessionSetupComplete) {
this.channelFactory = channelFactory;
+ this.awaitSessionSetupComplete = awaitSessionSetupComplete;
this.connected = false;
}
+
@Override
public void connect() throws PlcConnectionException {
try {
@@ -56,7 +63,9 @@ public abstract class AbstractPlcConnection implements PlcConnection {
sendChannelCreatedEvent();
// Wait till the connection is established.
- sessionSetupCompleteFuture.get();
+ if (awaitSessionSetupComplete) {
+ sessionSetupCompleteFuture.get();
+ }
// Set the connection to "connected"
connected = true;
@@ -91,7 +100,7 @@ public abstract class AbstractPlcConnection implements PlcConnection {
@Override
public Optional<PlcLister> getLister() {
- if(this instanceof PlcLister) {
+ if (this instanceof PlcLister) {
return Optional.of((PlcLister) this);
}
return Optional.empty();
@@ -99,7 +108,7 @@ public abstract class AbstractPlcConnection implements PlcConnection {
@Override
public Optional<PlcReader> getReader() {
- if(this instanceof PlcReader) {
+ if (this instanceof PlcReader) {
return Optional.of((PlcReader) this);
}
return Optional.empty();
@@ -107,7 +116,7 @@ public abstract class AbstractPlcConnection implements PlcConnection {
@Override
public Optional<PlcWriter> getWriter() {
- if(this instanceof PlcWriter) {
+ if (this instanceof PlcWriter) {
return Optional.of((PlcWriter) this);
}
return Optional.empty();
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
index b63e3ad..6581abf 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
@@ -73,12 +73,12 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
this(new TcpSocketChannelFactory(address, ISO_ON_TCP_PORT), rack, slot, params);
logger.info("Configured S7cConnection with: host-name {}, rack {}, slot {}, pdu-size {}, max-amq-caller {}, " +
- "max-amq-callee {}", address.getHostAddress(), rack, slot,
+ "max-amq-callee {}", address.getHostAddress(), rack, slot,
paramPduSize, paramMaxAmqCaller, paramMaxAmqCallee);
}
public S7PlcConnection(ChannelFactory channelFactory, int rack, int slot, String params) {
- super(channelFactory);
+ super(channelFactory, true);
this.rack = rack;
this.slot = slot;
@@ -87,11 +87,11 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
short paramMaxAmqCaller = 8;
short paramMaxAmqCallee = 8;
- if(!StringUtils.isEmpty(params)) {
+ if (!StringUtils.isEmpty(params)) {
for (String param : params.split("&")) {
String[] paramElements = param.split("=");
String paramName = paramElements[0];
- if(paramElements.length == 2) {
+ if (paramElements.length == 2) {
String paramValue = paramElements[1];
switch (paramName) {
case "pdu-size":
@@ -129,7 +129,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
pipeline.addLast(new ChannelInboundHandlerAdapter() {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
- if(evt instanceof S7ConnectionEvent &&
+ if (evt instanceof S7ConnectionEvent &&
((S7ConnectionEvent) evt).getState() == S7ConnectionState.SETUP_COMPLETE) {
sessionSetupCompleteFuture.complete(null);
} else {
@@ -148,7 +148,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
@Override
protected void sendChannelCreatedEvent() {
// Send an event to the pipeline telling the Protocol filters what's going on.
- getChannel().pipeline().fireUserEventTriggered(new S7ConnectionEvent());
+ channel.pipeline().fireUserEventTriggered(new S7ConnectionEvent());
}
public int getRack() {
@@ -173,8 +173,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
@Override
public void close() {
- Channel channel = getChannel();
- if((channel != null) && channel.isOpen()) {
+ if ((channel != null) && channel.isOpen()) {
// Send the PLC a message that the connection is being closed.
DisconnectRequestTpdu disconnectRequest = new DisconnectRequestTpdu(
(short) 0x0000, (short) 0x000F, DisconnectReason.NORMAL, Collections.emptyList(),
@@ -206,7 +205,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
}
MemoryArea memoryArea = MemoryArea.valueOf(addressMatcher.group("memoryArea"));
int byteOffset = Integer.parseInt(addressMatcher.group("byteOffset"));
- String bitOffset = addressMatcher.group("bitOffset");
+ String bitOffset = addressMatcher.group("bitOffset");
if (bitOffset != null) {
return new S7BitAddress(memoryArea, (short) byteOffset, Byte.valueOf(bitOffset));
}
@@ -218,7 +217,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
CompletableFuture<PlcReadResponse> readFuture = new CompletableFuture<>();
PlcRequestContainer<PlcReadRequest, PlcReadResponse> container =
new PlcRequestContainer<>(readRequest, readFuture);
- getChannel().writeAndFlush(container);
+ channel.writeAndFlush(container);
return readFuture;
}
@@ -227,7 +226,7 @@ public class S7PlcConnection extends AbstractPlcConnection implements PlcReader,
CompletableFuture<PlcWriteResponse> writeFuture = new CompletableFuture<>();
PlcRequestContainer<PlcWriteRequest, PlcWriteResponse> container =
new PlcRequestContainer<>(writeRequest, writeFuture);
- getChannel().writeAndFlush(container);
+ channel.writeAndFlush(container);
return writeFuture;
}
--
To stop receiving notification emails like this one, please contact
sruehl@apache.org.