« All blog posts

使用MQTT将OPC UA发布端连接到Amazon AWS IoT

26.11.2021


以下文章是与 Jan Borch 共同编写的。Jan 是 Amazon Web Services 的物联网解决方案架构师。他已经验证了这一概念,并可提供与 AWS 物联网平台相关的更多详细信息。

介绍

OPC UA PubSub 规范为 OPC UA 应用程序添加了发布-订阅通信模式。这种通信模式的主要优点是将消息生产者与消费者分离。生产者和消费者不需要相互了解来交换消息,多个消费者可以独立处理每个发布的消息。为了实现这一点,OPC UA PubSub 规范引入了发送消息的消息代理的概念。该规范支持两种传输协议类型:使用 UDP 的数据报传输和使用 MQTT 或 AMQP 的代理传输。本文将重点介绍后者,并将 AWS IoT Core 用作符合 MQTT 协议模式的消息代理。

本文展示了常见的工业物联网用例,用于将数据从运行在工业边缘的 OPC UA 服务器发布到运行在云平台上的应用程序,以执行大数据分析或预测性维护。

Architecture

OPC UA 发布端使用 MQTT 通过安全 mTLS 连接到 AWS IoT Core。然后开始发布基于 JSON 编码的数据和元数据。AWS IoT Core 使用 X.509 安全证书来验证 OPC UA 发布端。一旦数据到达 AWS 云平台,AWS IoT Core 规则引擎可用于将消息转发至下层云应用程序、时间序列数据库(如 Amazon Timestream)、AWS 服务(如 AWS IoT SiteWise、AWS IoT Events、AWS IoT Analytics)或其他 25 个受支持的 AWS 服务集成其中之一。

前提条件

AWS IoT 设置

在本指南中,我们将使用 Prosys OPC UA SDK for Java 附带的 SamplePublisherServer 应用程序。此示例启动一个 OPC UA 服务器,并另外配置 OPC UA 发布端,用来定期将 OPC UA 变量发布到 MQTT 代理,如 AWS IoT Core。

在开始此示例之前,我们需要为您的 AWS 帐户检索 AWS IoT Core MQTT 端点,您可以使用 AWS CLI 执行以下操作:

aws iot describe-endpoint --endpoint-type iot:DATA-ATS

{
    "endpointAddress": "xxxx-ats.iot.eu-west-1.amazonaws.com"
}

写下打印出来的确切端点-稍后您将需要它。

我们还需要使用 AWS IoT 端点的 CA 证书。我们可以通过以下方式检索:

curl https://www.amazontrust.com/repository/AmazonRootCA1.pem
  > AmazonRootCA1.pem

AWS IoT Core 使用 IoT 策略来控制对 AWS IoT Core MQTT 端点和 MQTT 主题的访问。我们需要定义 AWS IoT 策略,以允许 OPC UA 发布端连接到 AWS IoT。

因此,将以下策略存储到名为pubSubPolicy.json

{
"Version": "2012-10-17",
"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],

			"Resource": [
				"arn:aws:iot:*:*:client/*"
			]

		},
		{

			"Effect": "Allow",
			"Action": [
				"iot:Publish",
				"iot:RetainPublish"
			],
			"Resource": [
				"arn:aws:iot:*:*:topic/prosysopc/sample/*"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:*:*:topic/prosysopc/sample/*"
			]
		}
	]

}

的文件中, 并执行以下命令以创建 IoT 策略:

aws iot create-policy
  --policy-name prosyspubsubpolicy
  --policy-document file://./pubSubPolicy.json

现在,我们已准备好运行示例发布端服务器。

启动 Prosys OPC UA 示例发布端服务器

启动示例发布端的最简单方法是使用现成的 shell 或 BAT 脚本samplepublisherserver.shsamplepublisherserver.bat 并将< Your AWS IoT Endpoint >替换为您在上一节中检索到的 AWS 物联网端点。

samplepublisherserver.sh
  --encoding json
  --address ssl://<Your AWS IoT Endpoint>:8883
  --ca-cert AmazonRootCA1.pem

注意: ‘–ca-cert’ 是一个新的命令行参数,除了 SocketFactory 的定义外,还需要将其添加到示例项目中的 SamplePubSubConfiguration 类中。您可以使用以下修补程序来修改示例,如下所示。

在第一次调用时,示例应用程序将首先创建一个新的自签名 OPC UA 应用程序实例证书,用于在 OPC UA 客户端/服务器通信中验证自身身份。证书与相应的私钥一起存储在 PKI/CA/private 目录中。

现在,我们将使用应用程序实例证书通过 AWS IoT 端点对发布端进行身份验证。

当然,这将在第一次连接尝试时失败,因为默认情况下 AWS IoT 不信任该证书。

点击’x回车‘停止服务器

如果您检查日志文件SamplePublisherServer.log, 您应该会看到一条错误消息,指示 AWS IoT 拒绝连接:

Failed to connect to MQTT server ssl://xxxx-ats.iot.eu-west-1.amazonaws.com:8883 Connection lost (32109)

那么,让我们向 AWS IoT 注册应用程序实例证书。

首先,导航到示例储存生成的证书的目录:

cd PKI/CA/private

AWS IoT Core 需要 PEM 格式的证书,但 Prosys 示例生成 DER 编码的证书文件,因此我们需要在导入之前对其进行相应的转换。您可以使用 openssl 进行转换,如下所示:

openssl x509
  -inform der
  -in SamplePublisherServer@YOURHOSTNAME_2048.der
  -out SamplePublisherServer@YOURHOSTNAME_2048.crt

用计算机的实际主机名替换 YOURHOSTNAME。

接下来,将证书导入 AWS IoT:

aws iot register-certificate-without-ca
  --certificate-pem file://SamplePublisherServer@YOURHOSTNAME_2048.crt
  --status ACTIVE
  --output text
  --query 'certificateArn'

arn:aws:iot:eu-west-1:123456789012:cert/ababababab

复制打印出来的证书的 Amazon Resource Name(ARN),因为我们需要在下一个命令中用其将 IoT 策略附加到证书。

aws iot attach-policy
  --policy-name prosyspubsubpolicy
  --target arn:aws:iot:eu-west-1:123456789012:cert/ababababab

重新启动示例应用程序,并验证是否在日志文件中看到 ` - PubSubSystem started`。

查看 AWS IoT 控制台中发布的消息

打开 AWS IoT 控制台,导航至 MQTT 测试客户端,并订阅 prosysopc/sample/dataprosysopc/sample/metadata 主题。您现在应该可以在 MQTT 测试客户端中看到已发布的消息。

Test Client

元数据描述数据集格式,可被下游应用程序用于解码消息有效负载。元数据在 MQTT 保留的 flag 标识被打开的情况下发布,因此最后一条消息由 AWS IoT Core 将此主题持久化。

retainmessage

这允许下游应用程序在使用消息之前检索数据集元数据并推断消息格式。应用程序可以通过 MQTT 订阅元数据主题以检索保留的消息,也可以调用 AWS IoT API 以检索保留的消息。

retainmessage

在 AWS CLI 中,使用以下命令:

aws iot-data get-retained-message
  --topic prosysopc/sample/metadata
  --query payload
  --output text
  | base64 -d

{
  "MessageId": "1f15cee9-4163-449f-b2ac-c1f17af87714",
  "MessageType": "ua-metadata",
  "PublisherId": "SamplePublisher@909c4ad2251a",
  "DataSetWriterId": 432,
  "MetaData": {
    "Name": "SampleVariableDataSet",
    "Fields": [
      {
        "Name": "MyLevel",
        "BuiltInType": 11,
        "DataType": {
          "Id": 11
        },
...

总结

在本指南中,我们了解了如何将基于 Prosys OPC UA SDK for Java 开发的 OPC UA 发布端安全地连接到 AWS IoT。为了确保发布端和 AWS IoT 之间的通信安全,我们利用 OPC UA 的内置安全概念,更准确地说,利用公共证书的应用程序识别机制。最后,我们展示了下游 OPC UA 订阅端如何使用 MQTT 保留主题检索 OPC UA PubSub 数据集元数据。

AWS 物联网规则引擎现在可用于将发布的消息转发至下游应用程序,以进行进一步处理和分析。应用程序可以是专门构建的数据库,如 Amazon Timestream 或物联网特定服务,如 AWS IoT SiteWise, AWS IoT Events 或者 AWS IoT Analytics.

Jouni Aro

Jouni Aro

Chief Technology Officer

Email: jouni.aro@prosysopc.com

Expertise and responsibility areas: OPC & OPC UA product development, project work and customer support

Tags: AWS, IoT, Cloud, OPC UA, PubSub, MQTT, Java, Power BI, SDK for Java

comments powered by Disqus

Prosys OPC Ltd

Prosys OPC是OPC和OPC UA软件领域中拥有20年技术经验的行业佼佼者。 OPC和OPC UA(Unified Architecture)是工业和高科技公司使用的通信标准。

了解更多关于我们的信息 »

最新博客文章

SimServer How To #3: 使用OPC UA客户端模拟服务器上的数据更改

关于如何使用OPC UA客户端在OPC UA服务器上写入新数据的分步教程(分为两部分)。

如何在生产分析项目中取得成功

工业4.0分析项目将在未来几年内成为显著增长的业务。阅读如何绕过最常见的陷阱以及成功交付项目。

Prosys OPC UA Forge为什么是工业4.0工厂的重要组成部分

如今,边缘计算应用程序提供了比OPC UA聚合服务器更广泛的功能。事实上,它是工业4.0工厂的主要组成部分。"

查看所有博客文章 »

-->