Skip to content

BACnet/IP 驱动

dc3-driver-bacnet-ip 把 BACnet/IP 设备接入 IoT DC3——以远端设备的对象属性为目标,周期性读取属性值,并支持向可写对象属性写值的命令。

BACnet(Building Automation and Control network)是楼宇自控领域的国际标准协议,广泛用于空调机组、新风、照明、电梯、冷热源、温控器等机电设备。BACnet/IP 是它跑在 UDP(标准端口 47808 = 0xBAC0)上的变体。本驱动基于 BACnet4J 库,作为本地 BACnet 设备(LocalDevice)加入网络,通过广播发现远端设备,再按位号上配置的对象类型、对象实例号与属性标识去读、写远端对象的属性。

在 BACnet 里,一台物理设备由唯一的设备实例号标识,设备内含若干对象(如 ANALOG_INPUTBINARY_OUTPUT),每个对象由"对象类型 + 对象实例号"定位,对象又有若干属性(最常用的是 PRESENT_VALUE,即当前值)。读写一个测点,本质就是定位到"远端设备 → 对象 → 属性"。

  • 驱动名 / codeBACnet IP Driver / BacnetIpDriver
  • 类型DRIVER_CLIENT(本驱动主动发现并访问远端设备)

驱动配置(设备级 driver-attribute

接入一台 BACnet/IP 设备时,在设备上填这些属性。注意这里配的是本地驱动接入网络的参数,不是远端设备地址——远端设备靠下面位号里的设备实例号定位:

属性code类型默认值说明
Local Device IDlocalDeviceIdINT1001本地 BACnet 设备实例号
Bind AddressbindAddressSTRING0.0.0.0本地绑定地址
PortportINT47808BACnet UDP 端口(默认 47808 = 0xBAC0)
Broadcast AddressbroadcastAddressSTRING255.255.255.255设备发现用的广播地址
TimeouttimeoutINT6000请求超时时间(毫秒)

位号配置(point-attribute

每个采集位号上填,用来定位"哪台远端设备的哪个对象的哪个属性":

属性code类型默认值说明
Remote Device IDremoteDeviceIdINT0远端 BACnet 设备实例号
Object TypeobjectTypeSTRINGANALOG_INPUTBACnet 对象类型(ANALOG_INPUT、ANALOG_OUTPUT、ANALOG_VALUE、BINARY_INPUT、BINARY_OUTPUT、BINARY_VALUE、MULTI_STATE_INPUT、MULTI_STATE_OUTPUT、MULTI_STATE_VALUE、DEVICE)
Object InstanceobjectInstanceINT0对象实例号
Property IDpropertyIdSTRINGPRESENT_VALUE属性标识(PRESENT_VALUE、DESCRIPTION、STATUS_FLAGS 等)

写命令配置(command-attribute

可写位号还需在写命令上填(结构与位号配置一致,但默认指向可写的输出对象):

属性code类型默认值说明
Remote Device IDremoteDeviceIdINT0远端 BACnet 设备实例号
Object TypeobjectTypeSTRINGANALOG_OUTPUT写入目标的 BACnet 对象类型
Object InstanceobjectInstanceINT0对象实例号
Property IDpropertyIdSTRINGPRESENT_VALUE属性标识

采集与健康

  • 采集周期:默认 cron 0/30 * * * * ?(每 30 秒读一轮)。
  • 健康/在线:设备健康检查默认 cron 0/15 * * * * ?,租约超时 45 秒——驱动按本地与远端设备的连接是否就绪判定在线,机制见设备

最小接入示例

把网络上一台设备实例号为 9001 的 BACnet/IP 设备的温度对象接进来:

  1. BACnet IP Driver 创建设备,driver 属性可全用默认(localDeviceId=1001bindAddress=0.0.0.0port=47808broadcastAddress=255.255.255.255timeout=6000);只有当本机有多块网卡或广播打不到目标网段时才需调整 bindAddress / broadcastAddress
  2. 给设备绑定的物模型加一个温度位号READ_ONLY),point 属性填 remoteDeviceId=9001objectType=ANALOG_INPUTobjectInstance=1propertyId=PRESENT_VALUE
  3. 启动驱动,30 秒内就能在位号值里看到该对象的 PRESENT_VALUE

易错点

Object Type / Property ID 必须用准确的大写枚举名

objectTypepropertyId 是按精确的大写名匹配的(如 ANALOG_INPUTPRESENT_VALUE)。填错或拼错不会报错——驱动会静默回退ANALOG_INPUT / PRESENT_VALUE,于是你读到的可能是另一个对象的值却毫无察觉。objectType 仅支持上表列出的 10 种,propertyId 支持 PRESENT_VALUEDESCRIPTIONSTATUS_FLAGSEVENT_STATERELIABILITYUNITSOUT_OF_SERVICE

写值的编码由对象类型决定

驱动按对象类型前缀决定怎么编码写入值:ANALOG_* 当浮点数写;BINARY_*true / 1 / active(不分大小写)当"激活"、其余当"未激活";MULTI_STATE_* 当整数写。所以给 BINARY_OUTPUT 写开关,传 1true 而不是 ON

远端设备要能被广播发现

驱动靠广播在网络上发现远端设备后才能读写(remoteDeviceId 找不到就会阻塞直至超时)。BACnet/IP 走 UDP 广播,通常无法跨三层路由——请确保驱动与目标设备在同一广播域,跨网段时需在网络上部署 BBMD,并据实调整 broadcastAddress

延伸阅读

Released under the AGPL-3.0 License · 基于 AGPL-3.0 协议发布