Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Neste tutorial, você adiciona manualmente ativos OPC UA ao cluster de Operações IoT do Azure. Esses ativos publicam mensagens no agente MQTT em seu cluster de Operações do Azure IoT. Normalmente, um usuário OT conclui essas etapas.
Um ativo é um dispositivo físico ou entidade lógica que representa um dispositivo, uma máquina, um sistema ou um processo. Por exemplo, um ativo físico pode ser uma bomba, um motor, um tanque ou uma linha de produção. Um ativo lógico que você define pode ter propriedades, pontos de dados de fluxo ou gerar eventos.
Os servidores OPC UA são aplicações de software que comunicam com ativos. As tags OPC UA são pontos de dados que os servidores OPC UA expõem. As tags OPC UA podem fornecer dados históricos ou em tempo real sobre o status, desempenho, qualidade ou condição dos ativos.
Neste tutorial, você usa a interface do usuário da Web da experiência de operações para criar seus ativos. Você também pode usar a CLI do Azure para concluir algumas dessas tarefas.
Pré-requisitos
Uma instância do Azure IoT Operations com configurações seguras habilitadas implantadas em um cluster Kubernetes. Para criar uma instância, use uma das seguintes opções para implantar as Operações do Azure IoT:
- Guia de início rápido: Executar Operações IoT do Azure no GitHub Codespaces com K3s fornece instruções simples para implantar uma instância de Operações IoT do Azure que você pode usar para os tutoriais. Em seguida, para habilitar configurações seguras, siga as etapas em Habilitar configurações seguras no Azure IoT Operations.
- Visão geral da implantação fornece instruções detalhadas para implantar uma instância do Azure IoT Operations no Windows usando o Azure Kubernetes Service Edge Essentials ou Ubuntu usando K3s. Siga as etapas no artigo de implantação para uma implantação de configurações seguras e para instalar a versão mais recente.
Importante
Não é possível habilitar configurações seguras na instância criada se seguir as etapas no artigo Guia de início rápido: executar operações IoT do Azure no GitHub Codespaces com K3s .
Depois de habilitar as configurações seguras, o grupo de recursos que contém sua instância de Operações do Azure IoT também contém os seguintes recursos:
- Uma instância do Azure Key Vault para armazenar os segredos a serem sincronizados em seu cluster Kubernetes.
- Uma identidade gerenciada atribuída pelo usuário que o Azure IoT Operations usa para acessar a instância do Azure Key Vault.
- Uma identidade gerida atribuída pelo utilizador que os componentes do Azure IoT Operations, como fluxos de dados, podem usar para se conectar a endpoints na nuvem, como os Azure Event Hubs.
- Um namespace do Registro de Dispositivo do Azure para armazenar seus ativos e dispositivos.
Certifique-se de que, ao definir configurações seguras, conceda à sua conta de usuário permissões para gerenciar segredos com a função de Oficial de Segredos do Cofre de Chaves .
Para entrar na interface do usuário da Web da experiência de operações, você precisa de uma conta de ID do Microsoft Entra com pelo menos permissões de colaborador para o grupo de recursos que contém sua instância do Kubernetes - Azure Arc . Para saber mais, consulte Interface do usuário da Web da experiência de operações.
Salvo indicação em contrário, você pode executar os comandos do console neste tutorial em um ambiente Bash ou PowerShell.
Que problema vamos resolver?
Os dados que os servidores OPC UA expõem podem ter uma estrutura complexa e podem ser difíceis de entender. O Azure IoT Operations fornece uma maneira de modelar ativos OPC UA como tags, eventos e propriedades. Essa modelagem torna mais fácil entender os dados e usá-los em processos downstream, como o broker MQTT e fluxos de dados.
O tutorial também explica como usar credenciais armazenadas no Cofre de Chaves do Azure para autenticar no servidor OPC UA simulado.
Implante o simulador de PLC OPC
Este tutorial usa o simulador de PLC OPC para gerar dados de exemplo. Para implantar o simulador OPC PLC:
Baixe o arquivo opc-plc-tutorial-deployment.yaml do repositório GitHub. Para baixar usando a linha de comando, execute o seguinte 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 o arquivo baixado
opc-plc-tutorial-deployment.yamlem um editor de texto e altere a senha do simulador. A senha é definida usando o--defaultpasswordparâmetro. Anote o valor da senha, você precisa dela mais tarde. Em seguida, salve as alterações.Para implantar o simulador de PLC OPC no cluster, execute o seguinte comando:
kubectl apply -f opc-plc-tutorial-deployment.yaml
O trecho a seguir mostra o arquivo YAML que você aplicou:
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
Estabelecer confiança mútua
Antes que o simulador de PLC OPC possa enviar dados para o conector para OPC UA, você precisa estabelecer confiança mútua entre eles. Neste tutorial, o simulador de PLC OPC e o conector para OPC UA usam certificados autoassinados para estabelecer a confiança mútua com o conector para OPC UA:
- O certificado de instância do aplicativo do simulador é armazenado no segredo do
opc-plc-default-application-certKubernetes. - O conector para o certificado de instância do aplicativo OPC UA é armazenado no segredo do
aio-opc-opcuabroker-default-application-certKubernetes.
Importante
Em um ambiente de produção, use certificados de instância de aplicativo de nível empresarial para estabelecer a confiança mútua. Para saber mais, consulte Configurar um certificado de instância de aplicativo de nível empresarial.
Adicionar o certificado do conector à lista de confiança do simulador
Cada servidor OPC UA tem seu próprio mecanismo para gerenciar a lista de confiança. Para adicionar o certificado do conector à lista de confiança do simulador, execute os seguintes 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}"
Adicionar o certificado do simulador à lista de confiança do conector
Cada tipo de servidor OPC UA tem seu próprio mecanismo para gerenciar seu certificado de instância de aplicativo. Para baixar o certificado do simulador para um arquivo chamado opcplc-000000.crt, execute o seguinte 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 adicionar o certificado do simulador à lista de confiança do conector:
Vá para a interface web da experiência de operações e inicie sessão com as suas credenciais de ID do Microsoft Entra.
Selecione seu site. Se estiver a trabalhar com uma nova implantação, ainda não existem sites. Você pode encontrar o cluster criado anteriormente selecionando Exibir instâncias não atribuídas. Na experiência de operações, uma instância representa um cluster no qual você implantou as Operações do Azure IoT.
Selecione a instância onde você implantou as Operações do Azure IoT:
Gorjeta
Se você não vir nenhuma instância, talvez não esteja no locatário correto do Microsoft Entra ID. Você pode alterar o locatário no menu superior direito da experiência de operações.
Selecione Dispositivos e, em seguida, Gerenciar certificados e segredos:
Na página Certificados e segredos, selecione Adicionar novo certificado:
Selecione Carregar certificado, selecione OPC UA trust list como o armazenamento de certificados e, em seguida, escolha o
opcplc-000000.crtarquivo que você baixou anteriormente. Em seguida, selecione Carregar:Selecione Aplicar.
O certificado de instância do aplicativo do simulador agora está no conector para a lista de confiança do OPC UA.
Adicionar um dispositivo
Nesta etapa, você usa a experiência de operações para adicionar um dispositivo que permite que você se conecte ao simulador de PLC OPC. Para adicionar um dispositivo:
Selecione Dispositivos e, em seguida, Criar novo:
Digite
opc-ua-connectorcomo o nome do dispositivo e selecione Novo no bloco Microsoft.OpcUA :Insira as seguintes informações do endpoint de entrada Microsoft.OpcUa:
Campo Valor Nome do ponto final opc-ua-connector-0URL do servidor OPC UA opc.tcp://opcplc-000000:50000Modo de autenticação do usuário Username password
Neste tutorial, você adiciona novos segredos à sua instância do Azure Key Vault a partir do interface web da experiência operacional. Os segredos são sincronizados automaticamente com o cluster do Kubernetes:
Para adicionar uma referência de nome de usuário, selecione Adicionar referência e, em seguida, Criar nova.
Insira
plcusernamecomo o nome secreto econtosousercomo o valor secreto. Em seguida, selecione Aplicar.Para adicionar uma referência de senha, selecione Adicionar referência e, em seguida, Criar nova.
Digite
plcpasswordcomo o nome secreto e a senha que você adicionou ao arquivo opc-plc-deployment.yaml como o valor secreto. Em seguida, selecione Aplicar.Na página Detalhes do dispositivo , selecione Avançar para ir para a página Informações adicionais .
Na página Adicionar propriedades personalizadas , você pode, opcionalmente, atualizar ou adicionar propriedades personalizadas ao dispositivo. Selecione Avançar quando terminar.
Para salvar a definição do dispositivo na página Resumo , selecione Criar.
Essa configuração implanta um novo dispositivo chamado opc-ua-connector com um ponto de extremidade chamado opc-ua-connector-0 para o cluster. Você pode exibir o dispositivo no portal do Azure ou pode usar kubectl para exibir os dispositivos em seu cluster Kubernetes:
kubectl get device -n azure-iot-operations
Você pode ver os segredos plcusername e plcpassword na instância do Azure Key Vault no seu grupo de recursos. Os segredos são sincronizados com o cluster do Kubernetes, onde você pode vê-los usando o kubectl get secret -n azure-iot-operations comando. Você também pode ver os segredos na experiência de operações na página Gerenciar segredos sincronizados .
Gerir os seus recursos
Depois de selecionar sua instância na experiência de operações, você verá a lista disponível de ativos na página Ativos . Se ainda não houver ativos, esta lista está vazia:
Criar um ativo
Para criar um ativo, selecione Criar ativo. Em seguida, insira as seguintes informações de ativos:
| Campo | Valor |
|---|---|
| Ponto final de entrada | opc-ua-connector-0 |
| Nome do ativo | thermostat |
| Descrição | A simulated thermostat asset |
Remova as propriedades personalizadas existentes e adicione as seguintes propriedades personalizadas. Tenha cuidado para usar os nomes de propriedade exatos, como o modelo do Power BI em um tutorial posterior consulta para eles:
| Nome da propriedade | Detalhe do imóvel |
|---|---|
| lote | 102 |
| cliente | Contoso |
| Equipamentos | Caldeira |
| isSpare | verdadeiro |
| localização | Porto |
Selecione Avançar para ir para a página Conjuntos de dados .
Criar um conjunto de dados
Para criar um conjunto de dados, selecione Criar conjunto de dados. Insira os detalhes do conjunto de dados mostrados na tabela a seguir:
| Campo | Valor |
|---|---|
| Nome do conjunto de dados | thermostat |
| Destino | MQTT |
| Tópico | azure-iot-operations/data/thermostat |
Selecione Criar e seguinte para salvar o conjunto de dados e vá para a página Elementos de dados.
Gorjeta
Você pode selecionar Gerenciar configurações padrão para alterar o intervalo de amostragem padrão e o tamanho da fila para cada ponto de dados.
Criar pontos de dados OPC UA
Adicione um ponto de dados OPC UA na página Pontos de dados . Para adicionar um ponto de dados, selecione Adicionar ponto de dados. Insira os detalhes do ponto de dados mostrados na tabela a seguir:
| Fonte de dados | Nome do ponto de dados |
|---|---|
| ns=3; s=SpikeData | temperatura |
O valor da fonte de dados aqui é um nó específico do simulador OPC UA. O nó gera valores aleatórios dentro de um intervalo especificado e também tem picos intermitentes.
Selecione Guardar.
Selecione Avançar para ir para a página Grupos de eventos , selecione Avançar para ir para a página Grupos de gerenciamento e, em seguida, Avançar para ir para a página Revisão .
Rever
Revise os detalhes do ativo e da tag e faça os ajustes necessários antes de selecionar Criar:
Essa configuração implanta um novo ativo chamado thermostat para o cluster. Você também pode usar kubectl para exibir os ativos localmente em seu cluster:
kubectl get assets.namespace -n azure-iot-operations
Exibir recursos no portal do Azure
Para exibir o dispositivo e o ativo que você criou no portal do Azure, vá para o Registro de Dispositivo do Azure:
O portal permite visualizar os detalhes do ativo. Selecione JSON View para obter mais detalhes:
Verificar se os dados estão fluindo
Verifique se os dados estão fluindo para o broker MQTT usando a ferramenta mosquitto_sub . Neste exemplo, você executa a ferramenta mosquitto_sub dentro do cluster do Kubernetes:
Execute o seguinte comando para implantar um pod que inclua as ferramentas mosquitto_pub e mosquitto_sub que são úteis para interagir com o broker MQTT no cluster:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yamlO trecho a seguir mostra o arquivo YAML que você aplicou:
# 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 certAtenção
Esta configuração não é segura. Não use essa configuração em um ambiente de produção.
Quando o pod mqtt-client estiver em execução, execute o seguinte comando para criar um ambiente de shell no pod que você criou:
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- shNo shell Bash no pod mqtt-client , execute o seguinte comando para se conectar ao broker MQTT usando a ferramenta mosquitto_sub e use um curinga para assinar os
data/#tópicos: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 continua a ser executado e exibe as mensagens à medida que elas chegam em qualquer
data/#tópico até que você pressione Ctrl+C para pará-lo. Para sair do ambiente de shell, digiteexit.
Para verificar se o ativo de termostato que adicionou está publicando dados, veja as mensagens no tópico 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}}
Se não houver fluxo de dados, reinicie o aio-opc-opc.tcp-1 pod:
Encontre o nome do seu
aio-opc-opc.tcp-1pod usando o seguinte comando:kubectl get pods -n azure-iot-operationsO nome do seu pod é parecido com
aio-opc-opc.tcp-1-849dd78866-vhmz6.Reinicie o
aio-opc-opc.tcp-1pod usando um comando semelhante ao exemplo a seguir. Use o nome doaio-opc-opc.tcp-1pod da etapa anterior:kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
As tags de exemplo que você adicionou no tutorial anterior geram mensagens do seu ativo que se parecem com o exemplo a seguir:
{
"temperature":{
"Value":24.86898871648548,
"SourceTimestamp":"2025-04-25T14:50:07.195274Z"
}
}
Como resolvemos o problema?
Neste tutorial, você adicionou um dispositivo e, em seguida, definiu um ativo e tags. Os ativos e tags modelam dados do servidor OPC UA para tornar os dados mais fáceis de usar em um broker MQTT e outros processos downstream.
Você usou credenciais armazenadas no Azure Key Vault para autenticar no servidor OPC UA. Esta abordagem é mais segura do que inserir credenciais diretamente na configuração de ativos.
Você usa o recurso de termostato definido no próximo tutorial.
Clean up resources (Limpar recursos)
Se você continuar para o próximo tutorial, mantenha todos os seus recursos.
Se você quiser remover a implantação do Azure IoT Operations mas manter seu cluster, use o comando az iot ops delete :
az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Se você quiser excluir todos os recursos criados para este início rápido, exclua o cluster do Kubernetes onde você implantou as Operações do Azure IoT e, em seguida, remova o grupo de recursos do Azure que continha o cluster.
Se você usou Codespaces para esses inícios rápidos, exclua seu Codespace do GitHub.
Próximo passo
Tutorial: Envie mensagens do seu ativo para a nuvem usando um fluxo de dados.