BACnet/IP

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。写入一个或多个对象属性,可选指定优先级。 | |
subscribe | Go 与 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. 示例
评论
登录后参与评论
KnowForge