概述
本文档将帮助您为ThingsBoard IoT Gateway配置BACnet连接器。我们将用简单易懂的方式解释配置参数,便于您理解与操作。BACnet协议广泛应用于楼宇自动化与控制系统,如暖通空调(HVAC)、照明控制、门禁控制以及消防检测系统等。请使用通用配置 启用此扩展。
BACnet连接器使ThingsBoard IoT Gateway能够与BACnet设备通信,实现数据交换与控制。该连接器可通过用户界面表单进行配置,帮助您建立与BACnet设备的连接、采集数据并写入设备。下面我们将逐一说明所有可用设置,便于您理解整体工作方式。
配置模式
BACnet连接器支持两种配置模式:基本(Basic)和高级(Advanced)。
- 基本模式面向不熟悉ThingsBoard IoT Gateway的用户,通过最少配置快速完成连接器设置,提供简化的界面和必要选项。
- 高级模式面向需要更细致配置控制的用户,提供更多选项和高级使用场景的灵活性。
您可通过配置页面顶部的切换按钮在两种模式间切换:

通用设置
本配置部分包含 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 发送数据(默认策略)。

应用
本部分配置用于在BACnet网络中配置网关。以下参数用于配置应用设置:
- Object Name - 网关在 BACnet 网络中的对象名。
- Host - 网关在 BACnet 网络中的主机。请确保使用设备所在位置的正确网络地址,以便网关能找到它们。
- Port - 网关在 BACnet 网络中的端口。
- Network mask - 网关在 BACnet 网络中的掩码。
- Object ID - 网关在 BACnet 网络中的对象标识符。
- Vendor ID - 网关在 BACnet 网络中的厂商标识符。

高级应用设置
可配置额外的应用参数,如:APDU长度、分段、网络号及发现超时。
| 参数 | 默认值 | 说明 |
|---|---|---|
| APDU长度(字节) | 1476 | APDU的最大长度。 |
| 分段 | Both | 传输大型BACnet消息的分段类型。可选:Both、Transmit、Receive、None。 |
| 网络号 | 3 | 网络段的标识符。 |
| 发现超时(秒) | 5 | 连接器尝试发现BACnet设备的时长。 |

数据映射
本配置部分包含可连接至连接器并发送数据的BACnet设备数组。未包含在此数组中的BACnet设备将被连接器拒绝。
要添加新设备,请点击 “plus“(加号)图标:

在打开的 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 发送数据(默认策略)。

属性和时序数据
本配置部分包含处理传入数据的参数。您可指定哪些数据作为设备属性、哪些作为时序数据。属性用于存储静态或较少变化的数据,时序数据用于存储动态或频繁变化的数据。
本子节的配置提供将 BACnet 设备数据作为平台实例上的时序和属性进行处理的设置。
若要添加新的时序或属性 key,请按以下步骤操作:
-
点击 “属性” 部分的 “铅笔” 图标以添加新的属性 key;
-
在打开的窗口中点击 “添加属性“;
-
输入 key 名称,从下拉列表选择 “Object ID” 和 “Property ID”。点击 “应用“;
-
现在点击 “时序” 部分的 “铅笔” 图标以添加新的时序 key;
-
在打开的窗口中点击 “添加时序“;
-
输入 key 名称,从下拉列表选择 “Object ID” 和 “Property ID”。点击 “应用“。
点击 “属性” 部分的 “铅笔” 图标以添加新的属性 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” 属性。
筛选配置示例:
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 发送数据(默认策略)。

使用示例
BACnet 连接器允许您使用表达式设置动态设备名称和配置文件。当您有多台具有相似配置的设备并希望根据其属性区分它们时,此功能尤其有用。
本示例中,我们将配置 BACnet 设备根据其 以下为具有动态设备名称和配置文件的 BACnet 设备配置示例片段: 在此配置中:
应用此配置后,设备将以反映其特定属性的名称和配置文件创建。下方截图显示设备在ThingsBoard 中的动态名称和配置文件显示方式:
如您所见,设备名称根据 设备名称/配置文件的动态表达式为管理具有不同配置的多台 BACnet 设备提供了灵活性,有助于在ThingsBoard 中有效组织设备。 |
替代响应地址字段允许您为设备响应指定替代 IP 地址。 当网关和 BACnet 设备位于不同网络时,此功能尤其有用。 例如,考虑以下网络设置:
在此设置中,网关运行在 Docker 容器内,BACnet 设备位于本地网络中,IP 地址为 要配置替代响应地址,需要在设备配置中添加 应用此配置后,连接器将使用指定的替代响应地址
|
当网络中有许多设备具有相同的对象列表且需要读取其值时,为每个设备复制配置并不方便。BACnet 连接器允许您自动查找网络上的所有设备,并使用相同配置连接它们。为此,您需要指定设备的 host 和 port,以及设备名称和设备配置的模板。 让我们看一个如何正确配置自动设备发现的示例。 假设我们有两台具有相同对象列表的设备:
要配置自动设备发现,请使用以下 BACnet 连接器配置: 以下为主要参数,用于正确配置自动设备检测。我们来详细了解:
保存更改并启动连接器后,它将向网络发送 WhoIs 查询并开始接收来自所有设备的 IAm 消息。收到 IAm 消息后,连接器将为每个发现的设备使用指定模板自动创建设备,并开始从对象读取数据。下方截图显示自动发现后的设备列表:
|
当 BACnet 设备有许多对象,您希望读取设备的所有对象而无需在连接器配置中手动添加每个对象时,或当您不知道设备中有哪些对象并希望自动读取所有对象时,BACnet 连接器支持此功能,允许您通过轻松配置一个参数即可读取设备的所有对象。 让我们看一个如何正确配置读取所有设备对象的示例。 要读取所有设备对象,您需要决定这些对象的值将存储在哪里: 在本例中,我们将把所有对象存储在时序中,因此设备配置如下: 从上述配置可以看出,我们在 保存更改并启动连接器后,您可以看到对应设备已添加到平台,其遥测开始填充所有设备对象:
|
当 BACnet 设备有许多对象,而您只想读取设备中的特定对象或属性时,可使用筛选选项指定应收集并发送到平台的数据。 让我们看一个如何正确配置筛选功能的示例。 在本例中,我们的设备有许多对象,但我们只想读取前三个 从上述配置可以看出,我们已将 保存更改并启动连接器后,您可以看到对应设备已添加到平台,其遥测开始填充筛选后的数据。下方截图显示应用筛选配置后设备遥测的示例:
|
请求映射
请求映射部分用于配置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。

若要添加新的属性更新,请按以下步骤操作:
-
点击 “铅笔” 图标(”属性更新” 子节)以添加新的属性更新;
-
在打开的窗口中点击 “添加属性更新“;
-
填写 “Key” 字段,从下拉列表选择 “Object ID” 和 “Property ID“。点击 “应用” 按钮。
点击 “铅笔” 图标(”属性更新” 子节)以添加新的属性更新;
在打开的窗口中点击 “添加属性更新“;
填写 “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方法执行的超时时间(毫秒)。

若要添加新的 RPC 方法,请按以下步骤操作:
-
点击 “RPC 方法” 部分的 “铅笔” 图标以添加新的 RPC;
-
在打开的窗口中点击 “添加方法“;
-
填写 “Method” 字段,从下拉列表选择 “Request Type“、”Object ID“、”Property ID“。点击 “应用” 按钮。
点击 “RPC 方法” 部分的 “铅笔” 图标以添加新的 RPC;
在打开的窗口中点击 “添加方法“;
填写 “Method” 字段,从下拉列表选择 “Request Type“、”Object ID“、”Property ID“。点击 “应用” 按钮。
使用示例
EDE文件解析(仅高级配置模式)
BACnet连接器支持EDE文件解析。EDE(工程数据交换)文件用于描述BACnet设备的结构与属性。通过解析EDE文件,BACnet连接器可自动配置自身,以与文件中描述的设备交互。
要使用EDE文件解析,需在连接器配置中提供EDE文件路径。连接器将读取该文件并提取与BACnet设备通信所需的信息。EDE文件应为CSV格式并符合BACnet EDE规范。
下面以EDE文件解析配置为例说明。
我们将使用从YABE(Yet Another BACnet Explorer)导出的EDE文件。该文件包含一个具有多个对象的BACnet设备描述,示例文件如下:

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

高级配置
高级配置部分提供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 | 分段类型,可选:segmentedBoth、segmentedTransmit、segmentedReceive、noSegmentation。 |
| application.deviceDiscoveryTimeoutInSec (in sec) | 5 | 设备发现的超时时间。 |
| application.devicesDiscoverPeriodSeconds (in sec) | 30 | 连接器尝试发现BACnet设备的周期。 |
| application.devicesRescanObjectsPeriodSeconds (in sec) | 60 | 连接器尝试重新读取上次读取失败的设备对象的周期。 |
| application.loadProprietaryDevices * | false | 允许从扩展中动态加载专有设备。 |
应用配置示例:
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 | 设备名称的来源:constant、expression。 |
| devices[].deviceInfo.deviceNameExpression | 设备名称(详细示例请参阅此处)。 |
| devices[].deviceInfo.deviceProfileExpressionSource | 设备配置文件的来源:constant、expression。 |
| 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主要功能相关的指南:










