You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by ld...@apache.org on 2020/05/11 11:29:13 UTC
[plc4x] branch feature/profinet updated: Make ethernet sender field
configurable.
This is an automated email from the ASF dual-hosted git repository.
ldywicki pushed a commit to branch feature/profinet
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/feature/profinet by this push:
new 64985bd Make ethernet sender field configurable.
64985bd is described below
commit 64985bd4b9fa4f4d99f05fe9df8a4c41218561ff
Author: Ćukasz Dywicki <lu...@code-house.org>
AuthorDate: Mon May 11 13:28:33 2020 +0200
Make ethernet sender field configurable.
It should be read from interface name, but for now its fine.
---
sandbox/test-java-profinet-driver/pom.xml | 5 +++
.../java/profinet/dcp/ProfinetDCPPlcDriver.java | 2 +-
.../dcp/configuration/ProfinetConfiguration.java | 40 ++++++++++++++++++++++
.../dcp/protocol/ProfinetDCPProtocolLogic.java | 15 ++++++--
4 files changed, 58 insertions(+), 4 deletions(-)
diff --git a/sandbox/test-java-profinet-driver/pom.xml b/sandbox/test-java-profinet-driver/pom.xml
index ff10fcc..af07ecb 100644
--- a/sandbox/test-java-profinet-driver/pom.xml
+++ b/sandbox/test-java-profinet-driver/pom.xml
@@ -108,6 +108,11 @@
<version>1.0.2.RELEASE</version>
</dependency>
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ </dependency>
+
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
diff --git a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/ProfinetDCPPlcDriver.java b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/ProfinetDCPPlcDriver.java
index 1c611ed..b3d77b4 100644
--- a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/ProfinetDCPPlcDriver.java
+++ b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/ProfinetDCPPlcDriver.java
@@ -96,7 +96,7 @@ public class ProfinetDCPPlcDriver extends GeneratedDriverBase<EthernetFrame> {
public static void main(String[] args) throws Exception {
- PlcConnection connection = new PlcDriverManager().getConnection("profinet-dcp:raw://ens2f1");
+ PlcConnection connection = new PlcDriverManager().getConnection("profinet-dcp:raw://ens2f1?sender=00:10:18:6c:4c:e2");
//connection.connect();
}
diff --git a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/configuration/ProfinetConfiguration.java b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/configuration/ProfinetConfiguration.java
index c9c87c7..2b7ed59 100644
--- a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/configuration/ProfinetConfiguration.java
+++ b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/configuration/ProfinetConfiguration.java
@@ -18,13 +18,33 @@
*/
package org.apache.plc4x.java.profinet.dcp.configuration;
+import java.util.stream.Stream;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.plc4x.java.profinet.dcp.readwrite.MacAddress;
import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.ConfigurationParameterConverter;
+import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
+import org.apache.plc4x.java.spi.configuration.annotations.ParameterConverter;
+import org.apache.plc4x.java.spi.configuration.annotations.Required;
import org.apache.plc4x.java.transport.rawsocket.RawSocketTransportConfiguration;
import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
import org.pcap4j.packet.Packet;
public class ProfinetConfiguration implements Configuration, RawSocketTransportConfiguration {
+ @Required
+ @ConfigurationParameter
+ @ParameterConverter(MacAddressConverter.class)
+ protected MacAddress sender;
+
+ public void setSender(MacAddress sender) {
+ this.sender = sender;
+ }
+
+ public MacAddress getSender() {
+ return sender;
+ }
+
@Override
public boolean getSupportVlans() {
return false;
@@ -50,4 +70,24 @@ public class ProfinetConfiguration implements Configuration, RawSocketTransportC
}
};
}
+
+ public static class MacAddressConverter implements ConfigurationParameterConverter<MacAddress> {
+ @Override
+ public Class<MacAddress> getType() {
+ return MacAddress.class;
+ }
+
+ @Override
+ public MacAddress convert(String value) {
+ String[] split = value.split(":");
+ short[] segments = ArrayUtils.toPrimitive(Stream.of(split).map(segment -> Integer.parseInt(segment, 16))
+ .map(Integer::shortValue).toArray(Short[]::new));
+
+ if (segments.length != 6) {
+ throw new IllegalArgumentException("Value " + value + " is not valid MAC address");
+ }
+
+ return new MacAddress(segments[0], segments[1], segments[2], segments[3], segments[4], segments[5]);
+ }
+ }
}
diff --git a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/protocol/ProfinetDCPProtocolLogic.java b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/protocol/ProfinetDCPProtocolLogic.java
index dd170ce..e4921f2 100644
--- a/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/protocol/ProfinetDCPProtocolLogic.java
+++ b/sandbox/test-java-profinet-driver/src/main/java/org/apache/plc4x/java/profinet/dcp/protocol/ProfinetDCPProtocolLogic.java
@@ -20,6 +20,7 @@ package org.apache.plc4x.java.profinet.dcp.protocol;
import java.time.Duration;
import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.plc4x.java.profinet.dcp.configuration.ProfinetConfiguration;
import org.apache.plc4x.java.profinet.dcp.readwrite.AllSelector;
import org.apache.plc4x.java.profinet.dcp.readwrite.DCPBlock;
import org.apache.plc4x.java.profinet.dcp.readwrite.DcpIdentRequestPDU;
@@ -36,22 +37,29 @@ import org.apache.plc4x.java.profinet.dcp.readwrite.types.DCPServiceType;
import org.apache.plc4x.java.profinet.dcp.readwrite.types.FrameType;
import org.apache.plc4x.java.spi.ConversationContext;
import org.apache.plc4x.java.spi.Plc4xProtocolBase;
+import org.apache.plc4x.java.spi.configuration.HasConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Driver logic for handling Profinet-DCP packets.
*/
-public class ProfinetDCPProtocolLogic extends Plc4xProtocolBase<EthernetFrame> {
+public class ProfinetDCPProtocolLogic extends Plc4xProtocolBase<EthernetFrame> implements
+ HasConfiguration<ProfinetConfiguration> {
public static MacAddress PROFINET_BROADCAST = createAddress(0x01, 0x0E, 0xCF, 0x00, 0x00, 0x00);
- public static MacAddress TEST_ADDRESS = createAddress(0x08, 0x00, 0x27, 0x10, 0xFF, 0x10);
public static int PN_DCP = 0x8892;
public static final Duration REQUEST_TIMEOUT = Duration.ofMillis(10000);
private final Logger logger = LoggerFactory.getLogger(ProfinetDCPProtocolLogic.class);
private AtomicInteger invokeId = new AtomicInteger(0);
+ private ProfinetConfiguration configuration;
+
+ @Override
+ public void setConfiguration(ProfinetConfiguration configuration) {
+ this.configuration = configuration;
+ }
@Override
public void onConnect(ConversationContext<EthernetFrame> context) {
@@ -63,7 +71,7 @@ public class ProfinetDCPProtocolLogic extends Plc4xProtocolBase<EthernetFrame> {
int dcpDataLength = blocks[0].getLengthInBytes();
DcpIdentRequestPDU requestPDU = new DcpIdentRequestPDU(serviceId, serviceType, xid, responseDelay, dcpDataLength, blocks);
- EthernetFrame ethernetFrame = new EthernetFrame(PROFINET_BROADCAST, TEST_ADDRESS, PN_DCP,
+ EthernetFrame ethernetFrame = new EthernetFrame(PROFINET_BROADCAST, configuration.getSender(), PN_DCP,
new ProfinetFrame(FrameType.IDENTIFY_MULTICAST_REQUEST, requestPDU));
// this is broadcast thus reply might come from multiple participants
@@ -117,4 +125,5 @@ public class ProfinetDCPProtocolLogic extends Plc4xProtocolBase<EthernetFrame> {
public final static MacAddress createAddress(int octet1, int octet2, int octet3, int octet4, int octet5, int octet6) {
return new MacAddress((short) octet1, (short) octet2, (short) octet3, (short) octet4, (short) octet5, (short) octet6);
}
+
}