产品定价 立即试用
IoT网关
文档 > 配置指南 > BACnet连接器
入门
安装
目录

BACnet连接器配置

概述

本文档将帮助您为ThingsBoard IoT Gateway配置BACnet连接器。我们将用简单易懂的方式解释配置参数,便于您理解与操作。BACnet协议广泛应用于楼宇自动化与控制系统,如暖通空调(HVAC)、照明控制、门禁控制以及消防检测系统等。请使用通用配置 启用此扩展。

BACnet连接器使ThingsBoard IoT Gateway能够与BACnet设备通信,实现数据交换与控制。该连接器可通过用户界面表单进行配置,帮助您建立与BACnet设备的连接、采集数据并写入设备。下面我们将逐一说明所有可用设置,便于您理解整体工作方式。

文档信息图标

请注意: 在创建连接器之前,请先连接网关。否则界面将显示旧版配置字段以保持向后兼容。

配置模式

BACnet连接器支持两种配置模式:基本(Basic)和高级(Advanced)。

  • 基本模式面向不熟悉ThingsBoard IoT Gateway的用户,通过最少配置快速完成连接器设置,提供简化的界面和必要选项。
  • 高级模式面向需要更细致配置控制的用户,提供更多选项和高级使用场景的灵活性。
文档信息图标

请注意: 若不熟悉IoT Gateway,请使用「基本」配置模式;若您熟悉IoT Gateway配置,则可使用「高级」配置模式。

您可通过配置页面顶部的切换按钮在两种模式间切换:

image

通用设置

本配置部分包含 connector 的通用设置,例如:

  • Name - 用于日志和保存到持久化设备的 connector 名称;
  • Logs configuration(日志配置) - 本地和远程日志设置:
    • Enable remote logging - 为 connector 启用远程日志;
    • Logging level - 本地和远程日志级别:NONE、ERROR、CRITICAL、WARNING、INFO、DEBUG、TRACE;
  • Report strategy - 向 ThingsBoard 发送数据的策略:
    • Report period - 向 ThingsBoard 发送数据的周期(毫秒);
    • Type - report strategy 类型:
      • On report period - 在上报周期后向 ThingsBoard 发送数据;
      • On value change - 值变化时向 ThingsBoard 发送数据;
      • On value change or report period - 值变化或到达上报周期时向 ThingsBoard 发送数据;
      • On received - 从设备接收数据后向 ThingsBoard 发送数据(默认策略)。
文档信息图标

更多关于 report strategy 的信息请参见此处

image

文档信息图标

设置中的「通用」标签页在基本和高级配置中相同。

应用

本部分配置用于在BACnet网络中配置网关。以下参数用于配置应用设置:

  • Object Name - 网关在 BACnet 网络中的对象名。
  • Host - 网关在 BACnet 网络中的主机。请确保使用设备所在位置的正确网络地址,以便网关能找到它们。
  • Port - 网关在 BACnet 网络中的端口。
  • Network mask - 网关在 BACnet 网络中的掩码。
  • Object ID - 网关在 BACnet 网络中的对象标识符。
  • Vendor ID - 网关在 BACnet 网络中的厂商标识符。
文档信息图标

所有配置参数列表及详细说明请参见高级配置部分。

image

高级应用设置

可配置额外的应用参数,如:APDU长度、分段、网络号及发现超时。

参数 默认值 说明
APDU长度(字节) 1476 APDU的最大长度。
分段 Both 传输大型BACnet消息的分段类型。可选:BothTransmitReceiveNone
网络号 3 网络段的标识符。
发现超时(秒) 5 连接器尝试发现BACnet设备的时长。
文档信息图标

所有配置参数及其详细说明请参阅高级配置部分。

image

数据映射

本配置部分包含可连接至连接器并发送数据的BACnet设备数组。未包含在此数组中的BACnet设备将被连接器拒绝。

要添加新设备,请点击 “plus“(加号)图标:

image

在打开的 modal 窗口中填写以下字段:

  • Host - 设备的主机;
  • Port - 设备的端口;
  • Device name source - 设备名称来源,可为:
    • Constant - 设备名称为静态;
    • Expression - 设备名称为表达式;
  • Device name value / expression - 设备名称(详细示例见此处);
  • Device profile source - device profile 来源,可与设备名称来源相同;
  • Device profile value / expression - device profile 名称(详细示例见此处);
  • Poll period - connector 轮询 BACnet 设备的时间周期;
  • Advanced configuration settings(高级配置设置):
    • Alternative responses addresses - 设备响应的备用地址(详细示例见此处)。
  • Report strategy - 向 ThingsBoard 发送数据的策略:
    • Report period - 向 ThingsBoard 发送数据的周期(毫秒);
    • Type - report strategy 类型:
      • On report period - 在上报周期后向 ThingsBoard 发送数据;
      • On value change - 当值变化时向 ThingsBoard 发送数据;
      • On value change or report period - 当值变化或在上报周期后向 ThingsBoard 发送数据;
      • On received - 从设备接收数据后向 ThingsBoard 发送数据(默认策略)。
文档信息图标

所有配置参数列表及详细说明请参见高级配置部分。

更多使用示例请参见使用示例部分。

有关 report strategy 的更多信息请参见此处

image

属性和时序数据

本配置部分包含处理传入数据的参数。您可指定哪些数据作为设备属性、哪些作为时序数据。属性用于存储静态或较少变化的数据,时序数据用于存储动态或频繁变化的数据。

本子节的配置提供将 BACnet 设备数据作为平台实例上的时序和属性进行处理的设置。

若要添加新的时序或属性 key,请按以下步骤操作:

  • 点击 “属性” 部分的 “铅笔” 图标以添加新的属性 key;

  • 在打开的窗口中点击 “添加属性“;

  • 输入 key 名称,从下拉列表选择 “Object ID” 和 “Property ID”。点击 “应用“;

  • 现在点击 “时序” 部分的 “铅笔” 图标以添加新的时序 key;

  • 在打开的窗口中点击 “添加时序“;

  • 输入 key 名称,从下拉列表选择 “Object ID” 和 “Property ID”。点击 “应用“。

文档信息图标

完整配置参数列表及其详细说明请参阅 高级配置 部分。

更多使用示例请参阅 示例用法 部分。

筛选(自 v.3.7.5 起,仅在高级配置模式下可用)

您可根据对象类型 (Object Type)、对象 ID (Object ID) 和属性 ID (Property ID) 为时序和属性设置筛选。由此可指定应收集并发送到平台的数据。以下为各筛选选项说明:

对象类型筛选

此筛选可指定应从哪些类型的 BACnet 对象收集数据。例如,可选择仅从 “Analog Input” 或 “Binary Output” 对象类型或两者收集数据:

  • "objectType": "*" - 从所有支持的对象类型收集数据;
  • "objectType": "analogValue" - 仅从 Analog Value 对象收集数据;
  • "objectType": ["analogValue", "binaryInput"] - 从 “Analog Value” 和 “Binary Input” 对象收集数据。

对象 ID 筛选

此筛选可指定用于数据收集的特定对象 ID。可定义单个对象 ID 或对象 ID 列表:

  • "objectId": 1234 - 仅从 ID 为 1234 的对象收集数据;
  • "objectId": "*" - 从所有对象 ID 收集数据;
  • "objectId": "0-10" - 从 0 到 10(含)范围内的对象 ID 收集数据;
  • "objectId": ["0-10", "12-15"] - 从 0 到 10 和 12 到 15(含)范围内的对象 ID 收集数据。

属性 ID 筛选

此筛选可指定用于数据收集的特定属性 ID。可定义单个属性 ID 或属性 ID 列表:

  • "propertyId": "presentValue" - 仅读取 “presentValue” 属性;
  • "propertyId": "*" - 读取所有支持的属性
  • "propertyId": ["presentValue", "location"] - 读取 “presentValue” 和 “location” 属性。
文档警告图标

警告: 不允许将对象类型列表("*" 除外)与对象 ID 范围或范围列表一起使用。

筛选配置示例:

1
2
3
4
5
6
7
8
9
10
{
  "timeseries": [
    {
      "key": "${objectName} - ${objectType} | ${units}",
      "objectType": "analogInput",
      "objectId": "*",
      "propertyId": ["presentValue", "statusFlags"]
    }
  ]
}
文档信息图标

更多使用示例请参阅 示例用法 部分。

上报策略

对于每个时序或属性,您可启用特定的上报策略。该策略定义向 ThingsBoard 服务器发送数据的频率。可用策略如下:

  • 按上报周期 - 在上报周期后向 ThingsBoard 发送数据;
  • 按值变化 - 当值发生变化时向 ThingsBoard 发送数据;
  • 按值变化或上报周期 - 当值发生变化或在上报周期后向 ThingsBoard 发送数据;
  • 按接收 - 从设备接收数据后向 ThingsBoard 发送数据(默认策略)。

image

文档信息图标

有关上报策略的更多信息请参阅此处

使用示例

BACnet 连接器允许您使用表达式设置动态设备名称和配置文件。当您有多台具有相似配置的设备并希望根据其属性区分它们时,此功能尤其有用。 本示例中,我们将配置 BACnet 设备根据其 objectNameaddress 属性具有动态设备名称,并根据其 vendorId 属性具有动态设备配置。

以下为具有动态设备名称和配置文件的 BACnet 设备配置示例片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "application": {
    "objectName": "TB_gateway",
    "host": "YOUR_HOST",
    "port": 47808,
    "mask": 24,
    "objectIdentifier": 599,
    "maxApduLengthAccepted": 1476,
    "segmentationSupported": "segmentedBoth",
    "vendorIdentifier": 15,
    "deviceDiscoveryTimeoutInSec": 5,
    "devicesDiscoverPeriodSeconds": 30
  },
  "devices": [
    {
      "host": "*",
      "port": "*",
      "pollPeriod": 10000,
      "deviceInfo": {
        "deviceNameExpressionSource": "expression",
        "deviceNameExpression": "${objectName} at ${address}",
        "deviceProfileExpressionSource": "expression",
        "deviceProfileExpression": "${vendorId}_profile"
      },
      "attributes": [],
      "timeseries": "*",
      "attributeUpdates": [],
      "serverSideRpc": []
    }
  ]
}

在此配置中:

  • deviceNameExpression 设为 ${objectName} at ${address},将创建设备名称,包含设备对象名称和地址。
  • deviceProfileExpression 设为 ${vendorId}_profile,将根据设备的厂商标识符创建设备配置名称。

应用此配置后,设备将以反映其特定属性的名称和配置文件创建。下方截图显示设备在ThingsBoard 中的动态名称和配置文件显示方式:

image

如您所见,设备名称根据 objectNameaddress 生成,设备配置根据 vendorId 生成。

设备名称/配置文件的动态表达式为管理具有不同配置的多台 BACnet 设备提供了灵活性,有助于在ThingsBoard 中有效组织设备。

文档信息图标

完整可用变量列表请参阅 高级配置 部分。

替代响应地址字段允许您为设备响应指定替代 IP 地址。 当网关和 BACnet 设备位于不同网络时,此功能尤其有用。

例如,考虑以下网络设置:

image

在此设置中,网关运行在 Docker 容器内,BACnet 设备位于本地网络中,IP 地址为 192.168.1.200:45606,无法从 Docker 容器直接访问。BACPypes 向网关发送 APDU 时不包含端口号,导致连接器无法判断响应是否来自允许的设备。配置替代响应地址后,连接器将使用该 IP 正确识别和验证设备。

要配置替代响应地址,需要在设备配置中添加 altResponsesAddresses 字段。以下为配置示例片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
  "application": {
    "objectName": "TB_gateway",
    "host": "0.0.0.0",
    "port": 47808,
    "mask": 24,
    "objectIdentifier": 599,
    "maxApduLengthAccepted": 1476,
    "segmentationSupported": "segmentedBoth",
    "vendorIdentifier": 15,
    "deviceDiscoveryTimeoutInSec": 5,
    "devicesDiscoverPeriodSeconds": 30
  },
  "devices": [
    {
      "deviceInfo": {
        "deviceNameExpressionSource": "expression",
        "deviceNameExpression": "BACnet Device ${objectName}",
        "deviceProfileExpressionSource": "constant",
        "deviceProfileExpression": "default"
      },
      "host": "192.168.1.200",
      "port": 45606,
      "altResponsesAddresses": ["192.168.1.200"],
      "pollPeriod": 10000,
      "attributes": [],
      "timeseries": "*",
      "attributeUpdates": [],
      "serverSideRpc": []
    }
  ]
}

应用此配置后,连接器将使用指定的替代响应地址 192.168.1.200:45606 识别和验证来自 BACnet 设备的响应。这确保即使网关与设备位于不同网络,连接器也能有效与设备通信。因此,您应在ThingsBoard 中看到已创建设备:

image

当网络中有许多设备具有相同的对象列表且需要读取其值时,为每个设备复制配置并不方便。BACnet 连接器允许您自动查找网络上的所有设备,并使用相同配置连接它们。为此,您需要指定设备的 host 和 port,以及设备名称和设备配置的模板。

让我们看一个如何正确配置自动设备发现的示例。

假设我们有两台具有相同对象列表的设备:

Object Type Object ID Property ID Key
Analog Input 1 Present Value temperature
Binary Input 1 Present Value relay
Analog Input 2 Present Value humidity
Analog Input 3 Present Value pressure

要配置自动设备发现,请使用以下 BACnet 连接器配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
{
  "application": {
    "objectName": "TB_gateway",
    "host": "YOUR_HOST",
    "port": 47808,
    "objectIdentifier": 599,
    "vendorIdentifier": 15,
    "maxApduLengthAccepted": 1476,
    "segmentationSupported": "segmentedBoth",
    "deviceDiscoveryTimeoutInSec": 5
  },
  "devices": [
    {
      "altResponsesAddresses": [],
      "host": "*",
      "port": "*",
      "deviceInfo": {
        "deviceNameExpression": "${objectName}",
        "deviceProfileExpression": "default",
        "deviceNameExpressionSource": "expression",
        "deviceProfileExpressionSource": "constant"
      },
      "pollPeriod": 10000,
      "timeseries": [
        {
          "key": "temperature",
          "objectType": "analogInput",
          "objectId": 1,
          "propertyId": "presentValue"
        },
        {
          "key": "relay",
          "objectType": "binaryInput",
          "objectId": 1,
          "propertyId": "presentValue"
        },
        {
          "key": "humidity",
          "objectType": "analogInput",
          "objectId": 2,
          "propertyId": "presentValue"
        },
        {
          "key": "pressure",
          "objectType": "analogInput",
          "objectId": 3,
          "propertyId": "presentValue"
        }
      ],
      "attributes": [],
      "attributeUpdates": [],
      "serverSideRpc": []
    }
  ]
}

以下为主要参数,用于正确配置自动设备检测。我们来详细了解:

  • host - 需指定为 *,以便连接器接受来自网络上所有设备的所有 IAm 消息。
  • port - 需指定为 *,以便连接器接受来自网络上所有设备的所有 IAm 消息。
  • deviceNameExpression - 设备名称的模板。使用 ${objectName} 将设备名称与 BACnet 网络中的对象名称匹配。
  • deviceProfileExpression - 设备配置的模板。本例中我们使用 default,因为所有设备类型相同。

保存更改并启动连接器后,它将向网络发送 WhoIs 查询并开始接收来自所有设备的 IAm 消息。收到 IAm 消息后,连接器将为每个发现的设备使用指定模板自动创建设备,并开始从对象读取数据。下方截图显示自动发现后的设备列表:

image

当 BACnet 设备有许多对象,您希望读取设备的所有对象而无需在连接器配置中手动添加每个对象时,或当您不知道设备中有哪些对象并希望自动读取所有对象时,BACnet 连接器支持此功能,允许您通过轻松配置一个参数即可读取设备的所有对象。

让我们看一个如何正确配置读取所有设备对象的示例。

要读取所有设备对象,您需要决定这些对象的值将存储在哪里:telemetryattributes。根据此选择,需在相应部分放入 *

在本例中,我们将把所有对象存储在时序中,因此设备配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "application": {
    "objectName": "TB_gateway",
    "host": "YOUR_HOST",
    "port": 47808,
    "objectIdentifier": 599,
    "vendorIdentifier": 15,
    "maxApduLengthAccepted": 1476,
    "segmentationSupported": "segmentedBoth",
    "deviceDiscoveryTimeoutInSec": 5
  },
  "devices": [
    {
      "altResponsesAddresses": [],
      "host": "YOUR_DEVICE_HOST",
      "port": 47808,
      "deviceInfo": {
        "deviceNameExpression": "${objectName}",
        "deviceProfileExpression": "default",
        "deviceNameExpressionSource": "expression",
        "deviceProfileExpressionSource": "constant"
      },
      "pollPeriod": 10000,
      "timeseries": "*",
      "attributes": [],
      "attributeUpdates": [],
      "serverSideRpc": []
    }
  ]
}

从上述配置可以看出,我们在 timeseries 部分放入了 *,表示所有设备对象将保存到遥测中。在 attributes 部分我们没有放入 *,因此不会读取属性。

保存更改并启动连接器后,您可以看到对应设备已添加到平台,其遥测开始填充所有设备对象:

image

当 BACnet 设备有许多对象,而您只想读取设备中的特定对象或属性时,可使用筛选选项指定应收集并发送到平台的数据。

让我们看一个如何正确配置筛选功能的示例。

在本例中,我们的设备有许多对象,但我们只想读取前三个 Analog Value 对象的 presentValueunits 属性。为此,需要如下在属性/时序部分配置筛选选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
  "application": {
    "objectName": "TB_gateway",
    "host": "YOUR_HOST",
    "port": 47808,
    "mask": "24",
    "objectIdentifier": 599,
    "maxApduLengthAccepted": 1476,
    "segmentationSupported": "segmentedBoth",
    "vendorIdentifier": 15,
    "deviceDiscoveryTimeoutInSec": 5,
    "devicesDiscoverPeriodSeconds": 30
  },
  "devices": [
    {
      "deviceInfo": {
        "deviceNameExpression": "BACnet Device ${objectName}",
        "deviceProfileExpression": "default",
        "deviceNameExpressionSource": "expression",
        "deviceProfileExpressionSource": "constant"
      },
      "altResponsesAddresses": [],
      "host": "YOUR_DEVICE_HOST",
      "port": "YOUR_DEVICE_PORT",
      "pollPeriod": 10000,
      "attributes": [],
      "timeseries": [
        {
          "key": "${objectName} ${objectType}",
          "objectType": "analogValue",
          "objectId": "1-3",
          "propertyId": ["presentValue", "units"]
        }
      ],
      "attributeUpdates": [],
      "serverSideRpc": []
    }
  ]
}

从上述配置可以看出,我们已将 objectType 指定为 analogValueobjectId 指定为 1-3(表示读取 ID 为 1 到 3 的对象),propertyId 指定为包含 presentValueunits 的数组。此配置将确保仅读取并发送所选对象的指定属性到平台。此外,我们将 key 指定为 ${objectName} ${objectType},以便遥测 key 更具描述性。

保存更改并启动连接器后,您可以看到对应设备已添加到平台,其遥测开始填充筛选后的数据。下方截图显示应用筛选配置后设备遥测的示例:

image

请求映射

请求映射部分用于配置ThingsBoard平台实例与设备的交互方式,即平台如何向设备请求数据、如何更新设备属性以及如何向设备发送RPC命令。

BACnet连接器支持以下请求映射:

  • 属性更新:支持从ThingsBoard平台实例更新设备对象值。
  • RPC方法:支持向设备发送RPC命令。使用RPC方法可读取或设置BACnet设备对象值。BACnet连接器支持多种RPC方法,例如:
    • 保留的GET/SET方法:为每个属性和时序参数自动创建,可用于读取或设置BACnet设备对象值。
    • 可配置的RPC到设备:可在连接器配置中定义自定义RPC命令并发送至设备。

属性更新

本小节包含ThingsBoard平台实例发起属性更新请求的配置。

ThingsBoard支持预配设备属性,并可从设备应用拉取部分属性。可将其视为设备的远程配置,使设备能够从ThingsBoard请求共享属性。详见用户指南

以下参数用于配置属性更新:

  • Key:ThingsBoard中共享属性的键,可为静态值。
  • Object ID:BACnet设备中的对象ID。
  • Object Type:BACnet设备中的对象类型。
  • Property ID:BACnet设备中的属性ID。
文档信息图标

所有配置参数及其详细说明请参阅高级配置部分。更多使用示例请参阅使用示例部分。

image

若要添加新的属性更新,请按以下步骤操作:

  • 点击 “铅笔” 图标(”属性更新” 子节)以添加新的属性更新;

  • 在打开的窗口中点击 “添加属性更新“;

  • 填写 “Key” 字段,从下拉列表选择 “Object ID” 和 “Property ID“。点击 “应用” 按钮。

RPC方法

ThingsBoard支持向直接连接或经网关连接的设备发送RPC命令。以下参数用于配置RPC方法:

  • Method - RPC方法名称。
  • Request Type - “writeProperty“用于写入数据,”readProperty“用于读取数据。
  • Object ID - BACnet设备中的对象ID。
  • Object Type - BACnet设备中的对象类型。
  • Property ID - BACnet设备中的属性ID。
  • Request Timeout - RPC方法执行的超时时间(毫秒)。
文档信息图标

所有配置参数及其详细说明请参阅高级配置部分。

更多使用示例请参阅使用示例部分。

image

若要添加新的 RPC 方法,请按以下步骤操作:

  • 点击 “RPC 方法” 部分的 “铅笔” 图标以添加新的 RPC;

  • 在打开的窗口中点击 “添加方法“;

  • 填写 “Method” 字段,从下拉列表选择 “Request Type“、”Object ID“、”Property ID“。点击 “应用” 按钮。

文档信息图标

此外,每个遥测和属性参数均内置GET和SET RPC方法, 无需手动配置。参见指南

使用示例

属性更新允许您更新 BACnet 设备上的对象值。您可以在设备配置页面的 “属性更新” 部分添加新的属性更新。

例如,我们将使用连接了继电器的 BACnet 控制器。我们还知道该继电器的对象 ID 为:Binary Input:1。我们将此对象 ID 作为遥测参数添加,key 为 relay。使用遥测便于我们后续查看通过属性更新更改的值是否生效。您也可以将此遥测数据点添加到设备配置中,或使用保留的 get 方法检查节点值。

让我们向配置中添加属性更新。为此,请按以下步骤操作:

  • 在左侧边栏中进入 “实体” → “网关” 并选择您的网关。

  • 点击右侧菜单的 “连接器配置” 按钮。

  • 选择已创建的 BACnet 连接器并点击 “设备” 标签。确保已配置并连接设备(若不知如何操作,请参阅本指南的 应用设置数据映射 部分)。点击要配置属性更新的设备上的 “铅笔” 图标。

  • 向下滚动到 “属性更新” 部分,点击 “铅笔” 图标以编辑属性更新。

  • 点击 “添加属性更新” 按钮。在本例中,我们将添加 relay 属性更新,因此在 “Key” 字段输入 relay,选择 “Object ID” 为 Analog Input 和 “1“,”Property ID” 为 “Present Value“。

  • 记得点击 “应用” 按钮保存更改,并点击保存连接器配置按钮。

现在我们可以检查属性更新是否生效。进入 “实体” → “设备” → 选择已创建设备 → “属性” 标签 → 选择 “共享属性” → 点击 “+” 图标并添加 relay 属性,类型设为 “Boolean“,值设为 “True“。

现在,让我们检查继电器对象 ID 的值。在所选设备中,进入 “最新遥测” 标签并检查 relay 遥测的值。由于我们将共享属性设为了 true,其应为 true

image

尝试将 relay 共享属性的值更改为 false。几秒钟后,您应看到 relay 遥测值已变为 false,这表示属性更新已正确生效。

上述示例的 BACnet 连接器完整配置如下 (请务必使用正确的设备 host 和 port)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{
  "application": {
    "objectName": "TB_gateway",
    "host": "YOUR_HOST",
    "port": 47808,
    "objectIdentifier": 599,
    "vendorIdentifier": 15,
    "maxApduLengthAccepted": 1476,
    "segmentationSupported": "segmentedBoth",
    "networkNumber": 3,
    "deviceDiscoveryTimeoutInSec": 5
  },
  "devices": [
    {
      "altResponsesAddresses": [],
      "host": "YOUR_DEVICE_HOST",
      "port": 47808,
      "networkMask": "",
      "deviceInfo": {
        "deviceNameExpression": "${objectName}",
        "deviceProfileExpression": "default",
        "deviceNameExpressionSource": "expression",
        "deviceProfileExpressionSource": "constant"
      },
      "pollPeriod": 10000,
      "timeseries": [
        {
          "key": "relay",
          "objectType": "binaryInput",
          "objectId": 1,
          "propertyId": "presentValue"
        }
      ],
      "attributes": [],
      "attributeUpdates": [
        {
          "key": "relay",
          "objectType": "binaryInput",
          "objectId": 1,
          "propertyId": "presentValue"
        }
      ],
      "serverSideRpc": []
    }
  ]
}

RPC 到设备允许向直接连接或通过网关连接 ThingsBoard 的设备发送 RPC 命令。

例如,我们将使用带温度传感器的 BACnet 控制器。我们还知道温度传感器的对象 ID 为:Analog Value:1,因此将使用 RPC 到设备读取该值。要调用此方法,首先需要配置 BACnet 连接器以支持 RPC 调用。为此,请按以下步骤操作:

  • 在左侧边栏中进入 “实体” → “网关” 并选择您的网关。

  • 点击右侧菜单的 “连接器配置” 按钮。

  • 选择已创建的 BACnet 连接器并点击 “设备” 标签。确保已配置并连接设备(若不知如何操作,请参阅本指南的 应用设置数据映射 部分)。点击要配置属性更新的设备上的 “铅笔” 图标。

  • 向下滚动到 “RPC 方法” 部分,点击 “铅笔” 图标以编辑 RPC 方法。

  • 点击 “添加方法” 按钮。在 “Method” 字段填写 getTemperature,选择 “Request Type” 为 “Read Property“,”Object ID” 为 “Analog Value” 和 “1“,”Property ID” 为 “Present Value“。

  • 记得点击 “应用” 按钮保存更改,并点击保存连接器配置按钮。

配置已完成,让我们看看如何调用该方法。在 RPC 调试终端部件中,运行以下命令:

1
getTemperature

响应:

image

文档信息图标

RPC 调试终端仅用于示例目的,您可以使用任何支持 RPC 调用的部件。

上述示例的 BACnet 连接器完整配置如下 (请务必使用正确的设备 host 和 port)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{
  "application": {
    "objectName": "TB_gateway",
    "host": "YOUR_HOST",
    "port": 47808,
    "objectIdentifier": 599,
    "vendorIdentifier": 15,
    "maxApduLengthAccepted": 1476,
    "segmentationSupported": "segmentedBoth",
    "deviceDiscoveryTimeoutInSec": 5
  },
  "devices": [
    {
      "altResponsesAddresses": [],
      "host": "YOUR_DEVICE_HOST",
      "port": 47808,
      "deviceInfo": {
        "deviceNameExpression": "${objectName}",
        "deviceProfileExpression": "default",
        "deviceNameExpressionSource": "expression",
        "deviceProfileExpressionSource": "constant"
      },
      "pollPeriod": 10000,
      "timeseries": [
        {
          "key": "some-key",
          "objectType": "binaryInput",
          "objectId": 1,
          "propertyId": "presentValue"
        }
      ],
      "attributes": [],
      "attributeUpdates": [],
      "serverSideRpc": [
        {
          "method": "getTemperature",
          "objectType": "analogValue",
          "objectId": 1,
          "propertyId": "presentValue",
          "timeout": 5000,
          "requestType": "readProperty"
        }
      ]
    }
  ]
}

每个遥测和属性参数默认都有 GETSET RPC 方法,因此您无需手动配置。

例如,我们将使用连接了继电器的 BACnet 控制器。我们还知道该继电器的对象 ID 为:Binary Input:1

我们将使用此对象 ID 通过 GET RPC 方法读取继电器值,并通过 SET RPC 方法设置继电器值。此遥测的配置如下:

1
2
3
4
5
6
{
  "key": "relay",
  "objectType": "binaryInput",
  "objectId": 1,
  "propertyId": "presentValue"
}

让我们使用保留的 GET 方法检查继电器值。要获取继电器当前值,请在 RPC 调试终端中运行以下查询:

1
get objectType=binaryInput;objectId=1;propertyId=presentValue;

响应:

1
{"result": {"value":  "inactive"}}

image

因此,GET 方法返回继电器的当前值,我们可以看到继电器处于关闭状态。

文档信息图标

RPC 调试终端仅用于示例目的,您可以使用任何支持 RPC 调用的部件。

要设置继电器值并打开继电器,请运行以下查询:

1
set objectType=binaryInput;objectId=1;propertyId=presentValue;value=1;

响应:

1
{"result": {"value": 1}}

如您从下方截图所见,继电器遥测值已变为 1

image

此外,让我们再次检查继电器遥测值:

1
get objectType=binaryInput;objectId=1;propertyId=presentValue;

响应:

1
{"result": {"value":  "active"}}

image

上述示例的 BACnet 连接器完整配置如下 (请务必使用正确的设备 host 和 port)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
  "application": {
    "objectName": "TB_gateway",
    "host": "YOUR_HOST",
    "port": 47808,
    "objectIdentifier": 599,
    "vendorIdentifier": 15,
    "maxApduLengthAccepted": 1476,
    "segmentationSupported": "segmentedBoth",
    "deviceDiscoveryTimeoutInSec": 5
  },
  "devices": [
    {
      "altResponsesAddresses": [],
      "host": "YOUR_DEVICE_HOST",
      "port": 47808,
      "deviceInfo": {
        "deviceNameExpression": "${objectName}",
        "deviceProfileExpression": "default",
        "deviceNameExpressionSource": "expression",
        "deviceProfileExpressionSource": "constant"
      },
      "pollPeriod": 10000,
      "timeseries": [
        {
          "key": "relay",
          "objectType": "binaryInput",
          "objectId": 1,
          "propertyId": "presentValue"
        }
      ],
      "attributes": [],
      "attributeUpdates": [],
      "serverSideRpc": []
    }
  ]
}

EDE文件解析(仅高级配置模式)

BACnet连接器支持EDE文件解析。EDE(工程数据交换)文件用于描述BACnet设备的结构与属性。通过解析EDE文件,BACnet连接器可自动配置自身,以与文件中描述的设备交互。

要使用EDE文件解析,需在连接器配置中提供EDE文件路径。连接器将读取该文件并提取与BACnet设备通信所需的信息。EDE文件应为CSV格式并符合BACnet EDE规范。

下面以EDE文件解析配置为例说明。

我们将使用从YABE(Yet Another BACnet Explorer)导出的EDE文件。该文件包含一个具有多个对象的BACnet设备描述,示例文件如下:

image

现在配置BACnet连接器以使用此EDE文件。 在高级配置模式下,粘贴以下连接器配置(请确保使用正确的EDE文件路径):

1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "application": {
    "objectName": "TB_gateway",
    "host": "YOUR_HOST",
    "port": 47808,
    "objectIdentifier": 599,
    "vendorIdentifier": 15,
    "maxApduLengthAccepted": 1476,
    "segmentationSupported": "segmentedBoth",
    "deviceDiscoveryTimeoutInSec": 5
  },
  "edeFilePath": "/path/to/your/file.ede"
}
文档信息图标

请注意

  • EDE文件解析仅在高级配置模式下可用。
  • EDE文件需可被IoT Gateway访问。

应用配置后,BACnet连接器将解析EDE文件并自动配置自身,以与文件中描述的BACnet设备交互。随后可使用连接器从设备读取数据、更新设备属性并发送RPC命令。如下方截图所示,连接器已根据EDE文件自动创建设备名称与配置文件,以及文件中的全部属性和时序数据:

image

高级配置

高级配置部分提供BACnet连接器所有可用参数的详细说明。

应用

应用配置参数用于在BACnet网络中配置网关。

参数 默认值 说明
application.objectName ThingsBoard Gateway BACnet网络中的网关对象名称。
application.host   BACnet网络中的网关主机地址。
application.port 47808 BACnet网络中的网关端口。
application.mask   BACnet网络中的网关子网掩码。
application.networkNumber   网络段的标识符。
application.objectIdentifier 599 BACnet网络中的网关对象标识符。
application.vendorIdentifier 15 BACnet网络中的网关厂商标识符。
application.maxApduLengthAccepted 1476 APDU的最大长度。
application.segmentationSupported segmentedBoth 分段类型,可选:segmentedBothsegmentedTransmitsegmentedReceivenoSegmentation
application.deviceDiscoveryTimeoutInSec (in sec) 5 设备发现的超时时间。
application.devicesDiscoverPeriodSeconds (in sec) 30 连接器尝试发现BACnet设备的周期。
application.devicesRescanObjectsPeriodSeconds (in sec) 60 连接器尝试重新读取上次读取失败的设备对象的周期。
application.loadProprietaryDevices * false 允许从扩展中动态加载专有设备。
文档信息图标

* –此功能从Gateway v.3.8.0起可用,且仅在高级配置模式下可用。您需要将专有设备扩展上传到IoT Gateway安装目录的/extensions/bacnet/proprietary文件夹中。 您也可以在此处找到此类专有设备的示例。

应用配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "application": {
    "objectName": "TB_gateway",
    "host": "192.168.1.168",
    "port": 47808,
    "objectIdentifier": 599,
    "vendorIdentifier": 15,
    "maxApduLengthAccepted": 1476,
    "segmentationSupported": "segmentedBoth",
    "networkNumber": 3,
    "deviceDiscoveryTimeoutInSec": 5
  }
}

外部设备(v.3.7.6+)

外部设备配置参数用于将网关配置为BACnet网络中的外部设备。当网关位于NAT后且需向BACnet广播管理设备(BBMD)注册时,此功能很有用。

参数 默认值 说明
foreignDevice.ttl (in sec) 900 外部设备注册的生存时间。
foreignDevice.address 0.0.0.0 要注册的BBMD地址。

设备

设备列表包含可连接至连接器并与之交互的BACnet设备数组。未包含在此数组中的BACnet设备将被连接器拒绝。

参数 说明
devices[].host 设备的主机地址。
devices[].port 设备的端口。
devices[].mask 设备的子网掩码。
devices[].networkMask 设备网络段的标识符。
devices[].pollPeriod 连接器尝试轮询BACnet设备的周期。
devices[].altResponsesAddresses[] 设备响应的备选地址数组(详细示例请参阅此处)。
devices[].reportStrategy 用于配置设备上报策略的上报策略对象。
devices[].deviceInfo 用于配置设备名称和配置文件的设备信息对象。
devices[].deviceInfo.deviceNameExpressionSource 设备名称的来源:constantexpression
devices[].deviceInfo.deviceNameExpression 设备名称(详细示例请参阅此处)。
devices[].deviceInfo.deviceProfileExpressionSource 设备配置文件的来源:constantexpression
devices[].deviceInfo.deviceProfileExpression 设备配置文件名称(详细示例请参阅此处)。

设备映射配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  "devices": [
    {
      "deviceInfo": {
        "deviceNameExpression": "BACnet Device ${objectName}",
        "deviceProfileExpression": "default",
        "deviceNameExpressionSource": "expression",
        "deviceProfileExpressionSource": "constant"
      },
      "host": "192.168.2.110",
      "port": "47808",
      "pollPeriod": 10000,
      "attributes": [],
      "timeseries": [],
      "attributeUpdates": [],
      "serverSideRpc": []
    }
  ]
}

设备名称/配置文件表达式可用变量

可使用以下参数构造设备名称和配置文件:

  • ${objectName} - BACnet设备的对象名称。
  • ${objectId} - BACnet设备的对象标识符。
  • ${vendorId} - BACnet设备的厂商标识符。
  • ${address} -设备的主机地址。
  • ${routerId} -设备的路由器标识符。
  • ${routerName} -设备的路由器名称。
  • ${routerAddress} -设备的路由器地址。
  • ${routerVendorId} -设备的路由器厂商标识符。

详细示例请参阅此处

设备属性和时序数据

参数 说明
devices[].attributes[] 本子部分包含将被解析为设备属性的设备数据参数。
devices[].attributes[].key 平台上的属性名称。
devices[].attributes[].objectType BACnet设备中的对象类型。
devices[].attributes[].objectId BACnet设备中的对象ID。
devices[].attributes[].propertyId BACnet设备中的属性ID。
devices[].attributes[].reportStrategy 用于配置设备属性上报策略的上报策略对象。
devices[].timeseries[] 本子部分包含将被解析为设备时序数据的设备数据参数。
devices[].timeseries[].key 平台上的时序数据名称。
devices[].timeseries[].objectType BACnet设备中的对象类型。
devices[].timeseries[].objectId BACnet设备中的对象ID。
devices[].timeseries[].propertyId BACnet设备中的属性ID。
devices[].timeseries[].reportStrategy 用于配置设备时序数据上报策略的上报策略对象。

设备属性和时序数据配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "attributes": [
    {
      "key": "location",
      "objectType": "analogValue",
      "objectId": 1,
      "propertyId": "presentValue"
    }
  ],
  "timeseries": [
    {
      "key": "temperature",
      "objectType": "analogInput",
      "objectId": 2,
      "propertyId": "presentValue"
    }
  ]
}

设备属性更新

参数 默认值 说明
devices[].attributeUpdates[]   将在设备上更新的属性列表。
devices[].attributeUpdates[].key   平台实例上的共享属性名称。
devices[].attributeUpdates[].objectType   BACnet设备中的对象类型。
devices[].attributeUpdates[].objectId   BACnet设备中的对象ID。
devices[].attributeUpdates[].propertyId   BACnet设备中的属性ID。
devices[].attributeUpdates[].timeout (in ms) 5000 属性更新请求的超时时间(毫秒)。

设备属性更新配置示例:

1
2
3
4
5
6
7
8
9
10
11
{
  "attributeUpdates": [
    {
      "key": "setpoint",
      "objectType": "analogValue",
      "objectId": 3,
      "propertyId": "presentValue",
      "timeout": 5000
    }
  ]
}

设备RPC方法

参数 默认值 说明
devices[].serverSideRpc[]   将发送至设备的RPC方法列表。
devices[].serverSideRpc[].method   RPC方法名称。
devices[].serverSideRpc[].requestType   writeProperty“用于写入数据,”readProperty“用于读取数据。
devices[].serverSideRpc[].objectType   BACnet设备中的对象类型。
devices[].serverSideRpc[].objectId   BACnet设备中的对象ID。
devices[].serverSideRpc[].propertyId   BACnet设备中的属性ID。
devices[].serverSideRpc[].priority   写入值的优先级(可选,应为1到16之间的整数)。
devices[].serverSideRpc[].timeout (in ms) 5000 RPC方法执行的超时时间(毫秒)。

设备RPC方法配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
{
  "serverSideRpc": [
    {
      "method": "set_state",
      "requestType": "writeProperty",
      "objectType": "analogValue",
      "objectId": 3,
      "propertyId": "presentValue",
      "timeout": 5000
    }
  ]
}

附加信息

支持的对象类型

BACnet连接器支持以下BACnet对象类型:

BACnet object id ThingsBoard object id
Binary input binaryInput
Binary Output binaryOutput
Binary Value binaryValue
Analog Input analogInput
Analog Output analogOutput
Analog Value analogValue
Schedule Object schedule

支持的属性标识符

属性标识符取决于BACnet对象类型,以camelCase格式提供,例如:

  • presentValue
  • objectName
  • objectDescription
  • units
  • eventState
  • outOfService
  • priorityArray
  • relinquishDefault
  • currentCommandPriority
  • eventMessageTexts
  • eventMessageTextsConfig
  • eventAlgorithmInhibitReference
  • timeDelayNormal
  • weeklySchedule
  • listOfObjectPropertyReferences
  • location

故障排查

Linux下Docker Compose设备发现问题

若在Linux上通过Docker Compose运行网关且出现设备发现问题时,请确认docker compose文件中已正确设置网络模式。请在docker compose文件的 tb-gateway 服务中添加以下行:

1
2
3
network_mode: "host"
extra_hosts:
    - "host.docker.internal:host-gateway"

Windows下Docker Compose设备发现问题

受Windows上Docker网络栈限制,BACnet连接器不支持Windows下的设备发现。请使用源码安装或其他安装方式在Windows上运行网关。

下一步

探索与ThingsBoard主要功能相关的指南: