你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:将 OPC UA 资产添加到 Azure IoT 操作预览版群集

重要

Azure IoT 操作预览版(由 Azure Arc 启用)当前处于预览状态。 不应在生产环境中使用此预览版软件。

在正式发布版本推出后,你需要部署新的 Azure IoT 操作安装。 无法升级预览版安装。

有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Microsoft Azure 预览版的补充使用条款

在本快速入门中,你会手动将 OPC UA 资产添加到 Azure IoT 操作预览版群集。 这些资产将消息发布到 Azure IoT 操作群集中的 MQTT 代理。 通常,OT 用户完成这些步骤。

资产是表示设备、计算机、系统或流程的物理设备或逻辑实体。 例如,物理资产可以是泵、电机、储罐或生产线。 定义的逻辑资产可以具有属性、流遥测或生成事件。

OPC UA 服务器是与资产通信的软件应用程序。 OPC UA 标记是 OPC UA 服务器公开的数据点。 OPC UA 标记可以提供有关资产状态、性能、质量或条件的实时或历史数据。

在本快速入门中,你将使用操作体验 Web UI 创建资产。 还可以使用 Azure CLI 完成其中一些任务

先决条件

完成 快速入门:在 GitHub Codespaces 中使用 K3s 运行 Azure IoT 操作预览版,然后再开始本快速入门。

若要登录到操作体验,你需要在部署了 Azure IoT 操作的租户中拥有一个工作或学校帐户。 如果你当前使用的是 Microsoft 帐户 (MSA),则需要创建一个 Microsoft Entra ID 并使其对包含你的 Kubernetes - Azure Arc 实例的资源组至少具有参与者权限。 若要了解详细信息,请参阅已知问题 > 创建 Entra 帐户

我们将解决什么问题?

OPC UA 服务器公开的数据可能具有复杂的结构,并且难以理解。 Azure IoT 操作提供了一种将 OPC UA 资产建模为标记、事件和属性的方法。 通过此建模,可以更轻松地了解数据并在下游流程(例如,MQTT 代理和 数据处理器预览版管道)中使用它。

登录到操作体验

要创建资产终结点、资产和订阅 OPC UA 标记和事件,请使用操作体验。

浏览到浏览器中的操作体验,并使用 Microsoft Entra ID 凭据登录。

显示操作体验中未分配实例节点的屏幕截图。

重要

你必须使用工作或学校帐户登录到操作体验。 若要了解详细信息,请参阅已知问题 > 创建 Entra 帐户

选择站点

登录后,门户会显示你有权访问的站点列表。 每个站点都是 Azure IoT 操作实例的集合,可在其中配置资产。 IT 管理员负责将实例组织到站点并向组织中的 OT 用户授予访问权限。 由于你正在使用新部署,因此还没有站点。 可以通过选择“未分配的实例”来查找在上一个快速入门中创建的群集。 在门户中,实例表示在其中部署了 Azure IoT 操作的群集。

选择实例

选择在上一个快速入门中你将 Azure IoT 操作部署到的实例:

Azure IoT 操作实例列表的屏幕截图。

提示

如果没有看到任何实例,则可能不在正确的 Microsoft Entra ID 租户中。 可以在门户的右上角菜单中更改租户。

添加资产终结点

在上一篇文章中部署 Azure IoT 操作时,包括了一个内置的 OPC PLC 模拟器。 在此步骤中,你会添加资产终结点,使你能够连接到 OPC PLC 模拟器。

要添加资产终结点:

  1. 依次选择“资产终结点”、“创建资产终结点”

    显示操作体验中“资产终结点”页的屏幕截图。

  2. 输入以下终结点信息:

    字段
    资产终结点名称 opc-ua-connector-0
    OPC UA 服务器 URL opc.tcp://opcplc-000000:50000
    用户身份验证模式 Anonymous
  3. 若要保存定义,请选择“创建”

    此配置将调用 opc-ua-connector-0 的新资产终结点部署到群集。 可使用 kubectl 查看资产终结点:

    kubectl get assetendpointprofile -n azure-iot-operations
    

配置模拟器

这些快速入门使用 OPC PLC 模拟器生成示例数据。 若要启用快速入门方案,需要将资产终结点配置为在没有建立相互信任的情况下进行连接。 不建议在生产或预生产环境中使用此配置:

  1. 若要为快速入门方案配置资产终结点,请运行以下命令:

    kubectl patch AssetEndpointProfile opc-ua-connector-0 -n azure-iot-operations --type=merge -p '{"spec":{"additionalConfiguration":"{\"applicationName\":\"opc-ua-connector-0\",\"security\":{\"autoAcceptUntrustedServerCertificates\":true}}"}}'
    

    注意

    请勿在生产或预生产环境中使用此配置。 在没有正确执行身份验证的情况下将群集暴露在 Internet 中,可能会导致未经授权的访问,甚至导致 DDOS 攻击。

    若要了解详细信息,请参阅部署 OPC PLC 模拟器部分。

  2. 要使配置更改立即生效,请先使用以下命令查找 aio-opc-supervisor Pod 的名称:

    kubectl get pods -n azure-iot-operations
    

    Pod 的名称类似于 aio-opc-supervisor-956fbb649-k9ppr

  3. 使用类似于以下示例的命令重启 aio-opc-supervisor Pod。 使用上一步中的 aio-opc-supervisor Pod 名称:

    kubectl delete pod aio-opc-supervisor-956fbb649-k9ppr -n azure-iot-operations
    

定义资产后,OPC UA 连接器 Pod 会发现该资产。 Pod 使用你在资产定义中指定的资产终结点连接到 OPC UA 服务器。 可使用 kubectl 查看添加资产终结点时创建的发现 Pod。 Pod 名称如下所示 aio-opc-opc.tcp-1-8f96f76-kvdbt

kubectl get pods -n azure-iot-operations

OPC PLC 模拟器运行时,数据从模拟器流向连接器,流向 OPC UA 连接器,最后流向 MQTT 代理。

管理资产

在操作体验中选择实例后,可在“资产”页上看到可用资产列表。 如果尚无资产,则此列表为空:

Azure IoT 操作空资产列表的屏幕截图。

创建资产

要创建资产,请选择“创建资产”。 然后输入以下资产信息:

字段
资产终结点 opc-ua-connector-0
资产名称 thermostat
说明 A simulated thermostat asset

删除现有自定义属性并添加以下自定义属性。 请小心使用确切的属性名称,因为稍后的快速入门中的 Power BI 模板会对其进行查询:

属性名称 属性详细信息
批处理 102
客户 Contoso
设备 Boiler
isSpare
location Seattle

Azure IoT 操作资产详细信息页的屏幕截图。

选择“下一步”转到“添加标记”页

创建 OPC UA 标记

在“添加标记”页上添加两个 OPC UA 标记。 若要添加每个标记,请依次选择“添加标记或 CSV”、“添加标记”。 输入下表中显示的标记详细信息:

节点 ID 标记名称 可观测性模式
ns=3;s=FastUInt10 温度
ns=3;s=FastUInt100 标记 10

“可观测性模式”是以下值之一:nonegaugecounterhistogramlog

可以选择“管理默认设置”,以更改每个标记的默认采样间隔和队列大小。

Azure IoT 操作添加标记页的屏幕截图。

选择“下一步”转到“添加事件”页,然后选择“下一步”转到“查看”页

审阅

在选择“创建”之前,请查看资产和标记详细信息并进行任何调整:

Azure IoT 操作创建资产评审页的屏幕截图。

验证数据是否流动

使用 mosquitto_sub 工具验证数据是否流向 MQTT 代理。 在此示例中,你将在 Kubernetes 群集中运行 mosquitto_sub 工具

  1. 运行以下命令来部署包含 mosquitto_pub 和 mosquitto_sub 工具的 Pod,这些工具可用于与群集中的 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
    # 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-mq-dmqtt-frontend.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: mq-sat
          mountPath: /var/run/secrets/tokens
        - name: trust-bundle
          mountPath: /var/run/certs
      volumes:
      - name: mq-sat
        projected:
          sources:
          - serviceAccountToken:
              path: mq-sat
              audience: aio-mq # Must match audience in BrokerAuthentication
              expirationSeconds: 86400
      - name: trust-bundle
        configMap:
          name: aio-ca-trust-bundle-test-only # Default root CA cert
    

    注意

    此配置是不安全的。 请勿在生产环境中使用此配置。

  2. 运行 mqtt-client pod 时,请运行以下命令以在所创建的 Pod 中创建 shell 环境

    kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh
    
  3. 在 mqtt-client pod 中的 shell 中,运行以下命令,使用订阅 data/thermostat 主题的 mosquitto_sub 工具连接到 MQTT 代理:

    mosquitto_sub --host aio-mq-dmqtt-frontend --port 8883 --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/mq-sat)
    

    此命令在到达 data/thermostat 主题时会继续运行并显示消息,直到按 Ctrl+C 停止它。

若要验证添加的恒温器资产是否发布数据,请查看 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}}

提示

名称以“boiler-”开头的资产中的数据来自自动发现的资产。 这与你创建的恒温器资产不同。

如果没有数据流,请重启 aio-opc-opc.tcp-1 Pod:

  1. 使用以下命令查找 aio-opc-opc.tcp-1 Pod 的名称:

    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
    }
}

使用 Akri 服务发现 OPC UA 数据源

在上一部分,你了解了如何手动添加资产。 还可以使用 Akri 服务自动发现 OPC UA 数据源,并创建表示已发现设备的 Akri 实例自定义资源。 目前,Akri 服务无法检测和创建可以引入到 Azure 设备注册表预览版的资产。 因此,目前无法在 Azure 门户中管理 Akri 发现的资产。

部署 Azure IoT 操作时,部署包括 Akri 发现处理程序 Pod。 要验证这些 Pod 是否正在运行,请运行以下命令:

kubectl get pods -n azure-iot-operations | grep akri

上一命令的输出如以下示例所示:

aio-akri-otel-collector-5c775f745b-g97qv       1/1     Running   3 (4h15m ago)    2d23h
aio-akri-agent-daemonset-mp6v7                 1/1     Running   3 (4h15m ago)    2d23h

使用以下命令验证发现 Pod 是否正在运行:

kubectl get pods -n azure-iot-operations | grep discovery

上一命令的输出如以下示例所示:

aio-opc-asset-discovery-wzlnj                   1/1     Running     0              19m

若要配置 Akri 服务以发现 OPC UA 数据源,请创建引用 OPC UA 源的 Akri 配置。 运行以下命令以创建配置:

kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/akri-opcua-asset.yaml

以下代码片段显示了应用的 YAML 文件:

apiVersion: akri.sh/v0
kind: Configuration
metadata:
  name: akri-opcua-asset
  namespace: azure-iot-operations
spec:
  discoveryHandler: 
    name: opcua-asset
    discoveryDetails: "opcuaDiscoveryMethod:\n  - asset:\n      endpointUrl: \"	opc.tcp://opcplc-000000:50000\"\n      useSecurity: false\n      autoAcceptUntrustedCertificates: true\n"
  brokerProperties: {}
  capacity: 1

重要

当前存在一个已知问题,其中资产终结点的配置包含无效设置。 若要解决此问题,需要从 opc-ua-broker-opcplc-000000-50000 资产终结点的配置中删除 "securityMode":"none" 设置。 若要了解详细信息,请参阅 OPC UA 连接器

若要验证配置,请运行以下命令以查看 Akri 实例,这些实例表示 Akri 服务发现的 OPC UA 数据源。 可能需要等待几分钟以使配置可用:

kubectl get akrii -n azure-iot-operations

上一命令的输出如以下示例所示。

NAME                      CONFIG             SHARED   NODES                          AGE
akri-opcua-asset-dbdef0   akri-opcua-asset   true     ["k3d-k3s-default-server-0"]   45s

现在,可以在本地群集命名空间中使用这些资源。

若要确认 Akri 服务已连接到 OPC UA 的连接器,请将上一步中的 Akri 实例的名称复制并粘贴到以下命令中:

kubectl get akrii <AKRI_INSTANCE_NAME> -n azure-iot-operations -o json

命令输出如以下示例所示。 此示例摘录输出显示 Akri 实例 brokerProperties 值,并确认它已连接 OPC UA 的连接器。

"spec": {

        "brokerProperties": {
            "ApplicationUri": "Boiler #2",
            "AssetEndpointProfile": "{\"spec\":{\"uuid\":\"opc-ua-broker-opcplc-000000-azure-iot-operation\"……

我们如何解决问题?

在本快速入门中,你添加了资产终结点,然后定义了资产和标记。 资产和标记对来自 OPC UA 服务器的数据进行建模,使数据更易于在 MQTT 代理和其他下游流程中使用。 使用你在下一个快速入门中定义的恒温器资产。

清理资源

如果不继续使用此部署,请删除已部署 Azure IoT 操作的 Kubernetes 群集,并删除包含群集的 Azure 资源组。

下一步

快速入门:使用 MQTT 代理的数据湖连接器将资产遥测数据发送到云