尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

02-BACnet协议结构详解

02-BACnet协议结构详解 目录BACnet 协议结构详解四层模型与 OSI 对照一、BACnet 协议总体结构二、与 OSI 七层模型的对照三、各层职责详解1. 物理层Physical Layer2. 数据链路层Data Link Layer3. 网络层Network Layer4. 应用层Application Layer四、BACnet 协议栈数据流五、BACnet 协议栈的 C 语言抽象六、小结BACnet 协议结构详解四层模型与 OSI 对照一、BACnet 协议总体结构BACnet 标准采用分层体系结构但并未照搬完整的 OSI 七层模型而是根据楼宇自动化的实际需求精简为四层结构对应 OSI 模型中的应用层、网络层、数据链路层和物理层。这种简化既保证了功能完整性又降低了实现复杂度使 BACnet 可以运行在资源有限的嵌入式设备上。┌─────────────────────────────────────────────────┐ │ BACnet 应用层Application Layer │ ← 对象、服务、APDU 编解码 ├─────────────────────────────────────────────────┤ │ BACnet 网络层Network Layer │ ← 跨网络寻址与路由 ├─────────────────────────────────────────────────┤ │ BACnet 数据链路层Data Link Layer │ ← 帧封装、介质访问 ├─────────────────────────────────────────────────┤ │ BACnet 物理层Physical Layer │ ← 电气特性、传输介质 └─────────────────────────────────────────────────┘二、与 OSI 七层模型的对照OSI 层次OSI 功能BACnet 是否实现BACnet 对应内容7 应用层用户接口、应用协议✅BACnet 应用层6 表示层数据格式转换❌不实现5 会话层会话管理❌不实现4 传输层端到端可靠传输❌不实现由应用层确认机制替代3 网络层路由与寻址✅BACnet 网络层2 数据链路层帧封装、差错控制✅多种链路层技术1 物理层电气与机械特性✅多种物理介质可以看到BACnet省略了表示层、会话层和传输层。其中传输层的可靠传输功能由应用层的确认服务机制承担会话管理则通过应用层的请求-应答模式实现。这种设计在楼宇自动化场景下完全够用且显著降低了协议栈复杂度。三、各层职责详解1. 物理层Physical Layer物理层定义了信号传输的电气特性、连接器形式和传输介质。BACnet 使用的物理介质主要有RS-485最常用的串行总线半双工标称最长 1200 米实际可用距离随波特率升高而缩短MS/TP 跑 115.2 kbps 时工程上需留足余量。标准规定 32 个单位负载Unit Load但现代收发器多为 1/8 单位负载物理上可挂 256 个节点BACnet MS/TP 主站地址上限为 127。Ethernet 物理介质10/100/1000 Mbps 以太网使用双绞线或光纤。注ARCNET、LonTalk 属于自带介质访问机制的完整链路层技术归并在下文数据链路层表格中介绍BACnet/IP 也不属于物理层它运行于 UDP/IP 之上物理介质复用以太网/光纤等承载 IP 的介质。2. 数据链路层Data Link Layer数据链路层负责将数据封装为帧、实现介质访问控制MAC和差错检测。BACnet 支持以下链路层链路层技术物理介质速率典型场景MS/TPMaster-Slave/Token PassingRS-485≤ 115.2 kbps楼层级控制器PTPPoint-To-PointRS-232 / Modem≤ 115.2 kbps拨号连接BACnet-2020 起已从标准移除Ethernet双绞线/光纤10 Mbps主干网络ARCNET同轴/双绞线2.5 Mbps早期项目LonTalk电力线/双绞线78 kbps~1.25 Mbps历史项目BACnet-2012 起已从标准移除BACnet/IPUDP/IP取决于 IP 网络现代主流BACnet/SCSecure ConnectWebSocket over TLS取决于 IP 网络高安全性现代项目MS/TP 是 BACnet 在 RS-485 总线上的链路层规范是 BACnet 最具特色的链路层之一。它采用主从 令牌传递混合机制既支持多主站又保证无冲突访问。BACnet/SC 则是 2019 年新增的安全链路层它基于 WebSocket over TLS 建立加密通道不再需要 BBMD 等广播管理设施即可穿越防火墙同时提供设备身份认证能力正逐步成为对网络安全有要求的项目的首选。3. 网络层Network LayerBACnet 网络层负责在不同 BACnet 网络之间进行寻址与路由。每个 BACnet 网络有一个 16 位的网络号Network Number设备在每个接入的网络接口上各有一个 MAC 地址长度和格式取决于链路层MS/TP 为 1 字节Ethernet 为 6 字节BACnet/IP 为 6 字节即 4 字节 IP 2 字节端口——因此同时接入两个网络的路由器拥有多个 MAC 地址。网络层将网络号 MAC 地址组合成 BACnet 设备地址使报文可以跨越多个异构网络传输。网络层报文NPDUNetwork Protocol Data Unit头部包含以下关键字段版本号Version固定为 0x01。控制字段Control Byte指示报文类型应用报文还是网络层控制报文、是否包含目的地址、是否需要应答等。目的网络号 / 源网络号用于跨网络寻址。跳数计数器Hop Count防止报文环路最大 255。4. 应用层Application Layer应用层是 BACnet 的核心定义了对象模型、服务集合和 APDUApplication Protocol Data Unit的编解码规则。应用层报文通过 NPDU 的数据部分传输。应用层主要功能对象访问读写设备中的对象属性。事件与报警订阅对象值变化、确认报警。文件传输上传/下载设备中的文件。设备发现Who-Is / I-Am 用于设备发现Who-Has / I-Have 用于对象发现。远程设备管理时间同步、设备重启、通信控制。四、BACnet 协议栈数据流以一次读取温度值为例展示数据从应用层到物理层的封装过程应用层ReadProperty-Request对象Analog Input, 实例1, 属性Present Value ↓ 封装为 APDU 网络层添加 NPDU 头部目的网络号、目的地址、源地址 ↓ 封装为 NPDU 链路层添加帧头、帧尾、CRCMS/TP 或 Ethernet 帧 ↓ 封装为帧 物理层转换为 RS-485 / Ethernet 电信号发送接收端则按相反顺序逐层解封装最终将温度值返回给应用层处理。五、BACnet 协议栈的 C 语言抽象以下代码片段展示了 BACnet 协议栈各层接口的典型抽象方式/* 物理层接口发送/接收字节 */ typedef struct { int (*send_bytes)(const uint8_t *data, uint16_t len); int (*receive_bytes)(uint8_t *buf, uint16_t maxlen, uint16_t timeout_ms); void (*init)(void); } bacnet_physical_layer_t; ​ /* 数据链路层接口发送/接收帧 */ /* 注MAC 地址长度随链路层而变MS/TP 为 1 字节Ethernet/BACnet-IP 为 6 字节故按变长缓冲区设计 */ typedef struct { int (*send_frame)(const uint8_t *dest_mac, uint8_t mac_len, const uint8_t *pdu, uint16_t pdu_len); int (*receive_frame)(uint8_t *src_mac, uint8_t *mac_len, uint8_t *pdu, uint16_t maxlen); void (*init)(void); } bacnet_dll_layer_t; ​ /* 网络层接口发送/接收 NPDU */ typedef struct { int (*send_npdu)(const bacnet_address_t *dest, const uint8_t *npdu, uint16_t len); void (*receive_npdu)(const uint8_t *npdu, uint16_t len); } bacnet_network_layer_t; ​ /* 应用层接口处理 APDU */ typedef struct { int (*send_apdu)(const bacnet_address_t *dest, const uint8_t *apdu, uint16_t len, bool expect_reply); void (*receive_apdu)(const bacnet_address_t *src, const uint8_t *apdu, uint16_t len); } bacnet_application_layer_t; ​ /* 协议栈整体结构 */ typedef struct { bacnet_physical_layer_t physical; bacnet_dll_layer_t dll; bacnet_network_layer_t network; bacnet_application_layer_t application; } bacnet_stack_t;这种分层接口设计使 BACnet 协议栈具有良好的可移植性——只需替换物理层和链路层实现即可将同一套应用层代码运行在 MS/TP、Ethernet、BACnet/IP 或 BACnet/SC 之上。六、小结BACnet 通过精简的四层结构实现了 OSI 七层模型的核心功能在保证楼宇自动化所需能力的同时大幅降低了实现成本。理解 BACnet 的分层结构是深入学习其对象模型、服务机制和网络层路由的基础。后续文章将分别展开各层的细节从对象模型到编程实践逐步揭开 BACnet 协议的全貌。
返回列表