Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве вы вручную добавите ресурсы OPC UA в кластер операций Интернета вещей Azure. Эти ресурсы публикуют сообщения в брокере MQTT в кластере операций Интернета вещей Azure. Как правило, пользователь OT выполняет эти действия.
Ресурс — это физическое устройство или логическая сущность, представляющая устройство, компьютер, систему или процесс. Например, физический ресурс может быть насосом, двигателем, танком или производственной линией. Логический ресурс, который определяется, может иметь свойства, точки потоковой передачи данных или создавать события.
Серверы OPC UA — это программные приложения, взаимодействующие с ресурсами. Теги OPC UA — это точки данных, предоставляемые серверами OPC UA. Теги OPC UA могут предоставлять данные в режиме реального времени или исторические данные о состоянии, производительности, качестве или условии активов.
В этом руководстве вы используете веб-интерфейс веб-интерфейса операций для создания ресурсов. Вы также можете использовать Azure CLI для выполнения некоторых из этих задач.
Необходимые компоненты
Экземпляр операций Интернета вещей Azure с включенными безопасными параметрами, развернутыми в кластере Kubernetes. Чтобы создать экземпляр, используйте одно из следующих действий для развертывания операций Интернета вещей Azure.
- Краткое руководство. Запуск операций Интернета вещей Azure в GitHub Codespaces с K3s предоставляет простые инструкции по развертыванию экземпляра Операций Интернета вещей Azure, который можно использовать для учебников. Затем, чтобы включить безопасные параметры, выполните действия, описанные в разделе "Включение безопасных параметров в операциях Интернета вещей Azure".
- Общие сведения о развертывании содержат подробные инструкции по развертыванию экземпляра Операций Интернета вещей Azure в Windows с помощью Служба Azure Kubernetes Edge Essentials или Ubuntu с помощью K3s. Выполните действия, описанные в статье о развертывании с безопасными параметрами, и установите последнюю версию.
Это важно
Невозможно включить безопасные параметры в создаваемом экземпляре, если следовать действиям, описанным в статье «Краткий старт: запуск операций Azure IoT в GitHub Codespaces с K3s».
После включения безопасных параметров группа ресурсов, содержащая экземпляр Операций Интернета вещей Azure, также содержит следующие ресурсы:
- Экземпляр службы Azure Key Vault для хранения секретов, которые нужно синхронизировать с вашим кластером Kubernetes.
- Управляемое пользователем назначенное удостоверение, которое операции Azure IoT используют для доступа к экземпляру Azure Key Vault.
- Управляемое удостоверение, назначаемое пользователем, которое могут использовать компоненты Операций Интернета вещей Azure, такие как потоки данных, для подключения к облачным конечным точкам, таким как Центры событий Azure.
- Пространство имен реестра устройств Azure для хранения ваших активов и устройств.
Убедитесь, что при настройке безопасных параметров вы предоставляете учетной записи пользователя разрешения на управление секретами с помощью роли Key Vault Secrets Officer.
Чтобы войти в веб-интерфейс взаимодействия с операциями, требуется учетная запись идентификатора Microsoft Entra с по крайней мере разрешениями участника для группы ресурсов, содержащей экземпляр Kubernetes — Экземпляр Azure Arc . Дополнительные сведения см. в статье о веб-интерфейсе операций.
Если иное не указано, можно запустить команды консоли в этом руководстве в среде Bash или PowerShell.
Какая проблема будет решена?
Данные, предоставляемые серверами OPC UA, могут иметь сложную структуру и могут быть трудно понять. Операции Интернета вещей Azure позволяют моделировать ресурсы OPC UA в виде тегов, событий и свойств. Это моделирование упрощает понимание данных и его использование в подчиненных процессах, таких как брокер MQTT и потоки данных.
В этом руководстве также объясняется, как использовать учетные данные, хранящиеся в Azure Key Vault, для проверки подлинности на имитированном сервере OPC UA.
Развертывание симулятора OPC PLC
В этом руководстве используется симулятор OPC PLC для создания примеров данных. Чтобы развернуть симулятор OPC PLC, выполните следующие действия.
Скачайте файл opc-plc-tutorial-deployment.yaml из репозитория GitHub. Чтобы скачать с помощью командной строки, выполните следующую команду:
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.yamlopc-plc-tutorial-deployment.yamlОткройте файл, скачанный в текстовом редакторе, и измените пароль для симулятора. Пароль задается с помощью--defaultpasswordпараметра. Запишите значение пароля, которое потребуется позже. Затем сохраните изменения.Чтобы развернуть симулятор OPC PLC в кластере, выполните следующую команду:
kubectl apply -f opc-plc-tutorial-deployment.yaml
В следующем фрагменте кода показан примененный ФАЙЛ YAML:
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
Установление взаимного доверия
Прежде чем симулятор OPC PLC может отправлять данные в соединитель для OPC UA, необходимо установить взаимное доверие между ними. В этом руководстве симулятор OPC PLC и соединитель для OPC UA используют самозаверяющие сертификаты для установления взаимного доверия с соединителем для OPC UA:
- Сертификат экземпляра приложения симулятора хранится в секрете
opc-plc-default-application-certKubernetes. - Коннектор для сертификата экземпляра приложения OPC UA хранится в секрете Kubernetes
aio-opc-opcuabroker-default-application-cert.
Это важно
В рабочей среде используйте сертификаты экземпляра приложения корпоративного уровня для установления взаимного доверия. Дополнительные сведения см. в статье "Настройка сертификата экземпляра приложения корпоративного уровня".
Добавление сертификата соединителя в список доверия симулятора
Каждый сервер OPC UA имеет собственный механизм управления списком доверия. Чтобы добавить сертификат соединителя в список доверия симулятора, выполните следующие команды:
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}"
Добавьте сертификат симулятора в список доверия соединителя
Каждый тип сервера OPC UA имеет собственный механизм управления сертификатом экземпляра приложения. Чтобы скачать сертификат симулятора в файл с именем opcplc-000000.crt, выполните следующую команду:
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
Чтобы добавить сертификат эмулятора в список доверия соединителя:
Перейдите на веб-интерфейс опыта работы с операциями и войдите, используя свои учетные данные Microsoft Entra ID.
Выберите свой сайт. Если вы работаете с новым внедрением, сайтов еще нет. Кластер, созданный ранее, можно найти, выбрав "Просмотреть неподписанные экземпляры". В интерфейсе операций экземпляр представляет кластер, в котором развернуты операции Интернета вещей Azure.
Выберите экземпляр, в котором развернуты операции Интернета вещей Azure:
Совет
Если вы не видите никаких экземпляров, возможно, вы не будете в правильном клиенте Идентификатора Microsoft Entra. Вы можете изменить клиент в правом верхнем меню в интерфейсе операций.
Выберите устройства , а затем управляйте сертификатами и секретами:
На странице "Сертификаты и секреты" выберите "Добавить новый сертификат":
Выберите " Отправить сертификат", выберите список доверия OPC UA в качестве хранилища сертификатов, а затем выберите скачанный
opcplc-000000.crtранее файл. Затем нажмите кнопку "Отправить":Нажмите кнопку "Применить".
Сертификат экземпляра приложения симулятора теперь находится в соединителе для списка доверия OPC UA.
Добавление устройства
На этом шаге вы используете интерфейс операций для добавления устройства, которое позволяет подключаться к симулятору OPC PLC. Чтобы добавить устройство, выполните приведенные действия.
Выберите Устройства, а затем Создать новое:
Введите
opc-ua-connectorв качестве имени устройства и выберите Новый на плитке Microsoft.OpcUa.Введите следующие сведения о входящей конечной точке Microsoft.OpcUa:
Поле значение Имя конечной точки opc-ua-connector-0URL-адрес сервера OPC UA opc.tcp://opcplc-000000:50000Режим проверки подлинности пользователя Username password
В этом руководстве вы добавите новые секреты в экземпляр Azure Key Vault через веб-интерфейс управления. Секреты автоматически синхронизируются с кластером Kubernetes:
Чтобы добавить ссылку на имя пользователя, выберите "Добавить ссылку" и "Создать".
Введите
plcusernameимя секрета иcontosouserзначение секрета. Затем нажмите кнопку "Применить".Чтобы добавить ссылку на пароль, нажмите кнопку "Добавить ссылку" и "Создать".
Введите
plcpasswordкак имя секрета, а пароль, который был добавлен в файл opc-plc-deployment.yaml, как значение секрета. Затем нажмите кнопку "Применить".На странице сведений об устройстве нажмите кнопку "Далее ", чтобы перейти на страницу "Дополнительные сведения ".
На странице "Добавление настраиваемого свойства " можно дополнительно обновить или добавить настраиваемые свойства на устройство. Нажмите кнопку "Далее", когда вы закончите.
Чтобы сохранить определение устройства на странице Сводка, выберите Создать.
Эта конфигурация развёртывает новое устройство под названием opc-ua-connector с конечной точкой под названием opc-ua-connector-0 в кластере. Устройство можно просмотреть на портале Azure или использовать kubectl для просмотра устройств в кластере Kubernetes:
kubectl get device -n azure-iot-operations
Вы можете просмотреть секреты plcusername и plcpassword в экземпляре Azure Key Vault в вашей группе ресурсов. Секреты синхронизируются с кластером Kubernetes, где их можно просмотреть с помощью kubectl get secret -n azure-iot-operations команды. Вы также можете просмотреть секреты в опыте операций на странице «Управление синхронизированными секретами».
Управление ресурсами
После выбора экземпляра в операциях вы увидите доступный список ресурсов на странице "Активы ". Если еще нет ресурсов, этот список пуст:
Создание актива
Чтобы создать ресурс, нажмите кнопку "Создать ресурс". Затем введите следующие сведения о ресурсах:
| Поле | значение |
|---|---|
| Конечная точка для входящего трафика | opc-ua-connector-0 |
| Имя ресурса | thermostat |
| Описание | A simulated thermostat asset |
Удалите существующие настраиваемые свойства и добавьте следующие настраиваемые свойства. Будьте осторожны, чтобы использовать точные имена свойств, так как шаблон Power BI в последующих запросах руководства для них:
| Имя свойства | Сведения о свойстве |
|---|---|
| партия | 102 |
| клиент | Контосо |
| оборудование | Бойлер |
| isSpare | правда |
| расположение | Сиэтл |
Нажмите кнопку "Далее ", чтобы перейти на страницу наборов данных .
Создание набора данных
Чтобы создать набор данных, выберите "Создать набор данных". Введите сведения о наборе данных, показанные в следующей таблице:
| Поле | значение |
|---|---|
| Имя набора данных | thermostat |
| Место назначения | MQTT |
| Тема | azure-iot-operations/data/thermostat |
Нажмите Создать и далее, чтобы сохранить набор данных и перейти на страницу данных.
Совет
Вы можете выбрать "Управление параметрами по умолчанию", чтобы изменить интервал выборки по умолчанию и размер очереди для каждой точки данных.
Создание точек данных OPC UA
Добавьте точку данных OPC UA на странице точек данных . Чтобы добавить точку данных, выберите "Добавить точку данных". Введите сведения о точке данных, показанные в следующей таблице:
| Источник данных | Имя точки данных |
|---|---|
| ns=3; s=SpikeData | Температура |
Здесь используется определенный узел симулятора OPC UA. Узел создает случайные значения в указанном диапазоне и также имеет временные пики.
Нажмите кнопку "Сохранить".
Нажмите Далее, чтобы перейти на страницу Группы событий, затем нажмите Далее, чтобы перейти на страницу Группы управления, и потом Далее, чтобы перейти на страницу Проверка.
Отзыв
Просмотрите сведения о активе и теге и внесите необходимые изменения перед нажатием кнопки "Создать":
Эта конфигурация развертывает новый ресурс, вызываемого thermostat в кластере. Вы также можете использовать kubectl для просмотра ресурсов локально в кластере:
kubectl get assets.namespace -n azure-iot-operations
Просмотр ресурсов в портал Azure
Чтобы просмотреть устройство и ресурс, созданный на портале Azure, перейдите в реестр устройств Azure:
Портал позволяет просматривать сведения о ресурсе. Выберите представление JSON для получения дополнительных сведений:
Проверка потока данных
Убедитесь, что данные передаются брокеру MQTT с помощью средства mosquitto_sub . В этом примере вы запустите средство mosquitto_sub в кластере Kubernetes:
Выполните следующую команду, чтобы развернуть модуль pod, включающий средства mosquitto_pub и mosquitto_sub , которые полезны для взаимодействия с брокером MQTT в кластере:
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yamlВ следующем фрагменте кода показан примененный ФАЙЛ YAML:
# 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Внимание
Эта конфигурация не безопасна. Не используйте эту конфигурацию в рабочей среде.
При запуске модуля pod mqtt-client выполните следующую команду, чтобы создать среду оболочки в созданном модуле pod:
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- shВ оболочке Bash в модуле pod mqtt-client выполните следующую команду, чтобы подключиться к брокеру MQTT с помощью средства mosquitto_sub и использовать подстановочный знак для подписки на
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)Эта команда продолжает выполняться и отображает сообщения по мере их поступления в любые
data/#разделы, пока не нажимаете клавиши CTRL+C , чтобы остановить его. Чтобы выйти из среды оболочки, введитеexit.
Чтобы убедиться, что добавленный объект термостата публикует данные, просмотрите сообщения в теме 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}}
Если поток данных отсутствует, перезапустите aio-opc-opc.tcp-1 модуль pod:
Найдите имя pod
aio-opc-opc.tcp-1с помощью следующей команды:kubectl get pods -n azure-iot-operationsИмя модуля pod выглядит следующим образом
aio-opc-opc.tcp-1-849dd78866-vhmz6.aio-opc-opc.tcp-1Перезапустите pod с помощью команды, которая выглядит следующим образом.aio-opc-opc.tcp-1Используйте имя pod из предыдущего шага:kubectl delete pod aio-opc-opc.tcp-1-849dd78866-vhmz6 -n azure-iot-operations
Примеры тегов, добавленные в предыдущем руководстве, создают сообщения из ресурса, которые выглядят следующим образом:
{
"temperature":{
"Value":24.86898871648548,
"SourceTimestamp":"2025-04-25T14:50:07.195274Z"
}
}
Как мы решили проблему?
В этом руководстве вы добавили устройство, а затем определили актив и метки. Данные модели ресурсов и тегов с сервера OPC UA упрощают использование данных в брокере MQTT и других подчиненных процессах.
Вы использовали учетные данные, хранящиеся в Azure Key Vault для проверки подлинности на сервере OPC UA. Этот подход является более безопасным, чем жесткое кодирование учетных данных в определении ассета.
Вы используете ресурс термостата, определенный в следующем руководстве.
Очистка ресурсов
Если вы продолжаете работу со следующим руководством, сохраните все ресурсы.
Если вы хотите удалить развертывание Операций Интернета вещей Azure, но сохранить кластер, используйте команду az iot ops delete :
az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP
Если вы хотите удалить все ресурсы, созданные для этого краткого руководства, удалите кластер Kubernetes, где вы развернули операции Интернета вещей Azure, а затем удалите группу ресурсов Azure, содержащую кластер.
Если вы использовали пространства кода для этих кратких руководств, удалите пространство Codespace из GitHub.
Следующий шаг
Руководство. Отправка сообщений из ресурса в облако с помощью потока данных.