AWS IoT Greengrass
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 Greengrass OPC-UA 与工业设备通信

Greengrass 支持 OPC-UA,一种用于工业通信的信息交换标准。通过 OPC-UA,您可以接收和处理工业设备的消息,并根据您定义的规则,将其发送到 Greengrass 组中的设备或发送到云中。

OPC-UA 的 Greengrass 实施支持基于证书的身份验证。它基于开源实施,并且完全可自定义。您也可以自带 OPC-UA 实施,并对其他自定义、旧式和专有消息收发协议实施您自己的支持。

在本节中,我们将介绍以下步骤:

  • 连接到现有的 OPC-UA 服务器。

  • 监控该服务器中的现有 OPC-UA 节点。

  • 在受监控节点的值更改时获得回调。

架构概述

Greengrass 将 OPC-UA 作为 Lambda 函数在 NodeJS 中实施。由于在 Greengrass 核心上运行的 Lambda 函数有权访问网络资源,您可以创建 Lambda 函数,通过 TCP 将信息从现有 OPC-UA 服务器传递到 Greengrass 组中的其他函数或服务。


                Greengrass OPCUA 架构。

您可以将 Greengrass 配置为长期连接至 OPC-UA 服务器,并且,通过使用 OPC-UA 订阅,您可以让 OPCUA_Adapter Lambda 函数监控对预定义节点的更改。对这些节点的任何更改都会从 OPC-UA 服务器触发一个发布事件,该事件将由您的 Lambda 函数接收,并重新发布到预定义的主题名称。

主题结构的构造如下所示:


                主题结构构造。

设置测试 OPC-UA 服务器

使用以下命令设置测试 OPC-UA 服务器。或者,如果您想使用现有的 OPC-UA 服务器,则可跳过该步骤。

git clone git://github.com/node-opcua/node-opcua.git cd node-opcua git checkout v0.0.65 npm install node bin/simple_server

该服务器生成以下输出:

[ec2-user@<your_instance_id> node-opcua]$ node bin/simple_server server PID : 28585 registering server to :opc.tcp://<your_instance_id>4840/UADiscovery err Cannot find module 'usage' skipping installation of cpu_usage and memory_usage nodes server on port : 26543 endpointUrl : opc.tcp://<your_instance_id>us-west-2.compute.internal:26543 serverInfo : applicationUri : urn:54f7890cca4c49a1:NodeOPCUA-Server productUri : NodeOPCUA-Server applicationName : locale=en text=NodeOPCUA applicationType : SERVER gatewayServerUri : null discoveryProfileUri : null discoveryUrls : productName : NODEOPCUA-SERVER buildInfo : productUri : NodeOPCUA-Server manufacturerName : Node-OPCUA : MIT Licence ( see http://node-opcua.github.io/) productName : NODEOPCUA-SERVER softwareVersion : 0.0.65 buildNumber : 1234 buildDate : Thu Aug 03 2017 00:13:50 GMT+0000 (UTC) server now waiting for connections. CTRL+C to stop

确保您的 Greengrass 组已准备就绪

  • 创建一个 Greengrass 组。有关信息,请参阅在 AWS IoT 上配置 AWS IoT Greengrass

  • 在其中一个受支持的平台(例如 Raspberry-pi)上设置 Greengrass 核心

  • 设置您的 Greengrass 核心,以便能够运行 nodejs8.x Lambda 函数

使用 Greengrass OPC-UA 与您的 OPC-UA 服务器交互

  1. 准备 Lambda 函数。

    从 GitHub 中获取 OPC-UA 适配器 Lambda 函数的代码:

    git clone https://github.com/aws-samples/aws-greengrass-samples.git cd aws-greengrass-samples/greengrass-opcua-adapter-nodejs npm install

    注意

    此 Lambda 函数使用 node-opcua 库 (v0.0.65),该库在运行时会尝试重新生成部分模型文件。如果作为 Lambda 函数在 Greengrass 上运行,则不起作用,因为 Lambda 函数以只读文件系统开头,所以任何尝试生成其他代码的代码都将不起作用。下一步可解决此问题。

  2. 更改 node_modules/node-opcua/lib/misc/factories.js 处的文件:将第 109 行更改为:

    var generated_source_is_outdated = (!generated_source_exists);

    运行此命令进行这项更改:

    sed -i '109s/.*/ var generated_source_is_outdated = (!generated_source_exists);/' node_modules/node-opcua/lib/misc/factories.js
  3. 配置服务器和受监控的节点。

    更改 OPC-UA Lambda 函数的 index.js 文件中的 configSet 变量,以包含您要连接的服务器 IP 和端口,以及您要监控的节点 ID。默认情况下,它具有以下示例配置:

    const configSet = { server: { name: 'server', url: 'opc.tcp://localhost:26543', }, subscriptions: [ { name: 'MyPumpSpeed', nodeId: 'ns=1;s=PumpSpeed', }, ], };

    在这种情况下,我们将连接到与 Greengrass 核心所在的相同主机上运行的 OPC-UA 服务器(端口 26543 上),并监控一个具有 OPC-UA ID 'ns=1;s=PumpSpeed' 的节点。

  4. 配置身份验证模式。

    本例中使用的 OPC-UA 库支持对 OPC-UA 服务器使用三种身份验证模式。最安全的方法是基于证书的身份验证,但该库也允许您指定用户名/密码或无需进行身份验证。

    下面介绍了如何设置基于证书的身份验证:

    • 使用 Lambda 函数打包您的证书和私有密钥,例如在名为 certs/ 的目录下。

    • 更改 clientOptions 变量,以包含 certificateFile、privateKeyFile、securityModes 和 securityPolicies 选项:

      const clientOptions = { keepSessionAlive: true, certificateFile: /lambda/certs/<certificate_name>.pem.crt, privateKeyFile: /lambda/certs/<private_key_name>.pem.key, securityModes: MessageSecurityMode.SIGN, securityPolicies: SecurityPolicy.BASIC256, connectionStrategy: { maxRetry: 1000000, initialDelay: 2000, maxDelay: 10 * 1000, }, };
  5. AWS IoT Greengrass Core 开发工具包 下载 下载 NodeJS AWS IoT Greengrass 软件开发工具包。

  6. 上传您的 Lambda 函数。

    创建 Greengrass Lambda 函数。有关信息,请参阅为 AWS IoT Greengrass 配置 Lambda 函数。您可以通过执行以下操作创建 Lambda 函数代码存档:

    # Install Greengrass SDK in the node_modules directory. If you used the curl command to download the SDK, replace the tar.gz filename # with the name you used. tar -zxvf aws-greengrass-core-sdk-js-*.tar.gz -C /tmp/ unzip /tmp/aws_greengrass_core_sdk_js/sdk/aws-greengrass-core-sdk-js.zip -d node_modules # Archive the whole directory as a zip file zip -r opcuaLambda.zip * -x \*.git\* # Create an AWS Lambda with the created zip aws lambda create-function --function-name function-name --runtime 'nodejs8.10' --role your_role --handler 'index.handler' --zip-file opcuaLambda.zip

    将此 Lambda 添加到 Greengrass 组。有关信息,请参阅为 AWS IoT Greengrass 配置 Lambda 函数

  7. 配置 Lambda 函数并将其部署到 Greengrass 组

    创建 AWS Lambda 函数后,将其添加到您的 Greengrass 组。按照上面同一节的说明进行操作。

    • 确保将 Lambda 函数指定为长时间运行。

    • 至少为其提供 64 MB 的内存。

    您现在可以使用最新配置创建部署。有关信息,请参阅将云配置部署到 AWS IoT Greengrass 核心设备

验证 Lambda 函数是否接收 OPC-UA 发布并将其发布到 Greengrass 上

正如架构部分所述,您的 Lambda 函数应开始从 OPC-UA 服务器接收消息。如果您使用的是自己的自定义 OPC-UA 服务器,请确保触发所指定的 OPC-UA 节点 ID 中的更改,这样便可看到 Lambda 函数接收的更改。如果您使用的是上面的示例服务器,PumpSpeed 节点将配置为模拟一系列连续更新,因此您的 Lambda 函数每秒钟将会接收多条消息。

您可以通过以下两种方式之一来查看 Lambda 函数接收的消息:

  • 查看 Lambda 函数的日志。

    您可以通过运行以下命令来查看 Lambda 函数的日志:

    sudo cat ggc/var/log/user/us-west-2/your_account_id/your_function_name.log

    日志应与以下示例类似:

    [2017-11-14T16:33:09.05Z][INFO]-started subscription : 305964 [2017-11-14T16:33:09.05Z][INFO]-monitoring node id = ns=1;s=PumpSpeed [2017-11-14T16:33:09.099Z][INFO]-monitoredItem initialized [2017-11-15T23:49:34.752Z][INFO]-Publishing message on topic "/opcua/server/node/MyPumpSpeed" with Payload "{"id":"ns=1;s=PumpSpeed","value":{"dataType":"Double","arrayType":"Scalar","value":237.5250759433095}}"
  • 配置 Greengrass,以将消息从 Lambda 函数转发到 IoT 云。

    按照验证 Lambda 函数是否在设备上运行中概述的步骤在 AWS IoT 控制台上接收消息。

注意:

  • 确保当前有订阅从 Lambda 函数转到 IoT 云。详细信息位于为 AWS IoT Greengrass 配置 Lambda 函数中。

  • 由于消息转发到云中,请确保终止您在上文中配置的示例服务器,或者停止 Greengrass 核心,这样就不会向 IoT 云发布大量消息并为其付费!

后续步骤

通过 Greengrass,您可以使用同样的架构来创建自己的 OPC-UA 实施,而且也对自定义、旧式和专有消息收发协议实施您自己的支持。由于在 Greengrass 核心上运行的 Lambda 函数有权访问网络资源,您可以使用它们对任何基于 TCP-IP 的协议实施支持。此外,您也可以利用 Greengrass 本地资源访问,对需要访问硬件适配器/驱动程序的协议实施支持。