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:
- Snabbstart: Kör Azure IoT Operations i GitHub Codespaces med K3s innehåller enkla instruktioner för att distribuera en Azure IoT Operations-instans som du kan använda för självstudierna.
- Distributionsöversikten innehåller detaljerade instruktioner för att distribuera en Azure IoT Operations-instans i Windows med hjälp av Azure Kubernetes Service Edge Essentials eller Ubuntu med hjälp av K3s.
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.
Välj din instans
Välj den instans där du distribuerade Azure IoT Operations i föregående självstudie:
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:
Välj Tillgångsslutpunkter och sedan Skapa tillgångsslutpunkt:
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
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ändakubectl
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:
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 |
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
, , Histogram
eller Log
.
Du kan välja Hantera standardinställningar för att ändra standardsamplingsintervallet och köstorleken för varje tagg.
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 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:
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 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 duexit
.
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:
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
.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.