BACnet 对象标识的 4 字节,怎样拆出对象类型与实例号
BACnet 的四字节 ObjectIdentifier 由高十位对象类型和低二十二位实例号组成。同一个实例数字可以出现在不同对象类型中;只保存实例号会丢失点位身份,解析时应把类型与实例一起输出。
适用版本与输入范围
依据维护者 bacnet-stack 固定标签 bacnet-stack-1.4.0 的下列源码解释公开实现子集。该参考不是 ASHRAE 标准全文;涉及具体楼控设备时仍需记录型号、固件和对象支持范围。 本文所有输入均为原创合成数据,未接真实设备。
先明确输入剥掉了哪些外层
附件的 hex 只包含 ObjectIdentifier 的四字节内容,不含应用标签 C4,也不含 ReadProperty 外层上下文标签。若从抓包提取,必须先确定该四字节确实是对象标识字段,不能从整份APDU任取四字节。模拟输入12的编码为0000000C,而设备4001为02000FA1;两组故意使用不同对象类型,避免把高位长期当零而漏掉类型解析。
十位和二十二位不是两字节对半
程序按网络字节顺序读成32位无符号整数,再右移22位得到类型,与0x3FFFFF相与得到实例。对象类型并非第一个完整字节,实例号也不是后两个字节。若把02000FA1直接拆成0x0200与0x0FA1,会得到错误类型512,且只是巧合保留了这个较小实例号。数值边界案例FFFFFFFF能同时验证两段位宽,但不代表类型1023一定由某台设备支持。
双向重建用于核对切分
输出 roundtrip_hex 是将解析出的类型左移22位,再或回实例号后重新编码的结果,应与原四字节完全相同。这个检查能发现掩码少一位或移位方向写反。截短负例只提供三字节,程序不补前导零,因为补零会把不完整输入伪装成另一个合法对象。若点表由文本类型名组成,应另有明确枚举映射,不能把厂商中文名称直接当作线上对象类型编码。
设备身份与对象身份分层保存
在完整工程中,对象标识通常还要放在具体设备或路由上下文中理解;不同设备可以各有一个AnalogInput12。建议点表分别保留设备标识、对象类型、实例号、属性ID,避免只留“12号温度”。本题的边界是四字节字段解析,不执行发现、读写属性或全网唯一性审计。报告能证明位分割正确,不能证明对象存在、属性可读或名称与现场传感器已经一致。
下载与复跑
将输入 fixture.json与独立程序 verify.py放在同一目录,用 Python 3.12 执行 python verify.py,无需安装第三方包。程序从自身目录读取输入并写入 report.json,不要求当前终端恰好位于下载目录。也可查看本次实跑报告和复跑说明。
本次实际运行通过 4 条输入断言,包括标有“显式负例”的记录;负例以JSON字段承载,不会把下载文件本身做成损坏编码。object_type和instance共同构成对象标识;roundtrip_hex验证位分割后可无损重建。 修改输入后应同时审查期望结果,不能只改断言数字让测试变绿。
对象或字段的基础关系可回到BACnet 对象与服务入门核对,更多接口入口在设备协议库。若需要把已确认的数据点接入展项编排,可了解SoftControl 展厅中控;具体接入能力以项目确认和实际测试为准。
一级依据
来源核对日期:2026-10-24。离线结果只证明给定输入的解析或计算行为;现场兼容性、响应时间、硬件准确度和具体产品支持均未测量。
相关阅读
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。