在 Python 中处理 BACnet(Building Automation and Control Networks)协议,通常有以下几种主流方式,BACnet 是一个复杂的工业标准协议,用于楼宇自动化系统(如 HVAC、照明、安防等)。
以下是目前最常用和推荐的 Python BACnet 库及使用方法:
✅ 推荐库:bacpypes
bacpypes 是目前最成熟、功能最全面的纯 Python BACnet 库,支持 BACnet/IP 和 BACnet/MSTP(通过串口)。
安装
pip install bacpypes
基本示例:读取 BACnet 对象值
from bacpypes.app import BIPSimpleApplication
from bacpypes.primitivedata import Real
from bacpypes.object import AnalogInput
from bacpypes.apdu import ReadPropertyRequest
from bacpypes.error import ExecutionError
# 创建 BACnet/IP 应用
app = BIPSimpleApplication(None, 0)
# 目标设备地址(IP:端口)
target_address = ('192.168.1.100', 47808)
# 目标对象:设备 ID 100,对象类型 AnalogInput,对象实例 1
object_identifier = AnalogInput('100:1')
# 构建读取属性请求
request = ReadPropertyRequest(
objectIdentifier=object_i
dentifier,
propertyIdentifier='presentValue'
)
# 发送请求并等待响应
try:
response = app.request(target_address, request)
value = response.propertyValue
print(f"读取到的值: {value}")
except ExecutionError as e:
print(f"错误: {e}")
finally:
app.close()
更高级用法:使用 bacpypes 的 BACnetStack
from bacpypes.app import LocalDeviceObject
from bacpypes.service.object import ReadProperty
from bacpypes.object import AnalogInput
from bacpypes.primitivedata import Real
from bacpypes.basetype import Real as BaseTypeReal
# 创建本地设备对象
local_device = LocalDeviceObject(
objectName='MyPythonDevice',
objectIdentifier=100,
maxApduLengthAccepted=1476,
segmentationSupported='noSegmentation'
)
# 注册服务
local_device.add_service(ReadProperty)
# 启动应用
from bacpypes.core import run
run(local_device)
✅ 其他可选库
pysnmp + BACnet 扩展
- 不直接支持 BACnet,但可通过 SNMP 桥接。
- 不推荐用于原生 BACnet 通信。
bacnet4j(Java)的 Python 封装
- 无广泛使用的 Python 封装。
pybacc
- 轻量级库,但更新较少,社区支持较弱。
bacpypes 的替代:asyncio + 手动协议解析
- 适合高级用户,需手动实现 BACnet APDU 编码/解码。
- 复杂度高,不推荐初学者。
📌 常见 BACnet 操作示例
读取对象属性
from bacpypes.apdu import ReadPropertyRequest
from bacpypes.object import AnalogInput
request = ReadPropertyRequest(
objectIdentifier=AnalogInput('100:1'),
propertyIdentifier='presentValue'
)
写入对象属性
from bacpypes.apdu import WritePropertyRequest
from bacpypes.primitivedata import Real
request = WritePropertyRequest(
objectIdentifier=AnalogInput('100:1'),
propertyIdentifier='presentValue',
propertyValue=Real(25.5)
)
广播搜索设备(Who-Is)
from bacpypes.apdu import WhoIsRequest from bacpypes.app import BIPSimpleApplication app = BIPSimpleApplication(None, 0) request = WhoIsRequest() app.request(None, request) # None 表示广播 app.close()
🛠️ 调试与工具
- Wireshark:抓包分析 BACnet/IP 通信。
- BACnet Explorer:图形化工具测试 BACnet 设备。
bacpypes日志:启用日志查看协议交互细节。
import logging logging.basicConfig(level=logging.DEBUG)
⚠️ 注意事项
- BACnet/IP 使用 UDP 端口 47808。
- BACnet/MSTP 需要串口支持,配置较复杂。
- 对象标识符格式:
<device-id>:<object-type>:<object-instance>。 - 确保防火墙允许 BACnet 端口。
- 生产环境建议使用
bacpypes的稳定版本。
📚 资源链接
- bacpypes 官方文档:https://bacpypes.readthedocs.io/
- BACnet 标准:https://bacnet.org/
- GitHub 仓库:https://github.com/andrewcooke/bacpypes
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/481174.html



