标签 EdgeX 下的文章

物联网边缘端协议很多,BACnet 就是一种比较常见的监控协议。今天,就来跟大家分享一下 BACnet 基于 EdgeX 框架数据采集、控制和分析。

目录

BACnet 是什么?

!!! info "BACnet 协议"

BACnet是用于智能建筑的通信协议,是国际标准化组织(ISO)、美国国家标准协会(ANSI)及美国采暖、制冷与空调工程师学会(ASHRAE)定义的通信协议1。BACnet针对智能建筑及控制系统的应用所设计的通信,可用在暖通空调系统(HVAC,包括暖气、通风、空气调节),也可以用在照明控制、门禁系统、火警侦测系统及其相关的设备。优点在于能降低维护系统所需成本并且安装比一般工业通信协议更为简易,而且提供有五种业界常用的标准协议,此可防止设备供应商及系统业者的垄断,也因此未来系统扩展性与兼容性大为增加。

!!! tip "最常见的 BACnet 协议有两种"

  • BACnet IP:网络层通讯,基于以太网,使用 IP 通信,==本案例使用此协议==
  • BACnet MS/TP:主从站通讯,就是串口,比如RS-485

!!! warning "什么是 BACnet BBMD?"

BACnet/IP 使用 UDP/IP 在现有的 IP 网络中进行通信,在多个IP子网中如果需要对 BACnet 的广播消息进行管理的时候就需要一种特殊的BBMD设备(Broadcast Management Device)。

更多信息,请查阅其他相关资源,非本案例的重点内容。

准备工作

!!! info "BACnet 模拟器"

本案例中,使用 Yabe (Yet Another Bacnet Explorer),请自行通过互联网下载。

其中,我们会用到一个子工具:==Bacnet.Room.Simulator==,将作为 BACnet 模拟设备来获取数据和控制。

软件打开后,类似如下,请记住右下角的 Id: ==2179272==

2023-12-11T00:54:01.png

!!! info "BACnet 查询工具"

本案例中,使用两种查询工具,都可以从互联网下载来使用。

  • Yabe:新建一个 BACnet/IP over UDP,自动出现 Device2023-12-11T00:48:12.png

  • BACnetSCAN:双击 ==BACnet IP== 条目,就会出现 Device。

!!! warning "注意"

BACnetSCAN 既可以作为查询工具,也可以作为

2023-12-11T00:48:39.png

到目前为止,都是 BACnet 相关的准备和设置。

EdgeX 微服务

EdgeX 基本微服务

!!! info "启动你的 EdgeX 核心模块"

下载 docker compose 运行环境

git clone -b v3.1.0 https://github.com/edgexfoundry/edgex-compose.git
cd edgex-compose/compose-builder
make run no-secty

保证你的 EdgeX 基本微服务启动成功

✔ Container edgex-core-consul                      Running
✔ Container edgex-redis                            Running
✔ Container edgex-ui-go                            Running
✔ Container edgex-core-common-config-bootstrapper  Running
✔ Container edgex-core-metadata                    Running
✔ Container edgex-kuiper                           Running
✔ Container edgex-support-notifications            Running
✔ Container edgex-support-scheduler                Running
✔ Container edgex-core-command                     Running
✔ Container edgex-core-data                        Running
✔ Container edgex-app-rules-engine                 Running

EdgeX BACnet 微服务

!!! info "增加 BACnet 微服务"

!!! warning "注意"

官方版本不能直接使用,拿不到 BACnet 设备信息,需要根据以下步骤执行

重新编译你的微服务,增加 ==ds-bacnet-ip== 即可

make run no-secty ds-bacnet-ip

修改 docker-compose.yml,保证 ==UDP:47808== 端口被映射到容器

device-bacnet-ip:
...
    ports:
    - mode: ingress
        host_ip: 127.0.0.1
        target: 59980
        published: "59980"
        protocol: tcp
    - mode: ingress
        host_ip: 0.0.0.0
        target: 47808
        published: "47808"
        protocol: udp
...

重启全部微服务

docker compose -p edgex up -d

确保 BACnet 微服务运行正常

curl -s http://localhost:59980/api/v3/ping|jq

{
"apiVersion": "v3",
"requestId": "98059fe6-4b81-4d79-a851-4d0db85dbdf5",
"statusCode": 200,
"timestamp": "Fri, 01 Dec 2023 11:13:45 UTC",
"serviceName": "device-bacnet-ip"
}

配置 Device Profile 和 Device

!!! info "Device Profile 配置信息"

name: TemperatureSimple
manufacturer: YIQISOFT
description: BACnet device simulator provided with YIQISOFT
model: BACnet Stack
labels: [BACnet]
deviceResources:
    - description: The current analog input value.
    name: Temperature.Indoor
    isHidden: false
    properties:
        valueType: Float32
        readWrite: RW
    attributes:
        instance: 0
        property: present-value
        type: analog-input
    - description: The current analog input value.
    name: Temperature.Water
    isHidden: false
    properties:
        valueType: Float32
        readWrite: RW
    attributes:
        instance: 1
        property: present-value
        type: analog-input
    - description: The current analog input value.
    name: Temperature.Outdoor
    isHidden: false
    properties:
        valueType: Float32
        readWrite: RW
    attributes:
        instance: 2
        property: present-value
        type: analog-input
deviceCommands:
    - name: Query
    isHidden: false
    readWrite: R
    resourceOperations:
        - deviceResource: Temperature.Indoor
        - deviceResource: Temperature.Water
        - deviceResource: Temperature.Outdoor

!!! info "Device 配置信息"

在 EdgeX UI 增加一个设备,以下信息必须保证一样,还记得前面的数字: ==2179272== 吗?就是填写在这里

2023-12-11T00:54:29.png

至此,设备配置相关内容就完成了

获取 BACnet 设备数据

了解 BACnet 工作机制,可采用多种方法来做

!!! warning "是否采用 BBMD?"

前面说过 BBMD ,这个概念很重要,因为我们下面的方法用到了相关内容。

  • 方法一:不采用 BBMD
  • 方法二:采用外部 BBMD

!!! info "方法一"

以上所有的配置,只是用 EdgeX BACnet 微服务本地来管理 BACnet 设备。前提是,你需要手动触发 ==BACnet who-Is== 请求,使用上述两个查询工具都可以完成这个操作。

  • Yabe:选中 Udp:47808 后,按键盘:F2 即可;
  • BACnetSCAN:选中 BACnet IP 后,右键:搜索设备;

此时,在 EdgeX BACnet 微服务 log 下会出现如下信息,证明 BACnet 微服务已经收到 who-Is 广播包:

level=DEBUG ts=2023-12-01T11:51:36Z app=device-bacnet-ip msg="Processing I-Am Request from 2179272"

查询 BACnet 设备 2179272 设备数据:

curl http://localhost:59881/api/v3/device/name/hello/Query

结果如下:

{
    "apiVersion": "v3",
    "statusCode": 200,
    "event": {
        "apiVersion": "v3",
        "id": "799292fc-565e-4b90-945c-18383dfafbcc",
        "deviceName": "hello",
        "profileName": "TemperatureSimple",
        "sourceName": "Query",
        "origin": 1701431871437505753,
        "readings": [
            {
                "id": "6c0e2297-3b63-436e-b908-b6f9b563cc03",
                "origin": 1701431871437505753,
                "deviceName": "hello",
                "resourceName": "Temperature.Indoor",
                "profileName": "TemperatureSimple",
                "valueType": "Float32",
                "value": "2.07999992e+01"
            },
            {
                "id": "8aef6bec-710f-4216-a1f6-1e7e4607599a",
                "origin": 1701431871437505753,
                "deviceName": "hello",
                "resourceName": "Temperature.Water",
                "profileName": "TemperatureSimple",
                "valueType": "Float32",
                "value": "3.87999992e+01"
            },
            {
                "id": "8ef8d25b-c77f-44df-90cd-ec1e4e365e4c",
                "origin": 1701431871437505753,
                "deviceName": "hello",
                "resourceName": "Temperature.Outdoor",
                "profileName": "TemperatureSimple",
                "valueType": "Float32",
                "value": "1.20000000e+01"
            }
        ]
    }
}

!!! warning "这种方法的弊端就是需要 EdgeX BACnet 微服务来管理这些广播包"

!!! info "方法二"

需要修改 EdgeX BACnet 微服务配置文件: configuration.yaml,启用外部 BBMD

...
Driver:
    BBMD_ADDRESS: '192.168.123.11'
    BBMD_PORT: '47808'
...

重启微服务

make clean
docker compose -p edgex up -d

Docker 容器管理器可以看到 AutoEvents 日志,一切工作正常:

level=INFO ts=2023-12-01T12:14:49Z app=device-bacnet-ip correlation-id=72a29f26-9d4c-4fee-a037-20827cf522c7 msg="AutoEvent: TemperatureDevice/Query"
level=DEBUG ts=2023-12-01T12:14:49Z app=device-bacnet-ip correlation-id=72a29f26-9d4c-4fee-a037-20827cf522c7 msg="GET on device: TemperatureDevice"
level=INFO ts=2023-12-01T12:14:50Z app=device-bacnet-ip correlation-id=1ca57207-8d0c-4094-a384-e48da5140e80 msg="AutoEvent: TemperatureDevice/Query"
level=DEBUG ts=2023-12-01T12:14:50Z app=device-bacnet-ip correlation-id=1ca57207-8d0c-4094-a384-e48da5140e80 msg="GET on device: TemperatureDevice"
level=INFO ts=2023-12-01T12:14:51Z app=device-bacnet-ip correlation-id=0a5ddc91-cc04-472b-b20a-64deaa16530d msg="AutoEvent: TemperatureDevice/Query"
level=DEBUG ts=2023-12-01T12:14:51Z app=device-bacnet-ip correlation-id=0a5ddc91-cc04-472b-b20a-64deaa16530d msg="GET on device: TemperatureDevice"
level=INFO ts=2023-12-01T12:14:52Z app=device-bacnet-ip correlation-id=e8a19615-2caa-4295-913b-aff37cdadbba msg="AutoEvent: TemperatureDevice/Query"
level=DEBUG ts=2023-12-01T12:14:52Z app=device-bacnet-ip correlation-id=e8a19615-2caa-4295-913b-aff37cdadbba msg="GET on device: TemperatureDevice"
level=INFO ts=2023-12-01T12:14:53Z app=device-bacnet-ip correlation-id=da1f321e-2780-40d9-af38-b4387a141b2f msg="AutoEvent: TemperatureDevice/Query"
level=DEBUG ts=2023-12-01T12:14:53Z app=device-bacnet-ip correlation-id=da1f321e-2780-40d9-af38-b4387a141b2f msg="GET on device: TemperatureDevice"

数据上传 亿琪软件物联网平台 YiCONNECT

!!! info "配置 eKuiper 规则引擎"

创建 Stream

CREATE STREAM EdgeXStream () WITH (format = "json", type = "edgex", shared = "true")

创建 Rule

{
    "triggered": true,
    "id": "RuleToYiCONNECT",
    "sql": "SELECT * , meta(deviceName) as deviceName, tstamp() as ts FROM EdgeXStream",
    "actions": [
        {
            "mqtt": {
                "dataTemplate": "{\"{{.deviceName}}\":[{\"ts\":{{.ts}}, \"values\":{{json .}}}]}",
                "insecureSkipVerify": true,
                "protocolVersion": "3.1",
                "qos": 0,
                "retained": false,
                "sendSingle": true,
                "server": "tcp://demo.yiqisoft.cn:1883",
                "topic": "v1/gateway/telemetry",
                "username": "************"
            }
        }
    ],
    "options": {
        "debug": false,
        "logFilename": "",
        "isEventTime": false,
        "lateTolerance": 1000,
        "concurrency": 1,
        "bufferLength": 1024,
        "sendMetaToSink": false,
        "sendError": true,
        "qos": 0,
        "checkpointInterval": 300000,
        "restartStrategy": {
            "attempts": 0,
            "delay": 1000,
            "multiplier": 2,
            "maxDelay": 30000,
            "jitter": 0.1
        },
        "cron": "",
        "duration": "",
        "cronDatetimeRange": null
    }
}

确保服务器连接正常,且数据传输正确。数据输入和输出数量一致,各方面的延迟都很正常。

{
    "status": "running",
    "source_EdgeXStream_0_records_in_total": 557,
    "source_EdgeXStream_0_records_out_total": 557,
    "source_EdgeXStream_0_process_latency_us": 138,
    "source_EdgeXStream_0_buffer_length": 0,
    "source_EdgeXStream_0_last_invocation": "2023-12-01T12:32:49.03012",
    "source_EdgeXStream_0_exceptions_total": 0,
    "source_EdgeXStream_0_last_exception": "",
    "source_EdgeXStream_0_last_exception_time": 0,
    "op_2_project_0_records_in_total": 557,
    "op_2_project_0_records_out_total": 557,
    "op_2_project_0_process_latency_us": 37,
    "op_2_project_0_buffer_length": 0,
    "op_2_project_0_last_invocation": "2023-12-01T12:32:49.03027",
    "op_2_project_0_exceptions_total": 0,
    "op_2_project_0_last_exception": "",
    "op_2_project_0_last_exception_time": 0,
    "sink_mqtt_0_0_records_in_total": 557,
    "sink_mqtt_0_0_records_out_total": 557,
    "sink_mqtt_0_0_process_latency_us": 262,
    "sink_mqtt_0_0_buffer_length": 0,
    "sink_mqtt_0_0_last_invocation": "2023-12-01T12:32:49.030321",
    "sink_mqtt_0_0_exceptions_total": 0,
    "sink_mqtt_0_0_last_exception": "",
    "sink_mqtt_0_0_last_exception_time": 0
}

物联网平台展示和分析数据

!!! info "Yabe 数据可视化效果"

2023-12-11T00:52:45.png

!!! info "物联网平台动态展示"

2023-12-11T00:53:01.png

关于我们

"亿琪软件"

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

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

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

yiqisoft 2023-12-01T00:41:00.png

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

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