Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tutorial, agregará manualmente recursos de OPC UA al clúster de operaciones de Azure IoT. Estos recursos publican mensajes en el corredor MQTT en el clúster de Operaciones de IoT de Azure. Normalmente, un usuario de OT sigue estos pasos.
Un recurso es un dispositivo físico o una entidad lógica que representa un dispositivo, una máquina, un sistema o un proceso. Por ejemplo, un recurso físico podría ser una bomba, un motor, un tanque o una línea de producción. Un recurso lógico que defina puede tener propiedades, puntos de datos de flujo o generar eventos.
Los servidores OPC UA son aplicaciones de software que se comunican con recursos. Las etiquetas de OPC UA son puntos de datos que los servidores OPC UA exponen. Las etiquetas de OPC UA pueden proporcionar datos históricos o en tiempo real sobre el estado, el rendimiento, la calidad o la condición de los recursos.
En este tutorial, usará la interfaz de usuario web de la experiencia de operaciones para crear los recursos. También puede usar la CLI de Azure para completar algunas de estas tareas.
Requisitos previos
Una instancia de Azure IoT Operations con configuración de seguridad habilitada desplegada en un clúster de Kubernetes. Para crear una instancia, use una de las siguientes opciones para implementar operaciones de Azure IoT:
- Inicio rápido: Ejecución de Operaciones de IoT de Azure en GitHub Codespaces con K3s proporciona instrucciones sencillas para implementar una instancia de Operaciones de IoT de Azures que puede usar para los tutoriales. A continuación, para habilitar la configuración segura, siga los pasos descritos en Habilitación de la configuración segura en Operaciones de Azure IoT.
- Introducción a la implementación proporciona instrucciones detalladas para implementar una instancia de Operaciones de IoT de Azure en Windows mediante Azure Kubernetes Service Edge Essentials o Ubuntu mediante K3s. Siga los pasos descritos en el artículo de implementación para una implementación de configuración segura e instale la versión más reciente.
Importante
No es posible habilitar la configuración segura en la instancia que cree si sigue los pasos descritos en el artículo Inicio rápido: Ejecución de operaciones de Azure IoT en GitHub Codespaces con K3s .
Después de habilitar la configuración segura, el grupo de recursos que contiene la instancia de Azure IoT Operations también contiene los siguientes recursos:
- Una instancia de Azure Key Vault para almacenar los secretos que se van a sincronizar en el clúster de Kubernetes.
- Una identidad administrada asignada por el usuario que azure IoT Operations usa para acceder a la instancia de Azure Key Vault.
- Una identidad administrada asignada por el usuario que los componentes de Azure IoT Operations, como los flujos de datos, pueden usar para conectarse a puntos de conexión en la nube, como Azure Event Hubs.
- Un espacio de nombres de Azure Device Registry para almacenar los recursos y dispositivos.
Asegúrese de que, al configurar opciones seguras, conceda a su cuenta de usuario permisos para administrar secretos con el rol De oficial de secretos de Key Vault .
Para iniciar sesión en la experiencia de operaciones, necesita una cuenta de Id. de Microsoft Entra con al menos permisos de colaborador para el grupo de recursos que contiene la instancia de Kubernetes - Azure Arc. Para más información, consulte Experiencia de operaciones de la interfaz de usuario web.
A menos que se indique lo contrario, puede ejecutar los comandos de consola de este tutorial en un entorno de Bash o PowerShell.
¿Qué problema resolveremos?
Los datos que los servidores OPC UA exponen pueden tener una estructura compleja y ser difíciles de entender. Operaciones de IoT de Azure proporciona una manera de modelar los recursos de OPC UA, como las etiquetas, los eventos y las propiedades. Este modelado facilita la comprensión de los datos y su uso en procesos de bajada, como el corredor MQTT y los flujos de datos.
En el tutorial también se explica cómo usar las credenciales almacenadas en Azure Key Vault para autenticarse en el servidor OPC UA simulado.
Implementación del simulador de OPC PLC
En este tutorial se usa el simulador de OPC PLC para generar datos de ejemplo. Para implementar el simulador de OPC PLC:
Descargue el archivo opc-plc-tutorial-deployment.yaml desde el repositorio de GitHub. Para descargar mediante la línea de comandos, ejecute el siguiente comando:
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.yamlAbra el
opc-plc-tutorial-deployment.yamlarchivo que descargó en un editor de texto y cambie la contraseña del simulador. La contraseña se establece mediante el--defaultpasswordparámetro . Anote el valor de la contraseña, lo necesitará más adelante. A continuación, guarde los cambios.Para implementar el simulador de OPC PLC en el clúster, ejecute el siguiente comando:
kubectl apply -f opc-plc-tutorial-deployment.yaml
En el fragmento de código siguiente se muestra el archivo YAML que aplicaste:
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
Establecimiento de confianza mutua
Antes de que el simulador de OPC PLC pueda enviar datos al conector para OPC UA, debe establecer una confianza mutua entre ellos. En este tutorial, el simulador OPC PLC y el conector para OPC UA usan certificados autofirmados para establecer la confianza mutua con el conector para OPC UA:
- El certificado de instancia de aplicación del simulador se almacena en el
opc-plc-default-application-certsecreto de Kubernetes. - El certificado de instancia de aplicación del conector para OPC UA se almacena en el secreto de Kubernetes
aio-opc-opcuabroker-default-application-cert.
Importante
En un entorno de producción, use certificados de instancia de aplicación de nivel empresarial para establecer la confianza mutua. Para más información, consulte Configuración de un certificado de instancia de aplicación de nivel empresarial.
Adición del certificado del conector a la lista de confianza del simulador
Cada servidor OPC UA tiene su propio mecanismo para administrar la lista de confianza. Para agregar el certificado del conector a la lista de confianza del simulador, ejecute los siguientes comandos:
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}"
Adición del certificado del simulador a la lista de confianza del conector
Cada tipo de servidor OPC UA tiene su propio mecanismo para administrar su certificado de instancia de aplicación. Para descargar el certificado del simulador en un archivo denominado opcplc-000000.crt, ejecute el siguiente comando:
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
Para agregar el certificado del simulador a la lista de confianza del conector:
Vaya a la interfaz web de usuario de la experiencia de operaciones e inicie sesión con sus credenciales de Microsoft Entra ID.
Seleccione su sitio. Si está trabajando con una nueva implementación, aún no hay sitios. Para encontrar el clúster que creó anteriormente, seleccione Ver instancias sin asignar. En la experiencia de operaciones, una instancia representa un clúster donde implementó Operaciones de IoT de Azure.
Seleccione la instancia en la que implementó Azure IoT Operations:
Sugerencia
Si no viera ninguna instancia, es posible que no esté en el inquilino de Microsoft Entra ID adecuado. Puede cambiar el inquilino desde el menú superior derecho en la experiencia de operaciones.
Seleccione Dispositivos y, a continuación, Administrar certificados y secretos:
En la página Certificados y secretos, seleccione Agregar nuevo certificado:
Seleccione Cargar certificado, seleccione la lista de confianza de OPC UA como almacén de certificados y elija el
opcplc-000000.crtarchivo que descargó anteriormente. A continuación, seleccione Cargar:Selecciona Aplicar.
El certificado de instancia de aplicación del simulador está ahora en la lista de confianza del conector para OPC UA.
Agregar un dispositivo
En este paso, usará la experiencia de operaciones para agregar un dispositivo que le permita conectarse al simulador de OPC PLC. Para agregar un dispositivo:
Seleccione Dispositivos y, a continuación, Crear nuevo:
Escriba
opc-ua-connectorcomo nombre del dispositivo y seleccione Nuevo en el icono Microsoft.OpcUa :Escriba la siguiente información del punto de conexión entrante de Microsoft.OpcUa:
Campo Importancia Nombre del punto final opc-ua-connector-0URL del servidor OPC UA opc.tcp://opcplc-000000:50000Modo de autenticación de usuario Username password
En este tutorial, agregará nuevos secretos a la instancia de Azure Key Vault desde la interfaz de usuario web de la experiencia de operaciones. Los secretos se sincronizan automáticamente con el clúster de Kubernetes:
Para agregar una referencia de nombre de usuario, seleccione Agregar referencia y, a continuación, Crear nuevo.
Escriba
plcusernamecomo nombre del secreto ycontosousercomo valor secreto. Luego, seleccione Aplicar.Para agregar una referencia de contraseña, seleccione Agregar referencia y, a continuación, Crear nuevo.
Escriba
plcpasswordcomo el nombre del secreto y la contraseña que agregó al archivo opc-plc-deployment.yaml como valor secreto. Luego, seleccione Aplicar.En la página Detalles del dispositivo , seleccione Siguiente para ir a la página Información adicional .
En la página Agregar propiedades personalizadas, puede actualizar o agregar propiedades personalizadas al dispositivo. Seleccione Siguiente cuando haya terminado.
Para guardar la definición del dispositivo en la página Resumen , seleccione Crear.
Esta configuración implementa un nuevo dispositivo llamado opc-ua-connector con un punto de conexión llamado opc-ua-connector-0 al clúster. Puede ver el dispositivo en Azure Portal o puede usar kubectl para ver los dispositivos en el clúster de Kubernetes:
kubectl get device -n azure-iot-operations
Puede ver los secretos plcusername y plcpassword en la instancia de Azure Key Vault de su grupo de recursos. Los secretos se sincronizan con el clúster de Kubernetes, donde puede verlos mediante el kubectl get secret -n azure-iot-operations comando . También puede ver los secretos en la experiencia de gestión de operaciones en la página Administrar secretos sincronizados.
Administración de recursos
Después de seleccionar la instancia en la experiencia de operaciones, verá la lista disponible de recursos en la página Activos. Si aún no hay recursos, esta lista está vacía:
Creación de un recurso
Para crear un recurso, seleccione Crear recurso. A continuación, escriba la siguiente información del recurso:
| Campo | Importancia |
|---|---|
| Punto de conexión de entrada | opc-ua-connector-0 |
| Nombre de recurso | thermostat |
| Descripción | A simulated thermostat asset |
Quite las Propiedades personalizadas existentes y agregue las siguientes propiedades personalizadas. Tenga cuidado de usar los nombres de propiedad exactos, ya que la plantilla de Power BI en un tutorial posterior las consulta:
| Nombre de propiedad | Detalles de la propiedad |
|---|---|
| proceso por lotes | 102 |
| cliente | Contoso |
| equipamiento | Caldera |
| isSpare | cierto |
| ubicación | Seattle |
Seleccione Siguiente para ir a la página Conjuntos de datos .
Crear un conjunto de datos
Para crear un conjunto de datos, seleccione Crear conjunto de datos. Escriba los detalles del conjunto de datos que se muestran en la tabla siguiente:
| Campo | Importancia |
|---|---|
| Nombre del conjunto de datos | thermostat |
| Destino | MQTT |
| Tema | azure-iot-operations/data/thermostat |
Seleccione Crear y siguiente para guardar el conjunto de datos y acceder a la página Puntos de datos.
Sugerencia
Puede seleccionar Administrar la configuración predeterminada para cambiar el intervalo de muestreo predeterminado y el tamaño de la cola para cada punto de datos.
Creación de puntos de datos de OPC UA
Agregue un punto de datos de OPC UA en la página Puntos de datos . Para agregar un punto de datos, seleccione Agregar punto de datos. Escriba los detalles del punto de datos que se muestran en la tabla siguiente:
| Origen de datos | Nombre del punto de datos |
|---|---|
| ns=3;s=SpikeData | temperatura |
El valor del origen de datos aquí es un nodo específico del simulador de OPC UA. El nodo genera valores aleatorios dentro de un intervalo especificado y también tiene picos intermitentes.
Haga clic en Guardar.
Seleccione Siguiente para ir a la página Grupos de eventos y, a continuación, seleccione Siguiente para ir a la página Grupos de administración y, a continuación, Siguiente para ir a la página Revisar .
Revisar
Revise los detalles del recurso y la etiqueta y realice los ajustes necesarios antes de seleccionar Crear:
Esta configuración implementa un nuevo activo denominado thermostat en el clúster. También puede usar kubectl para ver los recursos localmente en el clúster:
kubectl get assets.namespace -n azure-iot-operations
Visualización de recursos en Azure Portal
Para ver el dispositivo y el recurso que creó en Azure Portal, vaya a Azure Device Registry:
El portal le habilita ver los detalles del recurso. Seleccione Vista JSON para obtener más detalles:
Comprobar que los datos fluyan
Comprueba que los datos fluyen al corredor MQTT mediante la herramienta de mosquitto_sub. En este ejemplo, ejecutas la herramienta de mosquitto_sub dentro de su clúster de Kubernetes:
Ejecuta el siguiente comando para implementar un pod que incluya las herramientas de mosquitto_pub y mosquitto_sub que son útiles para interactuar con el corredor MQTT en el clúster:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yamlEn el fragmento de código siguiente se muestra el archivo YAML que aplicaste:
# 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 certPrecaución
Esta configuración no es segura. No uses esta configuración en un entorno de producción.
Cuando se ejecute el pod de mqtt-client, ejecuta el siguiente comando para crear un entorno de shell en el pod que creaste:
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- shEn el shell de Bash del pod mqtt-client, ejecute el siguiente comando para conectarse al corredor MQTT mediante la herramienta mosquitto_sub y use un carácter comodín para suscribirse a los temas
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)Este comando continúa ejecutándose y muestra los mensajes a medida que llegan a cualquier tema
data/#hasta que presione Ctrl+C para detenerlo. Para salir del entorno de shell, escribaexit.
Para verificar que el recurso de termostato que agregó está publicando datos, revise los mensajes en el tema 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}}
Si no fluye ningún dato, reinicie el pod de aio-opc-opc.tcp-1:
Busque el nombre del pod de
aio-opc-opc.tcp-1mediante el comando siguiente:kubectl get pods -n azure-iot-operationsEl nombre del pod es similar a
aio-opc-opc.tcp-1-849dd78866-vhmz6.Reinicie el pod
aio-opc-opc.tcp-1mediante un comando similar al ejemplo siguiente. Use el nombre del podaio-opc-opc.tcp-1del paso anterior:kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
Las etiquetas de ejemplo que agregó en el tutorial anterior generan mensajes del recurso que tienen un aspecto similar al siguiente ejemplo:
{
"temperature":{
"Value":24.86898871648548,
"SourceTimestamp":"2025-04-25T14:50:07.195274Z"
}
}
¿Cómo solucionamos el problema?
En este tutorial, ha agregado un dispositivo y, a continuación, ha definido un recurso y etiquetas. Los recursos y las etiquetas modelan los datos del servidor OPC UA para facilitar el uso de esos datos en un MQTT broker y otros procesos posteriores.
Ha usado credenciales almacenadas en Azure Key Vault para autenticarse en el servidor de OPC UA. Este enfoque es más seguro que codificar de manera fija las credenciales en la definición de activos.
Use el recurso termostato que definió en el siguiente tutorial.
Limpieza de recursos
Si continúa con el siguiente tutorial, mantenga todos los activos.
Si quiere eliminar la implementación de Operaciones de IoT de Azure, pero quiere mantener el clúster, use el comando az iot ops delete:
az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Si quiere eliminar todos los recursos que ha creado para este inicio rápido, elimine el clúster de Kubernetes donde ha implementado Operaciones de IoT de Azure y quite el grupo de recursos de Azure que contenía el clúster.
Si usó Codespaces para estas guías de inicio rápido, elimine Codespace de GitHub.
Paso siguiente
Tutorial: Envío de mensajes desde el recurso a la nube mediante un flujo de datos.