Skip to content

Commit

Permalink
feat: accept multiple nodeID formats via env
Browse files Browse the repository at this point in the history
Signed-off-by: WashingtonKK <washingtonkigan@gmail.com>
  • Loading branch information
WashingtonKK committed Mar 14, 2024
1 parent 75463c2 commit 436834b
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 8 deletions.
1 change: 1 addition & 0 deletions docker/.env
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions docker/addons/opcua-adapter/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
37 changes: 29 additions & 8 deletions opcua/adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"context"
"fmt"
"log/slog"
"strconv"

"github.com/absmach/magistrala/opcua/db"
)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 436834b

Please sign in to comment.