协议

BACnet/IP

qianmoQqianmoQ· 更新于 2026-10-01· 阅读 9 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

banner

BACnet(楼宇自动化与控制网络,Building Automation and Control Networks)是一种用于楼宇自动化与控制的数据通信协议,涵盖暖通空调(HVAC)、照明、门禁控制及类似的楼宇服务。BACnet/IP 在 UDP/IP 上传输 BACnet 流量,通常使用众所周知的端口 47808。

Go 驱动是功能完整的实现:它读写对象属性、发现网络中的设备,并订阅值变更(COV,Change of Value)通知。Java 驱动则是一个被动监听器:它加入网络并报告所观察到的 COV 通知,但没有可用的标签地址语法,因此无法将订阅范围缩小到单个对象——所有注册的消费者都会收到网络上出现的全部 COV 通知,只能自行过滤。

支持的操作

名称值说明
read仅限 Go。通过标签地址读取一个或多个对象属性。
write仅限 Go。写入一个或多个对象属性,可选指定优先级。
subscribeGo 与 Java。Go 订阅某对象的 COV 通知;Java 接收网络上广播的全部 COV 流量,由于没有可用的标签地址语法,无法将其缩小到单个对象。

两个驱动都不支持 browse。Go 驱动支持设备发现(WhoIs/IAm,Discoverer.go)——这是 PLC4X 的一个独立操作,通过发现 API 而非浏览请求来调用,用于发现网络中的设备,而非枚举某台设备上的对象。

连接字符串

BACnet/IP 的连接字符串格式如下:

bacnet-ip:{transport}://{ip-address}:{port}?{options}

唯一支持的传输方式是 udp:

bacnet-ip:udp://192.168.178.101:47808

连接字符串选项

名称 类型 默认值 是否必填 描述
名称 BACnet/IP Code

bacnet-ip

Maven 依赖

<dependency>
  <groupId>org.apache.plc4x</groupId>
  <artifactId>plc4j-driver-bacnet</artifactId>
  <version>1.0.0</version>
</dependency>

默认传输

udp

支持的传输协议

  • udp

配置选项:

ede-file-path

FILE

单个 EDE 文件的路径,该文件包含目标设备的描述符。

ede-directory-path

FILE

用于存储多个 EDE 文件的目录路径。这些文件包含可能的目标设备的描述符。

传输配置选项:

udp

udp.local-address

STRING

用于绑定的本地地址。如果未设置,则绑定到所有网络接口。

udp.local-port

INT

0

本地绑定端口。0 表示使用临时端口。

udp.read-timeout-ms

INT

0

以毫秒为单位的套接字读取超时时间。0 表示不超时。

udp.max-packet-size

INT

65507

以字节为单位的最大 UDP 数据包大小。

udp.send-buffer-size

INT

0

以字节为单位的发送缓冲区大小。0 表示使用系统默认值。

udp.receive-buffer-size

INT

0

以字节为单位的接收缓冲区大小。0 表示使用系统默认值。

udp.broadcast

BOOLEAN

false

为发送广播数据包启用 SO_BROADCAST。

udp.reuse-address

BOOLEAN

false

启用 SO_REUSEADDR,以允许绑定到相同的地址/端口。

udp.share-socket

BOOLEAN

false

在多个传输实例之间共享底层 UDP 套接字。设为 true 时,具有相同 localAddress:localPort 的实例将共享同一个套接字。这对于多个逻辑连接共用一个 UDP 端口的协议非常有用。

udp.multicast-ttl

INT

1

多播数据包的生存时间(1-255)。

标签地址

地址解析仅在 Go 中实现。Java 驱动将广播流量作为订阅接收,没有可用的标签地址语法。各实现的具体能力请参阅协议支持矩阵。

通用格式

<objectType>,<objectInstance>/<propertyIdentifier>[<arrayIndex>]{<writePriority>}[&<propertyIdentifier>[<arrayIndex>]{<writePriority>}]*

objectType

BACnet 对象类型,可通过名称(ANALOG_INPUT、ANALOG_VALUE、ANALOG_OUTPUT、…​)指定,也可作为数字型的专有类型标识符指定。

objectInstance

该对象的数字实例编号。

propertyIdentifier

一个或多个属性标识符,由 & 连接,每个标识符可以是名称形式(PRESENT_VALUE、OBJECT_NAME、DESCRIPTION、UNITS、PRIORITY_ARRAY、……),也可以是数字形式的专有属性标识符。

[arrayIndex]

可选。用于选择数组值属性中的单个元素。这不是统一的数组记法]——它指向 BACnet 数组属性中的某一个标量元素,而不是一段连续的值。

{writePriority}

可选,仅在需要时填写。写入操作所使用的 BACnet 优先级(1-16)。

数据类型

BACnet 标签不带 :{data-type} 后缀。值的类型由所读取或写入的对象及其属性决定,而不是在地址上指定。

示例

地址含义
ANALOG_INPUT,1/PRESENT_VALUE模拟输入 1 的当前值
12345,7/4242专有对象类型 12345、实例 7 的专有属性 4242
ANALOG_VALUE,2/PRESENT_VALUE[3]模拟值 `2 的当前值数组中的元素 3
ANALOG_OUTPUT,1/PRESENT_VALUE{8}以优先级 8 写入模拟输出 1 的当前值
ANALOG_OUTPUT,5/PRESENT_VALUE[2]{16}以优先级 16`` 写入模拟输出 ``5 的当前值数组中的元素 2`
ANALOG_INPUT,1/PRESENT_VALUE&OBJECT_NAME&UNITS一次读取模拟输入 1 的当前值、对象名称和单位
ANALOG_VALUE,5/PRESENT_VALUE[1]&PRIORITY_ARRAY[16]模拟值 5 的当前值数组元素 1 与优先级数组元素 16

表 1. 示例

评论

登录后参与评论

正在加载评论…