小亿 发布的文章

EdgeX Foundry (以下统一简称:EdgeX)设备微服务 device-opcua 由我司根据已有代码优化后贡献给社区,文档也是必不可少的环节,社区要求英文,现翻译成中文,方便国内客户阅读和使用。

  • 目的
  • 入门
  • 配置
  • 协议属性
  • API 参考
  • 源代码

目的

该服务的目的是将 OPC-UA 设备连接到 EdgeX。

入门

本页介绍如何将 OPC-UA 设备连接到 EdgeX。 在此示例中,我们使用模拟器来实现(OPC UA Simulation Server)。 这提供了一种测试设备服务功能的简单方法。

环境

您可以使用任何可以安装 docker 和 docker-compose 的操作系统。 在本例中,我们使用 Ubuntu 使用 docker 部署 EdgeX。

设置 Prosys OPC UA Simulation Server 设备

!!! warning "警告"

本页面并不是设置 OPC-UA 设备的完整指南,仅介绍了几个重要步骤供参考。

  1. 下载 Prosys OPC UA 模拟服务器

从 OPC UA 模拟服务器下载 下载最新版本的 OPC UA Simulation Server Download

  1. 安装模拟服务器

  2. 启动模拟服务器
    2023-12-18T02:55:24.png

  3. 验证模拟服务器

  • Status
    2023-12-18T02:55:38.png

复制连接地址(UA TCP)值:opc.tcp://jiekemacbookpro14.lan:53530/OPCUA/SimulationServer

  • Objects
    2023-12-18T02:55:08.png

启动微服务之前

以下部分介绍如何在启动服务之前完成设置。

  • 使用预定义的配置进行测试
  • 设置新配置

使用预定义的配置进行测试

文件夹中的预定义配置:cmd/res/

预定义 Device Profile

设备配置 Device Profile profiles/Simple-Driver.yaml 描述了一个 OPC-UA 设备,它包含 3 个资源,如下所示:

name: OPCUA-Server
manufacturer: Prosys
model: Simlulator
labels:
  - OPCUA
  - TEST
description: Simulation OPCUA Server
deviceResources:
  - name: Constant
    description: generated constant number
    properties:
      valueType: Float64
      readWrite: RW
    attributes:
      nodeId: ns=3;i=1001
  - name: Counter
    description: generated counter number
    properties:
      valueType: Int32
      readWrite: R
    attributes:
      nodeId: ns=3;i=1002
  - name: Random
    description: generated random number
    properties:
      valueType: Float64
      readWrite: R
    attributes:
      nodeId: ns=3;i=1003
deviceCommands:
  - name: ConstantNum
    isHidden: false
    readWrite: RW
    resourceOperations:
      - deviceResource: Constant
        defaultValue: 0.0
  - name: CounterNum
    isHidden: false
    readWrite: R
    resourceOperations:
      - deviceResource: Counter
        defaultValue: 0
  - name: RandomNum
    isHidden: false
    readWrite: R
    resourceOperations:
      - deviceResource: Random
        defaultValue: 0.0

该表描述了设备配置文件的每个资源:

Resource Name valueType of EdgeX nodeId Description
Constant Float64 ns=3;i=1001 generated constant number
Counter Int32 ns=3;i=1002 generated counter number
Random Float64 ns=3;i=1003 generated random number
预定义设备配置 Device Configuration

设备配置 Device Configuration devices/Simple-Devices.yaml 描述了如下所示的两种设备。

deviceList:
  - name: SimulationServer
    profileName: OPCUA-Server
    description: OPCUA device
    labels:
      - OPCUA
      - TEST
    protocols:
      opcua:
        Endpoint: 'opc.tcp://192.168.123.21:53530/OPCUA/SimulationServer'

设置一个新的配置 Configuration

创建自定义配置文件夹

运行以下命令:

mkdir -p custom-config
设置新的设备配置 Device Profile

运行以下命令来创建您的设备配置文件:

cd custom-config
vi new-device-profile.yaml

插入您的设备配置文件定义,这取决于您的 OPC-UA 设备配置。

设置设备服务配置 Configuration
cd custom-config
vi new-device-config.yaml

填写 new-device-config.yaml 文件。

准备 docker-compose 文件

生成 docker compose 文件

  1. Clone edgex-compose
git clone https://github.com/edgexfoundry/edgex-compose.git
  1. 生成 docker-compose.yml 文件
cd edgex-compose
make gen no-secty ds-opcua

将自定义配置添加到 docker-compose 文件

将准备好的配置文件添加到 docker-compose 文件中,您可以使用卷挂载它们并更改 device-opcua 内部使用的环境。

打开 docker-compose.yml 文件,然后添加卷路径和环境,如下所示:

device-opcua:
  ...
  environment:
    ...
    DEVICE_PROFILESDIR: /custom-config
    DEVICE_DEVICESDIR: /custom-config
  volumes:
    ...
    - /path/to/custom-config:/custom-config

在 Docker 上启动 EdgeX Foundry

由于我们在上一步中生成了 docker-compose.yml 文件,因此我们可以部署 EdgeX,如下所示:

cd edgex-compose/compose-builder
docker compose -p edgex up -d
[+] Running 12/12
 ✔ Container edgex-core-consul                      Started    0.0s
 ✔ Container edgex-ui-go                            Started    0.0s
 ✔ Container edgex-redis                            Started    0.0s
 ✔ Container edgex-core-common-config-bootstrapper  Started    0.1s
 ✔ Container edgex-support-scheduler                Started    0.0s
 ✔ Container edgex-kuiper                           Started    0.0s
 ✔ Container edgex-support-notifications            Started    0.1s
 ✔ Container edgex-core-metadata                    Started    0.1s
 ✔ Container edgex-core-command                     Started    0.0s
 ✔ Container edgex-core-data                        Started    0.0s
 ✔ Container edgex-app-rules-engine                 Started    0.0s
 ✔ Container edgex-device-opcua                     Started    0.0s

启动服务后设置

如果服务已在运行并且您想要添加设备,则可以使用本节中概述的“核心元数据 API”。 如果您按照启动服务之前的设置中的说明设置设备配置文件和服务,则可以跳过此部分。

要在启动服务后添加设备,请完成以下步骤:

  1. 使用 POST 将上面的设备配置文件上传到元数据:http://localhost:59881/api/v3/deviceprofile/uploadfile ,并以表单数据格式将文件作为密钥“文件”添加到正文,以及创建的 ID 将被退回。 以下示例命令使用 curl 发送请求:
curl http://localhost:59881/api/v3/deviceprofile/uploadfile -F "file=@new-device-profile.yml"
  1. 确保 OPC-UA 设备服务正在运行,如有必要或使用其他设备服务,请调整下面的服务名称以匹配。

  2. 使用 POST 将设备添加到 http://localhost:59881/api/v3/device,正文将类似于

curl http://localhost:59881/api/v3/device -H "Content-Type:application/json" -X POST \
-d '[
        {
            "apiVersion" : "{{api_version}}",
            "device" : {
            "adminState" : "UNLOCKED",
            "description" : "OPCUA device",
            "labels" : [
                "OPCUA",
                "TEST"
            ],
            "name" : "SimulationServer1",
            "operatingState" : "UP",
            "profileName" : "OPCUA-Server",
            "protocols" : {
                "opcua" : {
                "Endpoint" : "opc.tcp://192.168.123.21:53530/OPCUA/SimulationServer"
                }
            },
            "serviceName" : "device-opcua"
            }
        }
    ]'

服务名称必须匹配/引用目标设备服务(“device-opcua”),并且配置文件名称必须与前面步骤中的设备配置文件名称("OPCUA-Server")

执行命令

现在我们准备运行一些命令。

查找可执行命令

使用以下查询查找可执行命令:

curl http://localhost:59882/api/v3/device/name/SimulationServer1 | json_pp
{
  "apiVersion": "v3",
  "deviceCoreCommand": {
    "coreCommands": [
      {
        "get": true,
        "name": "ConstantNum",
        "parameters": [
          {
            "resourceName": "Constant",
            "valueType": "Float64"
          }
        ],
        "path": "/api/v3/device/name/SimulationServer1/ConstantNum",
        "set": true,
        "url": "http://edgex-core-command:59882"
      },
      {
        "get": true,
        "name": "CounterNum",
        "parameters": [
          {
            "resourceName": "Counter",
            "valueType": "Int32"
          }
        ],
        "path": "/api/v3/device/name/SimulationServer1/CounterNum",
        "url": "http://edgex-core-command:59882"
      },
      {
        "get": true,
        "name": "RandomNum",
        "parameters": [
          {
            "resourceName": "Random",
            "valueType": "Float64"
          }
        ],
        "path": "/api/v3/device/name/SimulationServer1/RandomNum",
        "url": "http://edgex-core-command:59882"
      },
      {
        "get": true,
        "name": "Constant",
        "parameters": [
          {
            "resourceName": "Constant",
            "valueType": "Float64"
          }
        ],
        "path": "/api/v3/device/name/SimulationServer1/Constant",
        "set": true,
        "url": "http://edgex-core-command:59882"
      },
      {
        "get": true,
        "name": "Counter",
        "parameters": [
          {
            "resourceName": "Counter",
            "valueType": "Int32"
          }
        ],
        "path": "/api/v3/device/name/SimulationServer1/Counter",
        "url": "http://edgex-core-command:59882"
      },
      {
        "get": true,
        "name": "Random",
        "parameters": [
          {
            "resourceName": "Random",
            "valueType": "Float64"
          }
        ],
        "path": "/api/v3/device/name/SimulationServer1/Random",
        "url": "http://edgex-core-command:59882"
      }
    ],
    "deviceName": "SimulationServer1",
    "profileName": "OPCUA-Server"
  },
  "statusCode": 200
}

执行设置命令

根据urlparameterNames执行 SET 命令,运行 SET 命令时将localhost替换为服务器 IP。

这里我们使用“heartbeat”命令:

curl http://localhost:59882/api/v3/device/name/SimulationServer1/Constant \
-H "Content-Type:application/json" -X PUT  \
-d '{"Constant": "199.99"}'
{"apiVersion":"v3","statusCode":200}

执行获取命令

运行 GET 命令时,将 localhost 替换为服务器 IP。

这里我们使用“heartbeat”命令:

curl http://localhost:59882/api/v3/device/name/SimulationServer1/Constant
{
  "apiVersion": "v3",
  "event": {
    "apiVersion": "v3",
    "deviceName": "SimulationServer1",
    "id": "cc8ea84d-0a5f-4d5b-b4db-9126368f4aa3",
    "origin": 1702613269923352589,
    "profileName": "OPCUA-Server",
    "readings": [
      {
        "deviceName": "SimulationServer1",
        "id": "5c1ea763-bb50-4837-b78c-8ef1c2ed0035",
        "origin": 1702613269921,
        "profileName": "OPCUA-Server",
        "resourceName": "Constant",
        "value": "1.999900e+02",
        "valueType": "Float64"
      }
    ],
    "sourceName": "Constant"
  },
  "statusCode": 200
}

自动事件

AutoEvent 在设备定义文件的 autoEvents 部分中定义:

deviceList:
  autoEvents:
    interval: '30s'
    onChange: false
    sourceName: 'Constant'

服务启动后,查询 core-data API。 结果显示该服务每“30 秒”自动执行一次命令。

配置

OPC-UA 设备服务具有以下配置来实现 OPCUAServer 协议。

OPCUAServer 示例如下图:

# configuration.yml

OPCUAServer:
  DeviceName: SimulationServer
  Policy: None
  Mode: None
  CertFile: ''
  KeyFile: ''
  Writable:
    Resources: 'Counter,Random'
Configuration Default Value Description
DeviceName SimmulationServer Device name of OPC-UA
Policy None Security Policy of OPC-UA
- None
- Basic128Rsa15
- Basic256
- Basic256Sha256
- Aes128Sha256RsaOaep
- Aes256Sha256RsaPss
Mode None Security Mode of OPC-UA
-None
- Sign
- SignAndEncrypt
CertFile none Cert file of OPC-UA, path to cert.pem
KeyFile none Key file of OPC-UA, path to private key.pem
Writable.Resources none Subscritions of OPC-UA

协议属性

设备为 opcua 定义以下协议属性。

这些属性位于每个设备定义的协议部分中的“opcua”键下。

Property Description
Endpoint The Connection Address(UA TCP) of OPC-UA server

!!! example "opcua 协议属性示例"

```yaml
...
    protocols:
    opcua:
        Endpoint: "opc.tcp://jiekemacbookpro14.lan:53530/OPCUA/SimulationServer"
```

API 参考

该服务继承了 SDK 中的通用设备服务 API API。

源代码

Device Service OPC-UA 的源代码可以在 https://github.com/edgexfoundry/device-opcua 中找到(社区还未合并,目前在 https://github.com/yiqisoft/device-opcua-go/tree/refactor-v3 )。

关于我们

!!! success "亿琪软件"

上海亿琪软件有限公司成立于 2016 年,专注于 5G 通信、AI 人工智能、边缘计算和大数据网络安全多项技术领域,致力于物联网领域前沿技术的创新,为用户提供全方位、智能化和安全的物联网解决方案。

2023 年,公司发布“YiFUSION |工业边缘智能融合一体机”产品,为工业客户提供一整套的边缘计算+AI 能力:高性能数据采集、多类型数据融合、AI 算法集成、云端业务对接。在边缘网关的基础上,集成了 IoT 平台的边缘协同能力、本地 Web SCADA 和 HMI 功能、本地数据存储、边缘 AI 视频分析、行业应用集成等。

2022 年,公司推出 “YiCLOUD |亿琪云”一站式物联网应用解决方案。公司的业务涵盖了智慧城市、智慧农业、智能工厂和智慧园区等多个领域,公司软硬件产品和解决方案获得华为技术认证,得到中国移动 OCP 认证,公司还是边缘计算产业联盟 ECC 成员。

!!! tip "关注我们"

yiqisoft edgexfoundry

!!! warning "联系我们--商业服务"

  • 网站:http://yiqisoft.cn
  • 邮件:support@yiqisoft.cn
  • 电话:021-68863086
  • 手机:186-1666-9123