Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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:
- Distribuera Azure IoT-åtgärder till ett produktionskluster
- Om du har distribuerat Azure IoT-åtgärder med testinställningar aktiverade läser du Aktivera säkra inställningar på en befintlig Azure IoT Operations-instans för att aktivera säkra inställningar.
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:
- 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
- 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.
- 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:
- Gå till webbgränssnittet för driftupplevelse och logga in med dina Microsoft Entra-ID-autentiseringsuppgifter. 
- 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. 
- Välj den instans där du distribuerade 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. 
- Välj Enheter och sedan Hantera certifikat och hemligheter: 
- På sidan Certifikat och hemligheter väljer du Lägg till nytt certifikat: 
- Välj Ladda upp certifikat, välj OPC UA-förtroendelista som certifikatarkiv och välj sedan den - opcplc-000000.crtfil som du laddade ned tidigare. Välj sedan Ladda upp:
- 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:
- Välj Enheter och sedan Skapa enhet: 
- Ange - opc-ua-connectorsom enhetsnamn och välj Nytt på panelen Microsoft.OpcUa :
- 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:
- Om du vill lägga till en användarnamnsreferens väljer du Lägg till referens och sedan Skapa ny. 
- Ange - plcusernamesom hemligt namn och- contosousersom hemligt värde. Välj därefter Tillämpa.
- Om du vill lägga till en lösenordsreferens väljer du Lägg till referens och sedan Skapa ny. 
- Ange - plcpasswordsom 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.
- På sidan Enhetsinformation väljer du Nästa för att gå till sidan Ytterligare information . 
- 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. 
- 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:
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 | 
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.
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:
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:
Med portalen kan du visa tillgångsinformationen. Välj JSON-vy för mer information:
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:
- 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ö. 
- 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
- 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:
- Hitta namnet på din - aio-opc-opc.tcp-1podd 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.
- aio-opc-opc.tcp-1Starta om podden med hjälp av ett kommando som ser ut som i följande exempel.- aio-opc-opc.tcp-1Anvä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.
 
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
              