配置 OPC-UA 源 (CLI) - Amazon IoT SiteWise
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置 OPC-UA 源 (CLI)

您可以使用为 SiteWise Edge 网关定义 OPC-UA 数据源。 Amazon CLI为此,请创建一个 OPC-UA 功能配置 JSON 文件,然后使用 update-gateway-capability-configuration命令更新 SiteWise Edge 网关配置。您必须在单个功能配置中定义所有 OPC-UA 源。

此功能具有以下命名空间。

  • iotsitewise:opcuacollector:2

请求语法

{ "sources": [ { "name": "string", "endpoint": { "certificateTrust": { "type": "TrustAny" | "X509", "certificateBody": "string", "certificateChain": "string", }, "endpointUri": "string", "securityPolicy": "NONE" | "BASIC128_RSA15" | "BASIC256" | "BASIC256_SHA256" | "AES128_SHA256_RSAOAEP" | "AES256_SHA256_RSAPSS", "messageSecurityMode": "NONE" | "SIGN" | "SIGN_AND_ENCRYPT", "identityProvider": { "type": "Anonymous" | "Username", "usernameSecretArn": "string" }, "nodeFilterRules": [ { "action": "INCLUDE", "definition": { "type": "OpcUaRootPath", "rootPath": "string" } } ] }, "measurementDataStreamPrefix": "string" "destination": { "type": "StreamManager", "streamName": "string", "streamBufferSize": integer }, "propertyGroups": [ { "name": "string", "nodeFilterRuleDefinitions": [ { "type": "OpcUaRootPath", "rootPath": "string" } ], "deadband": { "type": "PERCENT" | "ABSOLUTE", "value": double, "eguMin": double, "eguMax": double, "timeoutMilliseconds": integer }, "scanMode": { "type": "EXCEPTION" | "POLL", "rate": integer }, "dataQuality": { "allowGoodQuality": true | false, "allowBadQuality": true | false, "allowUncertainQuality": true | false }, "subscription": { "dataChangeTrigger": "STATUS" | "STATUS_VALUE" | "STATUS_VALUE_TIMESTAMP", "queueSize": integer, "publishingIntervalMilliseconds": integer, "snapshotFrequencyMilliseconds": integer } } ] } ] }

请求正文

来源

OPC-UA 源定义结构的列表,每个结构均包含以下信息:

name

源的唯一友好名称。

终端节点

一个包含以下信息的终端节点结构:

证书信托

一个包含以下信息的证书信任策略结构:

类型

源的证书信任模式。选择以下操作之一:

  • TrustAny— 边 SiteWise 缘网关在连接到 OPC-UA 源时信任任何证书。

  • X509— 边 SiteWise 缘网关在连接到 OPC-UA 源时信任 X.509 证书。如果选择此选项,则必须在 certificateTrust 中定义 certificateBody。也可以在 certificateTrust 中定义 certificateChain

证书正文

(可选)X.509 证书的正文。

如果您在 certificateTrust 中为 type 选择 X509,则此字段为必填字段。

证书链

(可选)X.509 证书的信任链。

仅当您在 certificateTrust 中为 type 选择 X509 时使用此字段。

EndpointURI

OPC-UA 源的本地终端节点。例如,您的本地终端节点可能类似于 opc.tcp://203.0.113.0:49320

安全政策

要使用安全策略,可保护从 OPC-UA 源读取的消息。选择以下操作之一:

  • NONE— 边 SiteWise 缘网关不保护来自 OPC-UA 来源的消息。建议您选择不同的安全策略。如果选择此选项,则还必须为 messageSecurityMode 选择 NONE

  • BASIC256_SHA256Basic256Sha256 安全政策。

  • AES128_SHA256_RSAOAEPAes128_Sha256_RsaOaep 安全政策。

  • AES256_SHA256_RSAPSSAes256_Sha256_RsaPss 安全政策。

  • BASIC128_RSA15 —(已弃用)OPC-UA 规范中已弃用 Basic128Rsa15 安全策略,因为它被视为不再安全。建议您选择不同的安全策略。有关更多信息,请参阅 Basic128Rsa15

  • BASIC256 —(已弃用)OPC-UA 规范中已弃用 Basic256 安全策略,因为它被视为不再安全。建议您选择不同的安全策略。有关更多信息,请参阅 Basic256

重要

如果您选择除 NONE 外的其他安全策略,则 messageSecurityMode 必须选择 SIGNSIGN_AND_ENCRYPT。您还必须将源服务器配置为信任 SiteWise Edge 网关。有关更多信息,请参阅 使您的 OPC-UA 源服务器能够信任 Edge 网关 SiteWise

消息 SecurityMode

用于保护与 OPC-UA 源的连接的消息安全模式。选择以下操作之一:

  • NONE— 边 SiteWise 缘网关无法保护与 OPC-UA 源的连接。建议您选择不同的消息安全模式。如果选择此选项,则还必须为 securityPolicy 选择 NONE

  • SIGN— 在 SiteWise Edge 网关和 OPC-UA 源之间传输的数据已签名,但未加密。

  • SIGN_AND_ENCRYPT — 对网关和 OPC-UA 源之间的传输中数据进行签名和加密。

重要

如果您选择除 NONE 外的消息安全模式,则必须选择除 NONE 外的 securityPolicy。您还必须将源服务器配置为信任 SiteWise Edge 网关。有关更多信息,请参阅 使您的 OPC-UA 源服务器能够信任 Edge 网关 SiteWise

身份提供者

一个包含以下信息的身份提供程序结构:

类型

源所需的身份验证凭证的类型。选择以下操作之一:

  • Anonymous — 源不需要身份验证即可连接。

  • Username — 源需要用户名和密码才能连接。如果选择此选项,则必须在 identityProvider 中定义 usernameSecretArn

用户名 SecretArn

(可选)密钥的 ARN。 Amazon Secrets Manager SiteWise Edge 网关在连接到此源时使用此密钥中的身份验证凭证。您必须将密钥附加到 SiteWise Edge 网关的 IoT SiteWise 连接器,才能将其用于源身份验证。有关更多信息,请参阅 配置数据来源身份验证

如果您在 identityProvider 中为 type 选择 Username,则此字段为必填字段。

节点 FilterRules

定义要发送到云端的 OPC-UA 数据流路径的节点筛选规则结构列表。 Amazon 您可以使用节点筛选器通过仅包含您建模的数据的路径来减少 SiteWise Edge 网关的启动时间和 CPU 使用率 Amazon IoT SiteWise。默认情况下, SiteWise 边缘网关会上传除以开头的路径之外的所有 OPC-UA 路径。/Server/要定义 OPC-UA 节点筛选条件,可以使用节点路径以及 *** 通配符。有关更多信息,请参阅 使用 OPC-UA 节点筛选条件

此列表中的每个结构都必须包含以下信息:

action

此节点筛选器规则的操作。可以选择以下选项:

  • INCLUDE— SiteWise Edge 网关仅包含符合此规则的数据流。

定义

一个包含以下信息的节点筛选器规则结构:

类型

此规则的节点筛选器路径的类型。可以选择以下选项:

  • OpcUaRootPath— SiteWise Edge 网关根据 OPC-UA 路径层次结构的根目录评估此节点筛选路径。

rootPath

根据 OPC-UA 路径层次结构的根进行评估的节点筛选器路径。此路径必须以 / 开头。

测量DataStream前缀

要在源中所有数据流的前面加上的字符串。 SiteWise Edge 网关将此前缀添加到来自该源的所有数据流。使用数据流前缀,可以区分来自不同源的同名数据流。在您的账户中,每个数据流都应具有唯一的名称。

属性组

(可选)定义协议要求的 deadbandscanMode 的属性组列表。

name

属性组的名称。这应该是一个唯一的标识符。

死带

deadband 结构包含以下信息:

类型

支持的死区类型。接受的值为:ABSOLUTEPERCENT

死区值。如果 typeABSOLUTE,则此值为无单位的双精度。如果 typePERCENT,则此值是 1100 之间的双精度。

egumin

(可选)使用 PERCENT 死区时的工程单位最小值。如果 OPC-UA 服务器未配置工程单元,则可以设置此项。

eguMax

(可选)使用 PERCENT 死区时的工程单位最大值。如果 OPC-UA 服务器未配置工程单元,则可以设置此项。

超时毫秒

超时前的持续时间,以毫秒为单位。最少为 100

扫描模式

scanMode 结构包含以下信息:

类型

支持的 scanMode 类型。接受的值为:POLLEXCEPTION

费率

扫描模式的采样间隔。

节点FilterRule定义

(可选)包含在属性组中的节点路径列表。属性组不能重叠。如果您不为此字段指定值,则该组包含根目录下的所有路径,且您无法创建其他属性组。nodeFilterRuleDefinitions 结构包含以下信息:

类型

OpcUaRootPath 是唯一支持的类型。这指定 rootPath 值是相对于 OPC-UA 浏览空间根目录的路径。

rootPath

以逗号分隔的列表,用于指定要包含在属性组中的路径(相对于根路径)。

功能配置示例

以下示例根据存储在 JSON 文件中的有效负载定义了 OPC-UA SiteWise Edge 网关功能配置。

aws iotsitewise update-gateway-capability-configuration \ --capability-namespace "iotsitewise:opcuacollector:2" \ --capability-configuration file://opc-ua-configuration.json
例 :OPC-UA 源配置

以下 opc-ua-configuration.json 文件定义基本的、不安全的 OPC-UA 源配置。

{ "sources": [ { "name": "Wind Farm #1", "endpoint": { "certificateTrust": { "type": "TrustAny" }, "endpointUri": "opc.tcp://203.0.113.0:49320", "securityPolicy": "NONE", "messageSecurityMode": "NONE", "identityProvider": { "type": "Anonymous" }, "nodeFilterRules": [] }, "measurementDataStreamPrefix": "" } ] }
例 :带有已定义属性组的 OPC-UA 源配置

以下 opc-ua-configuration.json 文件定义了一个基本的、不安全的 OPC-UA 源配置,其中包含已定义的属性组。

{ "sources": [ { "name": "source1", "endpoint": { "certificateTrust": { "type": "TrustAny" }, "endpointUri": "opc.tcp://10.0.0.9:49320", "securityPolicy": "NONE", "messageSecurityMode": "NONE", "identityProvider": { "type": "Anonymous" }, "nodeFilterRules": [ { "action": "INCLUDE", "definition": { "type": "OpcUaRootPath", "rootPath": "/Utilities/Tank" } } ] }, "measurementDataStreamPrefix": "propertyGroups", "propertyGroups": [ { "name": "Deadband_Abs_5", "nodeFilterRuleDefinitions": [ { "type": "OpcUaRootPath", "rootPath": "/Utilities/Tank/Temperature/TT-001" }, { "type": "OpcUaRootPath", "rootPath": "/Utilities/Tank/Temperature/TT-002" } ], "deadband": { "type":"ABSOLUTE", "value": 5.0, "timeoutMilliseconds": 120000 } }, { "name": "Polling_10s", "nodeFilterRuleDefinitions": [ { "type": "OpcUaRootPath", "rootPath": "/Utilities/Tank/Pressure/PT-001" } ], "scanMode": { "type": "POLL", "rate": 10000 } }, { "name": "Percent_Deadband_Timeout_90s", "nodeFilterRuleDefinitions": [ { "type": "OpcUaRootPath", "rootPath": "/Utilities/Tank/Flow/FT-*" } ], "deadband": { "type":"PERCENT", "value": 5.0, "eguMin": -100, "eguMax": 100, "timeoutMilliseconds": 90000 } } ] } ] }
例 :带属性的 OPC-UA 源配置

针对 opc-ua-configuration.json 的以下 JSON 示例定义具有以下属性的 OPC-UA 源配置:

  • 信任任何证书。

  • 使用 BASIC256 安全策略保护消息。

  • 使用 SIGN_AND_ENCRYPT 模式保护连接。

  • 使用存储在 Secrets Manager 密钥中的身份验证凭证。

  • 筛选出数据流(路径以 /WindFarm/2/WindTurbine/ 开头的数据流除外)。

  • 在每个数据流路径的开头添加 /Washington 以将此“Wind Farm #2”与另一个区域中的“Wind Farm #2”区分开来。

{ "sources": [ { "name": "Wind Farm #2", "endpoint": { "certificateTrust": { "type": "TrustAny" }, "endpointUri": "opc.tcp://203.0.113.1:49320", "securityPolicy": "BASIC256", "messageSecurityMode": "SIGN_AND_ENCRYPT", "identityProvider": { "type": "Username", "usernameSecretArn": "arn:aws:secretsmanager:region:123456789012:secret:greengrass-windfarm2-auth-1ABCDE" }, "nodeFilterRules": [ { "action": "INCLUDE", "definition": { "type": "OpcUaRootPath", "rootPath": "/WindFarm/2/WindTurbine/" } } ] }, "measurementDataStreamPrefix": "/Washington" } ] }
例 : 使用证书信任的 OPC-UA 源配置

针对 opc-ua-configuration.json 的以下 JSON 示例定义具有以下属性的 OPC-UA 源配置:

  • 信任给定的 X.509 证书。

  • 使用 BASIC256 安全策略保护消息。

  • 使用 SIGN_AND_ENCRYPT 模式保护连接。

{ "sources": [ { "name": "Wind Farm #3", "endpoint": { "certificateTrust": { "type": "X509", "certificateBody": "-----BEGIN CERTIFICATE----- MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w 0BAQUFADCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZ WF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIw EAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5 jb20wHhcNMTEwNDI1MjA0NTIxWhcNMTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBh MCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBb WF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMx HzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wgZ8wDQYJKoZIhvcNAQE BBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ21uUSfwfEvySWtC2XADZ4nB+BLYgVI k60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9TrDHudUZg3qX4waLG5M43q7Wgc/MbQ ITxOUSQv7c7ugFFDzQGBzZswY6786m86gpEIbb3OhjZnzcvQAaRHhdlQWIMm2nr AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4nUhVVxYUntneD9+h8Mg9q6q+auN KyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0FkbFFBjvSfpJIlJ00zbhNYS5f6Guo EDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTbNYiytVbZPQUQ5Yaxu2jXnimvw 3rrszlaEXAMPLE= -----END CERTIFICATE-----", "certificateChain": "-----BEGIN CERTIFICATE----- MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w 0BAQUFADCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZ WF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIw EAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5 jb20wHhcNMTEwNDI1MjA0NTIxWhcNMTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBh MCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBb WF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMx HzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wgZ8wDQYJKoZIhvcNAQE BBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ21uUSfwfEvySWtC2XADZ4nB+BLYgVI k60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9TrDHudUZg3qX4waLG5M43q7Wgc/MbQ ITxOUSQv7c7ugFFDzQGBzZswY6786m86gpEIbb3OhjZnzcvQAaRHhdlQWIMm2nr AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4nUhVVxYUntneD9+h8Mg9q6q+auN KyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0FkbFFBjvSfpJIlJ00zbhNYS5f6Guo EDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTbNYiytVbZPQUQ5Yaxu2jXnimvw 3rrszlaEXAMPLE= -----END CERTIFICATE-----" }, "endpointUri": "opc.tcp://203.0.113.2:49320", "securityPolicy": "BASIC256", "messageSecurityMode": "SIGN_AND_ENCRYPT", "identityProvider": { "type": "Anonymous" }, "nodeFilterRules": [] }, "measurementDataStreamPrefix": "" } ] }