Zelfstudie: OPC UA-assets toevoegen aan uw Azure IoT Operations-cluster
In deze zelfstudie voegt u handmatig OPC UA-assets toe aan uw Azure IoT Operations-cluster. Deze assets publiceren berichten naar de MQTT-broker in uw Azure IoT Operations-cluster. Normaal gesproken voert een OT-gebruiker deze stappen uit.
Een asset is een fysiek apparaat of logische entiteit die een apparaat, een machine, een systeem of een proces vertegenwoordigt. Een fysiek activum kan bijvoorbeeld een pomp, een motor, een tank of een productielijn zijn. Een logische asset die u definieert, kan eigenschappen hebben, telemetrie streamen of gebeurtenissen genereren.
OPC UA-servers zijn softwaretoepassingen die communiceren met assets. OPC UA-tags zijn gegevenspunten die OPC UA-servers beschikbaar maken. OPC UA-tags kunnen realtime of historische gegevens bieden over de status, prestaties, kwaliteit of conditie van assets.
In deze zelfstudie gebruikt u de webgebruikersinterface van operations experience om uw assets te maken. U kunt ook de Azure CLI gebruiken om een aantal van deze taken uit te voeren.
Vereisten
Een exemplaar van Azure IoT Operations dat is geïmplementeerd in een Kubernetes-cluster. Als u een exemplaar wilt maken, gebruikt u een van de volgende opties om Azure IoT-bewerkingen te implementeren:
- Quickstart: Azure IoT Operations uitvoeren in GitHub Codespaces met K3s biedt eenvoudige instructies voor het implementeren van een Azure IoT Operations-exemplaar dat u voor de zelfstudies kunt gebruiken.
- Overzicht van de implementatie bevat gedetailleerde instructies voor het implementeren van een Azure IoT Operations-exemplaar in Windows met behulp van Azure Kubernetes Service Edge Essentials of Ubuntu met behulp van K3s.
Als u zich wilt aanmelden bij de webgebruikersinterface van operations experience, hebt u een Microsoft Entra ID-account nodig met ten minste inzendermachtigingen voor de resourcegroep die uw Kubernetes - Azure Arc-exemplaar bevat. Zie de webgebruikersinterface van Operations Experience voor meer informatie.
Tenzij anders vermeld, kunt u de consoleopdrachten in deze zelfstudie uitvoeren in een Bash- of PowerShell-omgeving.
Welk probleem gaan we oplossen?
De gegevens die OPC UA-servers beschikbaar maken, kunnen een complexe structuur hebben en kunnen moeilijk te begrijpen zijn. Azure IoT Operations biedt een manier om OPC UA-assets te modelleren als tags, gebeurtenissen en eigenschappen. Deze modellering maakt het gemakkelijker om inzicht te hebben in de gegevens en deze te gebruiken in downstreamprocessen zoals de MQTT-broker en gegevensstromen.
De OPC PLC-simulator implementeren
In deze zelfstudie wordt de OPC PLC-simulator gebruikt om voorbeeldgegevens te genereren. Voer de volgende opdracht uit om de OPC PLC-simulator te implementeren:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/opc-plc-deployment.yaml
In het volgende fragment ziet u het YAML-bestand dat u hebt toegepast:
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
Let op
Deze configuratie is niet beveiligd. Gebruik deze configuratie niet in een productieomgeving.
Aanmelden bij de bewerkingservaring
Gebruik de bewerkingservaring om asseteindpunten, assets te maken en u te abonneren op OPC UA-tags en -gebeurtenissen.
Blader naar de bewerkingservaring in uw browser en meld u aan met uw Microsoft Entra ID-referenties.
Uw site selecteren
Een site is een verzameling Azure IoT Operations-exemplaren. Sites groeperen doorgaans exemplaren op fysieke locatie en maken het gemakkelijker voor OT-gebruikers om assets te vinden en te beheren. Uw IT-beheerder maakt sites en wijst Azure IoT Operations-exemplaren eraan toe. Omdat u met een nieuwe implementatie werkt, zijn er nog geen sites. U vindt het cluster dat u eerder hebt gemaakt door niet-toegewezen instanties weergeven te selecteren. In de bewerkingservaring vertegenwoordigt een exemplaar een cluster waarin u Azure IoT-bewerkingen hebt geïmplementeerd.
Selecteer uw exemplaar
Selecteer het exemplaar waarin u Azure IoT-bewerkingen hebt geïmplementeerd in de vorige zelfstudie:
Tip
Als u geen exemplaren ziet, bevindt u zich mogelijk niet in de juiste Microsoft Entra ID-tenant. U kunt de tenant wijzigen in het menu rechtsboven in de bewerkingservaring.
Een asseteindpunt toevoegen
Toen u Azure IoT Operations in het vorige artikel hebt geïmplementeerd, hebt u een ingebouwde OPC PLC-simulator opgenomen. In deze stap voegt u een asseteindpunt toe waarmee u verbinding kunt maken met de OPC PLC-simulator.
Een asseteindpunt toevoegen:
Selecteer Asseteindpunten en vervolgens Asseteindpunt maken:
Voer de volgende eindpuntgegevens in:
Veld Waarde Naam van asseteindpunt opc-ua-connector-0
URL van OPC UA-server opc.tcp://opcplc-000000:50000
Gebruikersverificatiemodus Anonymous
Als u de definitie wilt opslaan, selecteert u Maken.
Met deze configuratie wordt een nieuw asseteindpunt geïmplementeerd dat naar het cluster wordt aangeroepen
opc-ua-connector-0
. U kuntkubectl
de asseteindpunten weergeven:kubectl get assetendpointprofile -n azure-iot-operations
Uw assets beheren
Nadat u uw exemplaar in de bewerkingservaring hebt geselecteerd, ziet u de beschikbare lijst met assets op de pagina Assets . Als er nog geen assets zijn, is deze lijst leeg:
Een activum maken
Als u een asset wilt maken, selecteert u Asset maken. Voer vervolgens de volgende assetgegevens in:
Veld | Waarde |
---|---|
Asseteindpunt | opc-ua-connector-0 |
Assetnaam | thermostat |
Beschrijving | A simulated thermostat asset |
Standaard MQTT-onderwerp | azure-iot-operations/data/thermostat |
Verwijder de bestaande aangepaste eigenschappen en voeg de volgende aangepaste eigenschappen toe. Wees voorzichtig met het gebruik van de exacte eigenschapsnamen, zoals de Power BI-sjabloon in een latere zelfstudiequery's voor hen:
Eigenschapsnaam | Details van eigenschap |
---|---|
batch | 102 |
klant | Contoso |
uitrusting | Ketel |
isSpare | true |
locatie | Seattle |
Selecteer Volgende om naar de pagina Tags toevoegen te gaan.
OPC UA-tags maken
Voeg twee OPC UA-tags toe op de pagina Tags toevoegen. Als u elke tag wilt toevoegen, selecteert u Tag of CSV toevoegen en selecteert u Tag toevoegen. Voer de taggegevens in die worden weergegeven in de volgende tabel:
Knooppunt-id | Naam van tag | Waarneembaarheidsmodus |
---|---|---|
ns=3; s=FastUInt10 | temperatuur | Geen |
ns=3; s=FastUInt100 | Tag 10 | Geen |
De waarneembaarheidsmodus is een van de volgende waarden: None
, Gauge
, Counter
, of Histogram
Log
.
U kunt standaardinstellingen beheren selecteren om het standaardsamplingsinterval en de grootte van de wachtrij voor elke tag te wijzigen.
Selecteer Volgende om naar de pagina Gebeurtenissen toevoegen te gaan en ga vervolgens naar de pagina Controleren.
Beoordelen
Controleer de details van uw asset en tag en breng eventuele aanpassingen aan die u nodig hebt voordat u Maken selecteert:
Met deze configuratie wordt een nieuwe asset geïmplementeerd die naar het cluster wordt aangeroepen thermostat
. U kunt kubectl
de assets weergeven:
kubectl get assets -n azure-iot-operations
Resources weergeven in Azure Portal
Als u het asseteindpunt en de asset wilt weergeven die u in Azure Portal hebt gemaakt, gaat u naar de resourcegroep die uw Azure IoT Operations-exemplaar bevat. U kunt de thermostaatasset zien in de Azure IoT Operations-resourcegroep . Als u Verborgen typen weergeven selecteert, kunt u ook het asseteindpunt zien:
Met de portal kunt u de details van de asset weergeven. Selecteer de JSON-weergave voor meer informatie:
Controleren of gegevens stromen
Controleer of de gegevens naar de MQTT-broker stromen met behulp van het hulpprogramma mosquitto_sub . In dit voorbeeld voert u het hulpprogramma mosquitto_sub uit in uw Kubernetes-cluster:
Voer de volgende opdracht uit om een pod te implementeren die de mosquitto_pub en mosquitto_sub hulpprogramma's bevat die nuttig zijn voor interactie met de MQTT-broker in het cluster:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml
In het volgende fragment ziet u het YAML-bestand dat u hebt toegepast:
# 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
Let op
Deze configuratie is niet beveiligd. Gebruik deze configuratie niet in een productieomgeving.
Wanneer de mqtt-client-pod wordt uitgevoerd, voert u de volgende opdracht uit om een shell-omgeving te maken in de pod die u hebt gemaakt:
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
Voer in de Bash-shell in de mqtt-client-pod de volgende opdracht uit om verbinding te maken met de MQTT-broker met behulp van het hulpprogramma mosquitto_sub dat is geabonneerd op het
data/thermostat
onderwerp: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)
Deze opdracht blijft actief en geeft berichten weer wanneer ze binnenkomen in het
data/thermostat
onderwerp totdat u op Ctrl+C drukt om deze te stoppen. Als u de shell-omgeving wilt afsluiten, typtexit
u .
Als u wilt controleren of de thermostaatasset die u hebt toegevoegd gegevens publiceert, bekijkt u de telemetrie in het azure-iot-operations/data
onderwerp:
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}}
Als er geen gegevensstromen zijn, start u de aio-opc-opc.tcp-1
pod opnieuw op:
Zoek de naam van uw
aio-opc-opc.tcp-1
pod met behulp van de volgende opdracht:kubectl get pods -n azure-iot-operations
De naam van uw pod ziet er als
aio-opc-opc.tcp-1-849dd78866-vhmz6
volgt uit.Start de
aio-opc-opc.tcp-1
pod opnieuw op met behulp van een opdracht die lijkt op het volgende voorbeeld. Gebruik deaio-opc-opc.tcp-1
podnaam uit de vorige stap:kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
De voorbeeldtags die u in de vorige zelfstudie hebt toegevoegd, genereren berichten van uw asset die eruitzien als in het volgende voorbeeld:
{
"temperature": {
"SourceTimestamp": "2024-08-02T13:52:15.1969959Z",
"Value": 2696
},
"Tag 10": {
"SourceTimestamp": "2024-08-02T13:52:15.1970198Z",
"Value": 2696
}
}
Hoe hebben we het probleem opgelost?
In deze zelfstudie hebt u een asseteindpunt toegevoegd en vervolgens een asset en tags gedefinieerd. De assets en tags modelgegevens van de OPC UA-server om de gegevens gemakkelijker te gebruiken in een MQTT-broker en andere downstreamprocessen. U gebruikt de thermostaatasset die u in de volgende zelfstudie hebt gedefinieerd.
Resources opschonen
Als u doorgaat met de volgende zelfstudie, houdt u al uw resources bij.
Als u de Implementatie van Azure IoT Operations wilt verwijderen, maar uw cluster wilt behouden, gebruikt u de opdracht az iot ops delete :
az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Als u alle resources wilt verwijderen die u voor deze quickstart hebt gemaakt, verwijdert u het Kubernetes-cluster waarin u Azure IoT Operations hebt geïmplementeerd en verwijdert u vervolgens de Azure-resourcegroep die het cluster bevat.
Als u Codespaces voor deze quickstarts hebt gebruikt, verwijdert u uw Codespace uit GitHub.
Volgende stap
Zelfstudie: Assettelemetrie verzenden naar de cloud met behulp van een gegevensstroom.