From 436834b94c1f9bf422a26ab0031d5b2ed041daf7 Mon Sep 17 00:00:00 2001 From: WashingtonKK Date: Thu, 14 Mar 2024 19:05:04 +0300 Subject: [PATCH] feat: accept multiple nodeID formats via env Signed-off-by: WashingtonKK --- docker/.env | 1 + .../addons/opcua-adapter/docker-compose.yml | 1 + opcua/adapter.go | 37 +++++++++++++++---- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/docker/.env b/docker/.env index 2161902502c..19958d24598 100644 --- a/docker/.env +++ b/docker/.env @@ -413,6 +413,7 @@ MG_OPCUA_ADAPTER_HTTP_SERVER_CERT= MG_OPCUA_ADAPTER_HTTP_SERVER_KEY= MG_OPCUA_ADAPTER_ROUTE_MAP_URL=redis://opcua-redis:${MG_REDIS_TCP_PORT}/0 MG_OPCUA_ADAPTER_INSTANCE_ID= +MG_OPCUA_ADAPTER_NODE_ID_FORMAT=string ### Cassandra MG_CASSANDRA_CLUSTER=magistrala-cassandra diff --git a/docker/addons/opcua-adapter/docker-compose.yml b/docker/addons/opcua-adapter/docker-compose.yml index a2088c8c25f..02c1abdc2bb 100644 --- a/docker/addons/opcua-adapter/docker-compose.yml +++ b/docker/addons/opcua-adapter/docker-compose.yml @@ -43,6 +43,7 @@ services: MG_JAEGER_TRACE_RATIO: ${MG_JAEGER_TRACE_RATIO} MG_SEND_TELEMETRY: ${MG_SEND_TELEMETRY} MG_OPCUA_ADAPTER_INSTANCE_ID: ${MG_OPCUA_ADAPTER_INSTANCE_ID} + MG_OPCUA_ADAPTER_NODE_ID_FORMAT: ${MG_OPCUA_ADAPTER_NODE_ID_FORMAT} ports: - ${MG_OPCUA_ADAPTER_HTTP_PORT}:${MG_OPCUA_ADAPTER_HTTP_PORT} networks: diff --git a/opcua/adapter.go b/opcua/adapter.go index 53e205e1f49..10ad62cd063 100644 --- a/opcua/adapter.go +++ b/opcua/adapter.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "log/slog" + "strconv" "github.com/absmach/magistrala/opcua/db" ) @@ -44,13 +45,14 @@ type Service interface { // Config OPC-UA Server. type Config struct { - ServerURI string - NodeID string - Interval string `env:"MG_OPCUA_ADAPTER_INTERVAL_MS" envDefault:"1000"` - Policy string `env:"MG_OPCUA_ADAPTER_POLICY" envDefault:""` - Mode string `env:"MG_OPCUA_ADAPTER_MODE" envDefault:""` - CertFile string `env:"MG_OPCUA_ADAPTER_CERT_FILE" envDefault:""` - KeyFile string `env:"MG_OPCUA_ADAPTER_KEY_FILE" envDefault:""` + ServerURI string + NodeID string + Interval string `env:"MG_OPCUA_ADAPTER_INTERVAL_MS" envDefault:"1000"` + Policy string `env:"MG_OPCUA_ADAPTER_POLICY" envDefault:""` + Mode string `env:"MG_OPCUA_ADAPTER_MODE" envDefault:""` + CertFile string `env:"MG_OPCUA_ADAPTER_CERT_FILE" envDefault:""` + KeyFile string `env:"MG_OPCUA_ADAPTER_KEY_FILE" envDefault:""` + NodeIDFormat string `env:"MG_OPCUA_ADAPTER_NODE_ID_FORMAT" envDefault:"string"` } var _ Service = (*adapterService)(nil) @@ -132,7 +134,26 @@ func (as *adapterService) ConnectThing(ctx context.Context, chanID, thingID stri } func (as *adapterService) Browse(ctx context.Context, serverURI, namespace, identifier string) ([]BrowsedNode, error) { - nodeID := fmt.Sprintf("ns=%s;s=%s", namespace, identifier) + var nodeID string + + switch as.cfg.NodeIDFormat { + case "string": + nodeID = fmt.Sprintf("ns=%s;s=%s", namespace, identifier) + case "numeric": + numericIdentifier, err := strconv.Atoi(identifier) // Convert identifier to int + if err != nil { + nodeID = fmt.Sprintf("ns=%s;s=%s", namespace, identifier) + as.logger.Warn(fmt.Sprintf("failed to parse numeric nodeID format: %s, defaulting to string", err)) + break + } + nodeID = fmt.Sprintf("ns=%s;i=%d", namespace, numericIdentifier) + case "guid": + nodeID = fmt.Sprintf("ns=%s;g=%s", namespace, identifier) + case "opaque": + nodeID = fmt.Sprintf("ns=%s;b=%s", namespace, identifier) + default: + nodeID = fmt.Sprintf("ns=%s;s=%s", namespace, identifier) + } nodes, err := as.browser.Browse(serverURI, nodeID) if err != nil {