You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2021/08/30 11:34:33 UTC

[plc4x] branch s7event updated: Made the KNX driver interpret the "device name discovery-option"

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

cdutz pushed a commit to branch s7event
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/s7event by this push:
     new 4355963  Made the KNX driver interpret the "device name discovery-option"
4355963 is described below

commit 435596313cc8ae810f8ccbb2c01737980114f98f
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Mon Aug 30 04:34:25 2021 -0700

    Made the KNX driver interpret the "device name discovery-option"
---
 plc4go/internal/plc4go/knxnetip/Discoverer.go | 26 ++++++++++++++---
 plc4go/internal/plc4go/knxnetip/Driver.go     |  2 +-
 plc4go/pkg/plc4go/model/plc_discovery.go      | 40 +++++++++++++++++++++++----
 3 files changed, 58 insertions(+), 10 deletions(-)

diff --git a/plc4go/internal/plc4go/knxnetip/Discoverer.go b/plc4go/internal/plc4go/knxnetip/Discoverer.go
index 0e5d552..8e074f5 100644
--- a/plc4go/internal/plc4go/knxnetip/Discoverer.go
+++ b/plc4go/internal/plc4go/knxnetip/Discoverer.go
@@ -32,7 +32,7 @@ import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/transports"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/transports/udp"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
-	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
+	apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 )
 
 type Discoverer struct {
@@ -43,7 +43,7 @@ func NewDiscoverer() *Discoverer {
 	return &Discoverer{}
 }
 
-func (d *Discoverer) Discover(callback func(event model.PlcDiscoveryEvent)) error {
+func (d *Discoverer) Discover(callback func(event apiModel.PlcDiscoveryEvent), options ...apiModel.WithDiscoveryOption) error {
 	udpTransport := udp.NewTransport()
 
 	// Create a connection string for the KNX broadcast discovery address.
@@ -52,11 +52,29 @@ func (d *Discoverer) Discover(callback func(event model.PlcDiscoveryEvent)) erro
 		return err
 	}
 
-	interfaces, err := net.Interfaces()
+	allInterfaces, err := net.Interfaces()
 	if err != nil {
 		return err
 	}
 
+	// If no device is explicitly selected via option, simply use all of them
+	// However if a discovery option is present to select a device by name, only
+	// add those devices matching any of the given names.
+	var interfaces []net.Interface
+	deviceNames := apiModel.FilterDiscoveryOptionsDeviceName(options)
+	if len(deviceNames) > 0 {
+		for _, curInterface := range allInterfaces {
+			for _, deviceNameOption := range deviceNames {
+				if curInterface.Name == deviceNameOption.GetDeviceName() {
+					interfaces = append(interfaces, curInterface)
+					break
+				}
+			}
+		}
+	} else {
+		interfaces = allInterfaces
+	}
+
 	var tranportInstances []transports.TransportInstance
 	// Iterate over all network devices of this system.
 	for _, interf := range interfaces {
@@ -144,7 +162,7 @@ func (d *Discoverer) Discover(callback func(event model.PlcDiscoveryEvent)) erro
 								}
 								deviceName := string(bytes.Trim(utils.Int8ArrayToByteArray(
 									searchResponse.DibDeviceInfo.DeviceFriendlyName), "\x00"))
-								discoveryEvent := model.NewPlcDiscoveryEvent(
+								discoveryEvent := apiModel.NewPlcDiscoveryEvent(
 									"knxnet-ip", "udp", *remoteUrl, nil, deviceName)
 								// Pass the event back to the callback
 								callback(discoveryEvent)
diff --git a/plc4go/internal/plc4go/knxnetip/Driver.go b/plc4go/internal/plc4go/knxnetip/Driver.go
index 152265e..09c413a 100644
--- a/plc4go/internal/plc4go/knxnetip/Driver.go
+++ b/plc4go/internal/plc4go/knxnetip/Driver.go
@@ -89,5 +89,5 @@ func (m Driver) SupportsDiscovery() bool {
 }
 
 func (m Driver) Discover(callback func(event apiModel.PlcDiscoveryEvent), options ...apiModel.WithDiscoveryOption) error {
-	return NewDiscoverer().Discover(callback)
+	return NewDiscoverer().Discover(callback, options...)
 }
diff --git a/plc4go/pkg/plc4go/model/plc_discovery.go b/plc4go/pkg/plc4go/model/plc_discovery.go
index e39f1e2..98edb02 100644
--- a/plc4go/pkg/plc4go/model/plc_discovery.go
+++ b/plc4go/pkg/plc4go/model/plc_discovery.go
@@ -85,11 +85,17 @@ func (_ discoveryOption) IsDiscoveryOption() bool {
 }
 
 func FilterDiscoveryOptionsProtocol(options []WithDiscoveryOption) []DiscoveryOptionProtocol {
+	castFunc := func(typ interface{}) DiscoveryOptionProtocol {
+		if casted, ok := typ.(discoveryOptionProtocol); ok {
+			return &casted
+		}
+		return nil
+	}
 	var filtered []DiscoveryOptionProtocol
 	for _, option := range options {
 		switch option.(type) {
 		case discoveryOptionProtocol:
-			filtered = append(filtered, option.(DiscoveryOptionProtocol))
+			filtered = append(filtered, castFunc(option))
 		}
 	}
 	return filtered
@@ -109,11 +115,17 @@ func (d *discoveryOptionProtocol) GetProtocolName() string {
 }
 
 func FilterDiscoveryOptionsTransport(options []WithDiscoveryOption) []DiscoveryOptionTransport {
+	castFunc := func(typ interface{}) DiscoveryOptionTransport {
+		if casted, ok := typ.(discoveryOptionTransport); ok {
+			return &casted
+		}
+		return nil
+	}
 	var filtered []DiscoveryOptionTransport
 	for _, option := range options {
 		switch option.(type) {
 		case discoveryOptionTransport:
-			filtered = append(filtered, option.(DiscoveryOptionTransport))
+			filtered = append(filtered, castFunc(option))
 		}
 	}
 	return filtered
@@ -133,11 +145,17 @@ func (d *discoveryOptionTransport) GetTransportName() string {
 }
 
 func FilterDiscoveryOptionsDeviceName(options []WithDiscoveryOption) []DiscoveryOptionDeviceName {
+	castFunc := func(typ interface{}) DiscoveryOptionDeviceName {
+		if casted, ok := typ.(discoveryOptionDeviceName); ok {
+			return &casted
+		}
+		return nil
+	}
 	var filtered []DiscoveryOptionDeviceName
 	for _, option := range options {
 		switch option.(type) {
 		case discoveryOptionDeviceName:
-			filtered = append(filtered, option.(DiscoveryOptionDeviceName))
+			filtered = append(filtered, castFunc(option))
 		}
 	}
 	return filtered
@@ -157,11 +175,17 @@ func (d *discoveryOptionDeviceName) GetDeviceName() string {
 }
 
 func FilterDiscoveryOptionsLocalAddress(options []WithDiscoveryOption) []DiscoveryOptionLocalAddress {
+	castFunc := func(typ interface{}) DiscoveryOptionLocalAddress {
+		if casted, ok := typ.(discoveryOptionLocalAddress); ok {
+			return &casted
+		}
+		return nil
+	}
 	var filtered []DiscoveryOptionLocalAddress
 	for _, option := range options {
 		switch option.(type) {
 		case discoveryOptionLocalAddress:
-			filtered = append(filtered, option.(DiscoveryOptionLocalAddress))
+			filtered = append(filtered, castFunc(option))
 		}
 	}
 	return filtered
@@ -181,11 +205,17 @@ func (d *discoveryOptionLocalAddress) GetLocalAddress() string {
 }
 
 func FilterDiscoveryOptionsRemoteAddress(options []WithDiscoveryOption) []DiscoveryOptionRemoteAddress {
+	castFunc := func(typ interface{}) DiscoveryOptionRemoteAddress {
+		if casted, ok := typ.(discoveryOptionRemoteAddress); ok {
+			return &casted
+		}
+		return nil
+	}
 	var filtered []DiscoveryOptionRemoteAddress
 	for _, option := range options {
 		switch option.(type) {
 		case discoveryOptionRemoteAddress:
-			filtered = append(filtered, option.(DiscoveryOptionRemoteAddress))
+			filtered = append(filtered, castFunc(option))
 		}
 	}
 	return filtered