Dela via


Självstudie: Lägga till OPC UA-tillgångar i ditt Azure IoT Operations-kluster

I den här självstudien lägger du till OPC UA-tillgångar manuellt i ditt Azure IoT Operations-kluster. Dessa tillgångar publicerar meddelanden till MQTT-koordinatorn i ditt Azure IoT Operations-kluster. Vanligtvis slutför en OT-användare de här stegen.

En tillgång är en fysisk enhet eller logisk entitet som representerar en enhet, en dator, ett system eller en process. En fysisk tillgång kan till exempel vara en pump, en motor, en tank eller en produktionslinje. En logisk tillgång som du definierar kan ha egenskaper, strömma telemetri eller generera händelser.

OPC UA-servrar är program som kommunicerar med tillgångar. OPC UA-taggar är datapunkter som OPC UA-servrar exponerar. OPC UA-taggar kan tillhandahålla realtidsdata eller historiska data om tillgångars status, prestanda, kvalitet eller villkor.

I den här självstudien använder du webbgränssnittet för driftupplevelse för att skapa dina tillgångar. Du kan också använda Azure CLI för att slutföra några av dessa uppgifter.

Förutsättningar

En instans av Azure IoT Operations som distribueras i ett Kubernetes-kluster. Om du vill skapa en instans använder du något av följande för att distribuera Azure IoT Operations:

För att logga in på webbgränssnittet för driftsupplevelsen behöver du ett Microsoft Entra-ID-konto med minst deltagarbehörighet för resursgruppen som innehåller din Kubernetes – Azure Arc-instans . Mer information finns i Webbgränssnitt för driftsupplevelse.

Om inget annat anges kan du köra konsolkommandona i den här självstudien i antingen en Bash- eller PowerShell-miljö.

Vilket problem kommer vi att lösa?

De data som OPC UA-servrar exponerar kan ha en komplex struktur och kan vara svåra att förstå. Med Azure IoT Operations kan du modellera OPC UA-tillgångar som taggar, händelser och egenskaper. Den här modelleringen gör det enklare att förstå data och använda dem i underordnade processer som MQTT-asynkron meddelandekö och dataflöden.

Distribuera OPC PLC-simulatorn

I den här självstudien används OPC PLC-simulatorn för att generera exempeldata. Kör följande kommando för att distribuera OPC PLC-simulatorn:

kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/opc-plc-deployment.yaml

Följande kodfragment visar YAML-filen som du använde:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: opc-plc-000000
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/component: opcplc-000000
  template:
    metadata:
      labels:
        app.kubernetes.io/component: opcplc-000000
    spec:
      containers:
      - name: opc-plc
        image: mcr.microsoft.com/iotedge/opc-plc:latest
        args:
          - "--ph=opcplc-000000"
          - "--cdn=opcplc-000000"
          - "--ut"
          - "--sn=25"
          - "--sr=10"
          - "--fn=2000"
          - "--veryfastrate=1000"
          - "--gn=5"
          - "--pn=50000"
          - "--maxsessioncount=100"
          - "--maxsubscriptioncount=100"
          - "--maxqueuedrequestcount=2000"
          - "--ses"
          - "--alm"
          - "--at=FlatDirectory"
          - "--drurs"
          - "--ll-debug"
          - "--nodesfile"
          - "/app/config/nodesfile.json"
        ports:
        - containerPort: 50000
        volumeMounts:
          - name: opc-plc-default-application-cert
            mountPath: /app/pki/own
          - name: opc-plc-trust-list
            mountPath: /app/pki/trusted
          - name: config-volume
            mountPath: /app/config
      volumes:
        - name: opc-plc-default-application-cert
          secret:
            secretName: opc-plc-default-application-cert
        - name: opc-plc-trust-list
          secret:
            secretName: opc-plc-trust-list
        - name: config-volume
          configMap:
            name: opc-plc-config
      serviceAccountName: opcplc-000000-service-account
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: opc-plc-config
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
data:
  nodesfile.json: |
    {
      "Folder": "MyTelemetry",
      "NodeList": [
        {
          "NodeId": "ns=3;s=FastUInt100",
          "Name": "Fryer Temperature",
          "DataType": "Double",
          "ValueRank": -1,
          "AccessLevel": "CurrentReadOrWrite",
          "Description": "Fryer Temperature with spikes",
          "Anomaly": "Spike",
          "MinValue": 150.0,
          "MaxValue": 200.0          
        }
      ]
    }
---
apiVersion: v1
kind: Service
metadata:
  name: opcplc-000000
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  type: ClusterIP
  selector:
    app.kubernetes.io/component: opcplc-000000
  ports:
    - port: 50000
      protocol: TCP
      targetPort: 50000
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: opc-plc-self-signed-issuer
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: opc-plc-default-application-cert
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  secretName: opc-plc-default-application-cert
  duration: 2160h # 90d
  renewBefore: 360h # 15d
  issuerRef:
    name: opc-plc-self-signed-issuer
    kind: Issuer
  commonName: OpcPlc
  dnsNames:
    - opcplc-000000
    - opcplc-000000.azure-iot-operations.svc.cluster.local
    - opcplc-000000.azure-iot-operations
  uris:
    - urn:OpcPlc:opcplc-000000
  usages:
    - digital signature
    - key encipherment
    - data encipherment
    - server auth
    - client auth
  privateKey:
    algorithm: RSA
    size: 2048
  encodeUsagesInRequest: true
  isCA: false
---
apiVersion: v1
kind: Secret
metadata:
  name: opc-plc-trust-list
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
data: {}
---
apiVersion: batch/v1
kind: Job
metadata:
  name: opcplc-000000-execute-mutual-trust
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
spec:
  backoffLimit: 1
  template:
    spec:
      containers:
      - name: kubectl
        image: mcr.microsoft.com/oss/kubernetes/kubectl:v1.27.1
        imagePullPolicy: Always
        command: ["/bin/sh"]
        args: ["/scripts/execute-commands.sh"]
        volumeMounts:
        - name: scripts
          mountPath: /scripts
          readOnly: true
      restartPolicy: Never
      serviceAccountName: opcplc-000000-service-account
      volumes:
      - name: scripts
        configMap:
          name: opcplc-000000-execute-commands-script
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: opcplc-000000-execute-commands-script
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
data:
  execute-commands.sh: |
    #!/bin/sh

    # wait 20 seconds for the resources to be created
    sleep 20

    # Extract the OPC UA connector application instance certificate and add it to the OPC PLC trust list
    cert=$(kubectl -n azure-iot-operations get secret aio-opc-opcuabroker-default-application-cert -o jsonpath='{.data.tls\.crt}' | base64 -d)
    data=$(kubectl create secret generic temp --from-literal=opcuabroker.crt="$cert" --dry-run=client -o jsonpath='{.data}')
    kubectl patch secret opc-plc-trust-list -n azure-iot-operations -p "{\"data\": $data}"

    # Extract the OPC PLC application instance certificate and add it to the OPC UA connector trust list
    cert=$(kubectl -n azure-iot-operations get secret opc-plc-default-application-cert -o jsonpath='{.data.tls\.crt}' | base64 -d)
    data=$(kubectl create secret generic temp --from-literal=opcplc-000000.crt="$cert" --dry-run=client -o jsonpath='{.data}')
    kubectl patch secret aio-opc-ua-broker-trust-list -n azure-iot-operations -p "{\"data\": $data}"
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: opcplc-000000-service-account
  namespace: azure-iot-operations
  labels:
    app.kubernetes.io/component: opcplc-000000
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: opc-plc-000000-secret-access-role
  namespace: azure-iot-operations
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: opc-plc-000000-secret-access-rolebinding
  namespace: azure-iot-operations
subjects:
- kind: ServiceAccount
  name: opcplc-000000-service-account
  namespace: azure-iot-operations
roleRef:
  kind: Role
  name: opc-plc-000000-secret-access-role
  apiGroup: rbac.authorization.k8s.io

Varning

Den här konfigurationen är inte säker. Använd inte den här konfigurationen i en produktionsmiljö.

Logga in på driftupplevelsen

Om du vill skapa tillgångsslutpunkter, tillgångar och prenumerera på OPC UA-taggar och händelser använder du driftupplevelsen.

Bläddra till driftupplevelsen i webbläsaren och logga in med dina Microsoft Entra-ID-autentiseringsuppgifter.

Välj din webbplats

En webbplats är en samling Azure IoT Operations-instanser. Webbplatser grupperar vanligtvis instanser efter fysisk plats och gör det enklare för OT-användare att hitta och hantera tillgångar. IT-administratören skapar webbplatser och tilldelar Azure IoT Operations-instanser till dem. Eftersom du arbetar med en ny distribution finns det inga platser ännu. Du hittar klustret som du skapade tidigare genom att välja Visa otilldelade instanser. I driftmiljön representerar en instans ett kluster där du distribuerade Azure IoT Operations.

Skärmbild som visar noden otilldelade instanser i driftupplevelsen.

Välj din instans

Välj den instans där du distribuerade Azure IoT Operations i föregående självstudie:

Skärmbild av instanslistan för Azure IoT Operations.

Dricks

Om du inte ser några instanser kanske du inte har rätt Microsoft Entra-ID-klientorganisation. Du kan ändra klientorganisationen från den övre högra menyn i driftupplevelsen.

Lägga till en tillgångsslutpunkt

När du distribuerade Azure IoT Operations i föregående artikel inkluderade du en inbyggd OPC PLC-simulator. I det här steget lägger du till en tillgångsslutpunkt som gör att du kan ansluta till OPC PLC-simulatorn.

Så här lägger du till en tillgångsslutpunkt:

  1. Välj Tillgångsslutpunkter och sedan Skapa tillgångsslutpunkt:

    Skärmbild som visar sidan tillgångsslutpunkter i driftupplevelsen.

  2. Ange följande slutpunktsinformation:

    Fält Värde
    Tillgångsslutpunktsnamn opc-ua-connector-0
    OPC UA-server-URL opc.tcp://opcplc-000000:50000
    Användarautentiseringsläge Anonymous
  3. Spara definitionen genom att välja Skapa.

    Den här konfigurationen distribuerar en ny tillgångsslutpunkt som anropas opc-ua-connector-0 till klustret. Du kan använda kubectl för att visa tillgångsslutpunkterna:

    kubectl get assetendpointprofile -n azure-iot-operations
    

Hantera dina tillgångar

När du har valt din instans i driftmiljön visas den tillgängliga listan över tillgångar på sidan Tillgångar . Om det inte finns några tillgångar ännu är listan tom:

Skärmbild av tom tillgångslista för Azure IoT Operations.

Skapa en tillgång

Om du vill skapa en tillgång väljer du Skapa tillgång. Ange sedan följande tillgångsinformation:

Fält Värde
Tillgångsslutpunkt opc-ua-connector-0
Tillgångsnamn thermostat
beskrivning A simulated thermostat asset
MQTT-standardämne azure-iot-operations/data/thermostat

Ta bort de befintliga anpassade egenskaperna och lägg till följande anpassade egenskaper. Var noga med att använda de exakta egenskapsnamnen, eftersom Power BI-mallen i en senare självstudie frågar efter dem:

Egenskapsnamn Egenskapsinformation
batch 102
Kund Contoso
utrustning Panna
isSpare true
plats Seattle

Skärmbild av sidan med information om Azure IoT Operations-tillgångar.

Välj Nästa för att gå till sidan Lägg till taggar .

Skapa OPC UA-taggar

Lägg till två OPC UA-taggar på sidan Lägg till taggar . Om du vill lägga till varje tagg väljer du Lägg till tagg eller CSV och väljer sedan Lägg till tagg. Ange tagginformationen som visas i följande tabell:

Nod-ID Taggnamn Observerbarhetsläge
ns=3; s=FastUInt10 temperatur Ingen
ns=3; s=FastUInt100 Tagg 10 Ingen

Observerbarhetsläget är ett av följande värden: None, Gauge, Counter, , Histogrameller Log.

Du kan välja Hantera standardinställningar för att ändra standardsamplingsintervallet och köstorleken för varje tagg.

Skärmbild av sidan Lägg till tagg i Azure IoT Operations.

Välj Nästa för att gå till sidan Lägg till händelser och sedan Nästa för att gå till sidan Granska .

Granskning

Granska tillgångs- och tagginformationen och gör eventuella justeringar du behöver innan du väljer Skapa:

Skärmbild av sidan Skapa tillgångsgranskning i Azure IoT Operations.

Den här konfigurationen distribuerar en ny tillgång som anropas thermostat till klustret. Du kan använda kubectl för att visa tillgångarna:

kubectl get assets -n azure-iot-operations

Visa resurser i Azure Portal

Om du vill visa tillgångsslutpunkten och tillgången som du skapade i Azure Portal går du till resursgruppen som innehåller din Azure IoT Operations-instans. Du kan se termostattillgången i resursgruppen Azure IoT Operations . Om du väljer Visa dolda typer kan du också se tillgångsslutpunkten:

Skärmbild av Azure Portal som visar resursgruppen Azure IoT Operations, inklusive tillgångs- och tillgångsslutpunkten.

Med portalen kan du visa tillgångsinformationen. Välj JSON-vy för mer information:

Skärmbild av information om Azure IoT Operations-tillgångar i Azure Portal.

Kontrollera att data flödar

Kontrollera att data flödar till MQTT-koordinatorn med hjälp av verktyget mosquitto_sub . I det här exemplet kör du verktyget mosquitto_sub i Kubernetes-klustret:

  1. Kör följande kommando för att distribuera en podd som innehåller verktygen mosquitto_pub och mosquitto_sub som är användbara för att interagera med MQTT-koordinatorn i klustret:

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml
    

    Följande kodfragment visar YAML-filen som du använde:

    # Important: do not use in production environments
    # Create a service account
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: mqtt-client
      namespace: azure-iot-operations
    ---
    # Creates a pod with mosquitto-clients and mqttui utilities in your cluster
    apiVersion: v1
    kind: Pod
    metadata:
      name: mqtt-client
      # The namespace must match the IoT MQ BrokerListener's namespace
      # Otherwise use the long hostname: aio-broker.azure-iot-operations.svc.cluster.local
      namespace: azure-iot-operations
    spec:
      # Use the "mqtt-client" service account which comes with default deployment
      # Otherwise create it with `kubectl create serviceaccount mqtt-client -n azure-iot-operations`
      serviceAccountName: mqtt-client
      containers:
        # Install mosquitto and mqttui utilities on Alpine linux
      - image: alpine
        name: mqtt-client
        command: ["sh", "-c"]
        args: ["apk add mosquitto-clients mqttui && sleep infinity"]
        resources:
          limits:
            cpu: 500m
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 100Mi
        volumeMounts:
        - name: broker-sat
          mountPath: /var/run/secrets/tokens
        - name: trust-bundle
          mountPath: /var/run/certs
      volumes:
      - name: broker-sat
        projected:
          sources:
          - serviceAccountToken:
              path: broker-sat
              audience: aio-internal # Must match audience in BrokerAuthentication
              expirationSeconds: 86400
      - name: trust-bundle
        configMap:
          name: azure-iot-operations-aio-ca-trust-bundle # Default root CA cert
    

    Varning

    Den här konfigurationen är inte säker. Använd inte den här konfigurationen i en produktionsmiljö.

  2. När mqtt-client-podden körs kör du följande kommando för att skapa en gränssnittsmiljö i podden som du skapade:

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  3. Kör följande kommando i Bash-gränssnittet i mqtt-client-podden för att ansluta till MQTT-koordinatorn med hjälp av det mosquitto_sub verktyg som prenumererar på data/thermostat ämnet:

    mosquitto_sub --host aio-broker --port 18883 --topic "azure-iot-operations/data/#" -v --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
    

    Det här kommandot fortsätter att köras och visar meddelanden när de tas emot i data/thermostat ämnet tills du trycker på Ctrl+C för att stoppa det. Om du vill avsluta shell-miljön skriver du exit.

Om du vill kontrollera att termostattillgången som du har lagt till publicerar data kan du visa telemetrin i ämnet azure-iot-operations/data :

Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:17.1858435Z","Value":4558},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:17.1858869Z","Value":4558}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:18.1838125Z","Value":4559},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:18.1838523Z","Value":4559}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:19.1834363Z","Value":4560},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:19.1834879Z","Value":4560}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:20.1861251Z","Value":4561},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:20.1861709Z","Value":4561}}
Client $server-generated/05a22b94-c5a2-4666-9c62-837431ca6f7e received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (152 bytes))
{"temperature":{"SourceTimestamp":"2024-07-29T15:02:21.1856798Z","Value":4562},"Tag 10":{"SourceTimestamp":"2024-07-29T15:02:21.1857211Z","Value":4562}}

Om inga data flödar startar du om aio-opc-opc.tcp-1 podden:

  1. Hitta namnet på din aio-opc-opc.tcp-1 podd med hjälp av följande kommando:

    kubectl get pods -n azure-iot-operations
    

    Namnet på din podd ser ut som aio-opc-opc.tcp-1-849dd78866-vhmz6.

  2. aio-opc-opc.tcp-1 Starta om podden med hjälp av ett kommando som ser ut som i följande exempel. aio-opc-opc.tcp-1 Använd poddnamnet från föregående steg:

    kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
    

Exempeltaggar som du lade till i föregående självstudie genererar meddelanden från din tillgång som ser ut som i följande exempel:

{
    "temperature": {
        "SourceTimestamp": "2024-08-02T13:52:15.1969959Z",
        "Value": 2696
    },
    "Tag 10": {
        "SourceTimestamp": "2024-08-02T13:52:15.1970198Z",
        "Value": 2696
    }
}

Hur löste vi problemet?

I den här självstudien lade du till en tillgångsslutpunkt och definierade sedan en tillgång och taggar. Tillgångarna och taggarna modellerar data från OPC UA-servern för att göra data enklare att använda i en MQTT-koordinator och andra underordnade processer. Du använder termostattillgången som du definierade i nästa självstudie.

Rensa resurser

Om du fortsätter till nästa självstudie behåll alla dina resurser.

Om du vill ta bort Azure IoT Operations-distributionen men behålla klustret använder du kommandot az iot ops delete :

az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP

Om du vill ta bort alla resurser som du skapade för den här snabbstarten tar du bort Kubernetes-klustret där du distribuerade Azure IoT-åtgärder och tar sedan bort azure-resursgruppen som innehöll klustret.

Om du använde Codespaces för dessa snabbstarter tar du bort ditt Codespace från GitHub.

Gå vidare

Självstudie: Skicka tillgångstelemetri till molnet med hjälp av ett dataflöde.