Поделиться через


Руководство. Добавление ресурсов OPC UA в кластер операций Интернета вещей Azure

В этом руководстве вы вручную добавите ресурсы OPC UA в кластер операций Интернета вещей Azure. Эти ресурсы публикуют сообщения в брокере MQTT в кластере операций Интернета вещей Azure. Как правило, пользователь OT выполняет эти действия.

Ресурс — это физическое устройство или логическая сущность, представляющая устройство, компьютер, систему или процесс. Например, физический ресурс может быть насосом, двигателем, танком или производственной линией. Логический ресурс, который вы определяете, может иметь свойства, потоковую телеметрию или создавать события.

Серверы OPC UA — это программные приложения, взаимодействующие с ресурсами. Теги OPC UA — это точки данных, предоставляемые серверами OPC UA. Теги OPC UA могут предоставлять данные в режиме реального времени или исторические данные о состоянии, производительности, качестве или условии активов.

В этом руководстве вы используете веб-интерфейс веб-интерфейса операций для создания ресурсов. Вы также можете использовать Azure CLI для выполнения некоторых из этих задач.

Необходимые компоненты

Экземпляр операций Интернета вещей Azure, развернутых в кластере Kubernetes. Чтобы создать экземпляр, используйте одно из следующих действий для развертывания операций Интернета вещей Azure.

Чтобы войти в веб-интерфейс взаимодействия с операциями, требуется учетная запись идентификатора Microsoft Entra с по крайней мере разрешениями участника для группы ресурсов, содержащей экземпляр Kubernetes — Экземпляр Azure Arc . Дополнительные сведения см. в статье о веб-интерфейсе операций.

Если иное не указано, можно запустить команды консоли в этом руководстве в среде Bash или PowerShell.

Какая проблема будет решена?

Данные, предоставляемые серверами OPC UA, могут иметь сложную структуру и могут быть трудно понять. Операции Интернета вещей Azure позволяют моделировать ресурсы OPC UA в виде тегов, событий и свойств. Это моделирование упрощает понимание данных и его использование в подчиненных процессах, таких как брокер MQTT и потоки данных.

Развертывание симулятора OPC PLC

В этом руководстве используется симулятор OPC PLC для создания примеров данных. Чтобы развернуть симулятор OPC PLC, выполните следующую команду:

kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/opc-plc-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:
          - "--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

Внимание

Эта конфигурация не безопасна. Не используйте эту конфигурацию в рабочей среде.

Вход в интерфейс операций

Чтобы создать конечные точки активов, ресурсы и подписаться на теги и события OPC UA, используйте интерфейс операций.

Перейдите к работе в браузере и войдите с помощью учетных данных идентификатора Microsoft Entra.

Выбор сайта

Сайт — это семейство экземпляров Операций Интернета вещей Azure. Сайты обычно группировать экземпляры по физическому расположению и упрощают поиск и управление ресурсами пользователями OT. ИТ-администратор создает сайты и назначает им экземпляры операций Интернета вещей Azure. Так как вы работаете с новым развертыванием, еще нет сайтов. Кластер, созданный ранее, можно найти, выбрав "Просмотреть неподписанные экземпляры". В интерфейсе операций экземпляр представляет кластер, в котором развернуты операции Интернета вещей Azure.

Снимок экрана: узел неподписанных экземпляров в интерфейсе операций.

Выбор экземпляра

Выберите экземпляр, в котором вы развернули операции Интернета вещей Azure в предыдущем руководстве:

Снимок экрана: список экземпляров Операций Интернета вещей Azure.

Совет

Если вы не видите никаких экземпляров, возможно, вы не будете в правильном клиенте Идентификатора Microsoft Entra. Вы можете изменить клиент в правом верхнем меню в интерфейсе операций.

Добавление конечной точки ресурса

При развертывании Операций Интернета вещей Azure в предыдущей статье вы включили встроенный симулятор OPC PLC. На этом шаге вы добавите конечную точку ресурса, которая позволяет подключаться к симулятору OPC PLC.

Чтобы добавить конечную точку ресурса, выполните приведенные действия.

  1. Выберите конечные точки ресурса и создайте конечную точку ресурса:

    Снимок экрана: страница конечных точек активов в интерфейсе операций.

  2. Введите следующие сведения о конечной точке:

    Поле значение
    Имя конечной точки ресурса opc-ua-connector-0
    URL-адрес сервера OPC UA opc.tcp://opcplc-000000:50000
    Режим проверки подлинности пользователя Anonymous
  3. Чтобы сохранить определение, нажмите кнопку "Создать".

    Эта конфигурация развертывает новую конечную точку ресурса, вызываемую opc-ua-connector-0 в кластере. Вы можете использовать kubectl для просмотра конечных точек ресурса:

    kubectl get assetendpointprofile -n azure-iot-operations
    

Управление ресурсами

После выбора экземпляра в операциях вы увидите доступный список ресурсов на странице "Активы ". Если еще нет ресурсов, этот список пуст:

Снимок экрана: список пустых активов операций Интернета вещей Azure.

Создание актива

Чтобы создать ресурс, нажмите кнопку "Создать ресурс". Затем введите следующие сведения о ресурсах:

Поле значение
Конечная точка ресурса opc-ua-connector-0
Имя ресурса thermostat
Description A simulated thermostat asset
Раздел MQTT по умолчанию azure-iot-operations/data/thermostat

Удалите существующие настраиваемые свойства и добавьте следующие настраиваемые свойства. Будьте осторожны, чтобы использовать точные имена свойств, так как шаблон Power BI в последующих запросах руководства для них:

Имя свойства Сведения о свойстве
batch 102
клиент Contoso
оборудование Бойлер
isSpare true
расположение Seattle

Снимок экрана: страница сведений о ресурсе Операций Интернета вещей Azure.

Нажмите кнопку "Далее", чтобы перейти на страницу "Добавить теги".

Создание тегов OPC UA

Добавьте два тега OPC UA на страницу добавления тегов . Чтобы добавить каждый тег, выберите "Добавить тег" или "CSV ", а затем нажмите кнопку "Добавить тег". Введите сведения о теге, показанные в следующей таблице:

Идентификатор узла Имя тега Режим наблюдаемости
ns=3; s=FastUInt10 Температура нет
ns=3; s=FastUInt100 Тег 10 нет

Режим наблюдаемости является одним из следующих значений: None, , Gauge, CounterHistogramили Log.

Вы можете выбрать "Управление параметрами по умолчанию", чтобы изменить интервал выборки по умолчанию и размер очереди для каждого тега.

Снимок экрана: страница добавления тега операций Интернета вещей Azure.

Нажмите кнопку "Далее", чтобы перейти на страницу "Добавить события", а затем перейдите на страницу "Рецензирование".

Отзыв

Просмотрите сведения о активе и теге и внесите необходимые изменения перед нажатием кнопки "Создать":

Снимок экрана: страница проверки активов в Операциях Интернета вещей Azure.

Эта конфигурация развертывает новый ресурс, вызываемого thermostat в кластере. Вы можете использовать kubectl для просмотра ресурсов:

kubectl get assets -n azure-iot-operations

Просмотр ресурсов в портал Azure

Чтобы просмотреть конечную точку ресурса и ресурс, созданный в портал Azure, перейдите в группу ресурсов, содержащую экземпляр Операций Интернета вещей Azure. Вы можете просмотреть ресурс термостата в группе ресурсов Операций Интернета вещей Azure. Если выбрать "Показать скрытые типы", можно также увидеть конечную точку ресурса:

Снимок экрана: портал Azure с группой ресурсов Azure IoT Operations, включая конечную точку ресурса и ресурса.

Портал позволяет просматривать сведения о ресурсе. Выберите представление JSON для получения дополнительных сведений:

Снимок экрана: сведения о ресурсе Операций Интернета вещей Azure в портал Azure.

Проверка потока данных

Убедитесь, что данные передаются брокеру MQTT с помощью средства mosquitto_sub . В этом примере вы запустите средство mosquitto_sub в кластере Kubernetes:

  1. Выполните следующую команду, чтобы развернуть модуль 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
    

    Внимание

    Эта конфигурация не безопасна. Не используйте эту конфигурацию в рабочей среде.

  2. При запуске модуля pod mqtt-client выполните следующую команду, чтобы создать среду оболочки в созданном модуле pod:

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  3. В оболочке Bash в модуле pod mqtt-client выполните следующую команду, чтобы подключиться к брокеру MQTT с помощью средства mosquitto_sub , подписанного на data/thermostat раздел:

    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/thermostat раздел, пока не нажимаете клавиши CTRL+C , чтобы остановить его. Чтобы выйти из среды оболочки, введите exit.

Чтобы убедиться, что добавленный ресурс термостата публикует данные, просмотрите данные телеметрии в 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}}

Если поток данных отсутствует, перезапустите aio-opc-opc.tcp-1 модуль pod:

  1. Найдите имя pod aio-opc-opc.tcp-1 с помощью следующей команды:

    kubectl get pods -n azure-iot-operations
    

    Имя модуля pod выглядит следующим образом aio-opc-opc.tcp-1-849dd78866-vhmz6.

  2. 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": {
        "SourceTimestamp": "2024-08-02T13:52:15.1969959Z",
        "Value": 2696
    },
    "Tag 10": {
        "SourceTimestamp": "2024-08-02T13:52:15.1970198Z",
        "Value": 2696
    }
}

Как мы решили проблему?

В этом руководстве вы добавили конечную точку ресурса, а затем определили ресурс и теги. Данные модели ресурсов и тегов с сервера OPC UA упрощают использование данных в брокере MQTT и других подчиненных процессах. Вы используете ресурс термостата, определенный в следующем руководстве.

Очистка ресурсов

Если вы продолжаете работу со следующим руководством, сохраните все ресурсы.

Если вы хотите удалить развертывание Операций Интернета вещей Azure, но сохранить кластер, используйте команду az iot ops delete :

az iot ops delete --cluster $CLUSTER_NAME --resource-group $RESOURCE_GROUP

Если вы хотите удалить все ресурсы, созданные для этого краткого руководства, удалите кластер Kubernetes, где вы развернули операции Интернета вещей Azure, а затем удалите группу ресурсов Azure, содержащую кластер.

Если вы использовали пространства кода для этих кратких руководств, удалите пространство Codespace из GitHub.

Следующий шаг

Руководство. Отправка данных телеметрии активов в облако с помощью потока данных.