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 datapunkter 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 förhandsversion av Azure IoT Operations med säkra inställningar aktiverade distribuerade i ett Kubernetes-kluster. Information om hur du skapar en förhandsgranskningsinstans finns i:

Viktigt!

Det går inte att aktivera säkra inställningar på den instans som du skapar om du följer stegen i artikeln Snabbstart: Kör Azure IoT-åtgärder i GitHub Codespaces med K3s .

När du har aktiverat säkra inställningar innehåller även resursgruppen som innehåller din Azure IoT Operations-instans följande resurser:

  • En Azure Key Vault-instans som lagrar hemligheterna som ska synkroniseras i ditt Kubernetes-kluster.
  • En användartilldelad hanterad identitet som Azure IoT Operations använder för att komma åt Azure Key Vault-instansen.
  • En användartilldelad hanterad identitet som Azure IoT Operations-komponenter, till exempel dataflöden, kan använda för att ansluta till molnslutpunkter som Azure Event Hubs.
  • Ett Azure Device Registry-namnområde som lagrar dina namnområdestillgångar och enheter.

Se till att när du konfigurerar säkra inställningar ger du ditt användarkonto behörighet att hantera hemligheter med rollen Key Vault Secrets Officer .

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.

Självstudien beskriver också hur du använder autentiseringsuppgifter som lagras i Azure Key Vault för att autentisera till den simulerade OPC UA-servern.

Distribuera OPC PLC-simulatorn

I den här självstudien används OPC PLC-simulatorn för att generera exempeldata. Så här distribuerar du OPC PLC-simulatorn:

  1. Ladda ned filen opc-plc-tutorial-deployment.yaml från GitHub-lagringsplatsen. Om du vill ladda ned med hjälp av kommandoraden kör du följande kommando:

    wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/refs/heads/main/samples/quickstarts/opc-plc-tutorial-deployment.yaml -O opc-plc-tutorial-deployment.yaml
    
  2. opc-plc-tutorial-deployment.yaml Öppna filen som du laddade ned i en textredigerare och ändra lösenordet för simulatorn. Lösenordet anges med hjälp av parametern --defaultpassword . Anteckna lösenordsvärdet. Du behöver det senare. Spara sedan ändringarna.

  3. Kör följande kommando för att distribuera OPC PLC-simulatorn till klustret:

    kubectl apply -f opc-plc-tutorial-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:
          - "--plchostname=opcplc-000000"
          - "--portnum=50000"
          - "--certdnsnames=opcplc-000000"
          - "--unsecuretransport"
          - "--slownodes=5"
          - "--slowrate=10"
          - "--fastnodes=10"
          - "--fasttypelowerbound=212"
          - "--fasttypeupperbound=273"
          - "--fasttyperandomization=True"
          - "--veryfastrate=1000"
          - "--guidnodes=1"
          - "--appcertstoretype=FlatDirectory"
          - "--dontrejectunknownrevocationstatus"
          - "--disableanonymousauth"
          - "--defaultuser=contosouser"
          - "--defaultpassword=contosouserpassword"
        ports:
        - containerPort: 50000
        volumeMounts:
          - name: opc-plc-default-application-cert
            mountPath: /app/pki/own
          - name: opc-plc-trust-list
            mountPath: /app/pki/trusted
      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
      serviceAccountName: opcplc-000000-service-account
---
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: 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

Upprätta ömsesidigt förtroende

Innan OPC PLC-simulatorn kan skicka data till anslutningsappen för OPC UA måste du upprätta ömsesidigt förtroende mellan dem. I den här handledningen använder OPC PLC-simulatorn och anslutningsappen för OPC UA självsignerade certifikat för att upprätta ömsesidigt förtroende med anslutningsappen.

  • Simulatorns programinstanscertifikat lagras i Kubernetes-hemligheten opc-plc-default-application-cert .
  • Anslutningsappen för OPC UA:s programinstanscertifikat lagras i Kubernetes-hemligheten aio-opc-opcuabroker-default-application-cert .

Viktigt!

I en produktionsmiljö använder du programinstanscertifikat i företagsklass för att upprätta det ömsesidiga förtroendet. Mer information finns i Konfigurera ett programinstanscertifikat i företagsklass.

Lägg till anslutningsappens certifikat i simulatorns förtroendelista

Varje OPC UA-server har en egen mekanism för att hantera förtroendelistan. Om du vill lägga till anslutningsappens certifikat i simulatorns förtroendelista kör du följande kommandon:

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}"
$cert = kubectl -n azure-iot-operations get secret aio-opc-opcuabroker-default-application-cert -o jsonpath='{.data.tls\.crt}' | %{ [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($_)) }
$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}"

Lägg till simulatorns certifikat i anslutningsappens förtroendelista

Varje OPC UA-servertyp har en egen mekanism för att hantera sitt programinstanscertifikat. Om du vill ladda ned simulatorns certifikat till en fil med namnet opcplc-000000.crtkör du följande kommando:

kubectl -n azure-iot-operations get secret opc-plc-default-application-cert -o jsonpath='{.data.tls\.crt}' | base64 -d > opcplc-000000.crt
kubectl -n azure-iot-operations get secret opc-plc-default-application-cert -o jsonpath='{.data.tls\.crt}' | %{ [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($_)) } > opcplc-000000.crt

Så här lägger du till simulatorns certifikat i anslutningsappens förtroendelista:

  1. Gå till webbgränssnittet för driftupplevelse och logga in med dina Microsoft Entra-ID-autentiseringsuppgifter.

  2. Välj din webbplats. Om 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.

  3. Välj den instans där du distribuerade Azure IoT Operations:

    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.

  4. Välj Enheter och sedan Hantera certifikat och hemligheter:

    Skärmbild som visar hur du hittar sidan Hantera certifikat i driftupplevelsen.

  5. sidan Certifikat och hemligheter väljer du Lägg till nytt certifikat:

    Skärmbild som visar hur du lägger till ett certifikat i listan över betrodda certifikat i driftupplevelsen.

  6. Välj Ladda upp certifikat, välj OPC UA-förtroendelista som certifikatarkiv och välj sedan den opcplc-000000.crt fil som du laddade ned tidigare. Välj sedan Ladda upp:

    Skärmbild som visar en lyckad uppladdning av certifikat.

  7. Välj Använd.

Simulatorns programinstanscertifikat finns nu i anslutningsappen för OPC UA:s förtroendelista.

Lägga till en enhet

I det här steget använder du driftupplevelsen för att lägga till en enhet som gör att du kan ansluta till OPC PLC-simulatorn. Så här lägger du till en enhet:

  1. Välj Enheter och sedan Skapa enhet:

    Skärmbild som visar enhetssidan i driftupplevelsen.

  2. Ange opc-ua-connector som enhetsnamn och välj Nyttpanelen Microsoft.OpcUa :

    Skärmbild som visar hur du lägger till en enhet i driftupplevelsen.

  3. Ange följande information om inkommande slutpunkter i Microsoft.OpcUa:

    Fält Värde
    Slutpunktsnamn opc-ua-connector-0
    OPC UA-server-URL opc.tcp://opcplc-000000:50000
    Användarautentiseringsläge Username password
    Synkroniserat hemlighetsnamn plc-credentials

I den här självstudien lägger du till nya hemligheter i din Azure Key Vault-instans från webbgränssnittet för driftupplevelse. Hemligheterna synkroniseras automatiskt till ditt Kubernetes-kluster:

  1. Om du vill lägga till en användarnamnsreferens väljer du Lägg till referens och sedan Skapa ny.

  2. Ange plcusername som hemligt namn och contosouser som hemligt värde. Välj därefter Tillämpa.

  3. Om du vill lägga till en lösenordsreferens väljer du Lägg till referens och sedan Skapa ny.

  4. Ange plcpassword som det hemliga namnet och lösenordet som du lade till i filen opc-plc-deployment.yaml som det hemliga värdet. Välj därefter Tillämpa.

  5. På sidan Enhetsinformation väljer du Nästa för att gå till sidan Ytterligare information .

  6. På sidan Lägg till anpassad egenskap kan du uppdatera eller lägga till anpassade egenskaper på enheten. Välj Nästa när du är klar.

  7. Om du vill spara enhetsdefinitionen på sidan Sammanfattning väljer du Skapa.

Den här konfigurationen distribuerar en ny enhet med namnet opc-ua-connector med en slutpunkt som anropas opc-ua-connector-0 till klustret. Du kan visa enheten i Azure-portalen eller så kan du använda kubectl för att visa enheterna i ditt Kubernetes-kluster:

kubectl get device -n azure-iot-operations

Du kan se hemligheterna plcusername och plcpassword i Azure Key Vault-instansen i resursgruppen. Hemligheterna synkroniseras med ditt Kubernetes-kluster där du kan se dem med hjälp kubectl get secret plc-credentials -n azure-iot-operations av kommandot . Du kan också se hemligheterna i driftupplevelsen på sidan Hantera synkroniserade hemligheter .

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 namnområdestillgång. Ange sedan följande tillgångsinformation:

Fält Värde
Inkommande slutpunkt opc-ua-connector-0
Tillgångsnamn thermostat
beskrivning A simulated thermostat asset

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
omgång 102
Kund Contoso
utrustning Panna
isSpare sann
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 en OPC UA-tagg på sidan Taggar . Om du vill lägga till en tagg väljer du Lägg till tagg. Ange tagginformationen som visas i följande tabell:

Datakälla Taggnamn
ns=3; s=SpikeData temperatur

Värdet för datakällan här är en specifik OPC UA-simulatornod. Noden genererar slumpmässiga värden inom ett angivet intervall och har även tillfälliga toppar.

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.

Om du vill konfigurera MQTT-ämnet för att publicera taggdata till väljer du Hantera standarddatauppsättning. Ange azure-iot-operations/data/thermostat som MQTT-ämne och välj sedan Uppdatera. Det här avsnittet används av dataflödet i nästa självstudiekurs för att skicka meddelanden till molnet.

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 också använda kubectl för att visa tillgångarna lokalt i klustret:

kubectl get assets.namespace -n azure-iot-operations

Visa resurser i Azure Portal

Om du vill visa den enhet och tillgång som du skapade i Azure-portalen går du till Azure Device Registry:

Skärmbild av Azure-portalen som visar Azure Device Registry.

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-portalen.

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 verktyget mosquitto_sub och använda ett jokertecken för att prenumerera på ämnena data/# :

    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 alla data/# ämnen tills du trycker på Ctrl+C för att stoppa det. Om du vill avsluta shell-miljön skriver du exit.

För att kontrollera att termostaten du har lagt till publicerar data, visa meddelandena på ämnesområdet azure-iot-operations/data/thermostat.

Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (92 bytes))
azure-iot-operations/data/thermostat {"temperature":{"SourceTimestamp":"2025-02-14T11:27:44.5030912Z","Value":48.17536741017152}}
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (90 bytes))
azure-iot-operations/data/thermostat {"temperature":{"SourceTimestamp":"2025-02-14T11:27:45.50333Z","Value":98.22872507286887}}
Client $server-generated/0000aaaa-11bb-cccc-dd22-eeeeee333333 received PUBLISH (d0, q0, r0, m0, 'azure-iot-operations/data/thermostat', ... (92 bytes))
azure-iot-operations/data/thermostat {"temperature":{"SourceTimestamp":"2025-02-14T11:27:46.503381Z","Value":12.533323356430426}}

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":{
        "Value":24.86898871648548,
        "SourceTimestamp":"2025-04-25T14:50:07.195274Z"
    }
}

Hur löste vi problemet?

I den här självstudien lade du till en enhet 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ände autentiseringsuppgifter som lagrats i Azure Key Vault för att autentisera till OPC UA-servern. Den här metoden är säkrare än hårdkodning av autentiseringsuppgifter i tillgångsdefinitionen.

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

Handledning: Skicka meddelanden från din tillgång till molnet genom att använda ett dataflöde.