由于公司一些产品需要过认证,于是涉及到了BACnet这种协议栈,网上查了下,国内涉及的资料甚少,经过一个多月的学习,也算是简简单单地入个门。在此也当作这一个月学习的经验总结。
最直白的个人理解,这个协议栈专门为安装在楼宇里的各种传感器与设备,建立一个使它们可以互相通讯与操作的统一通信标准,从而使人们方便管理。BACnet是开放协议,有开源代码,在github上。但注意的是,协议标准文档版权归ASHRAE所有,也就是说,详细标准文档需要购买,我看了下,还不便宜。-_-||
BACnet确定为开放性计算机局域网协议,采用了精简后的OSI模型,分为了四层:物理层、数据链路层、网络层、应用层。如下图:
BACnet设备 + 物理介质 = 物理网段
多个物理网段 + 中继器 = 网段
多个网段 + 网桥 = 网络(每个BACnet网络形成唯一的MAC地址域)
多个不同LAN技术的网络 + BACnet路由器 = BACnet网络
虽然协议栈看起来只有四个层级,但内容挺多挺细的,对于刚入门的来说,我个人建议关注点先集中在应用层,其比较直观,容易理解,易使用,较快可以实现自己业务。
先举个栗子:
在一栋楼里,有一个温度计,它符合有BACnet通讯接口,它通过RS485总线与一个BACnet控制器连接,走BACnet MS/TP进行通讯,然后该控制器通过以太网,走BACnet/IP,与其他在该局域网下的设备进行通讯。楼里的物业人员想知道该温度计的温度,就在处于同一局域网下的电脑中,打开走BACnet协议的工作站软件,从中找到对应的设备节点,获取该温度计的温度。
从BACnet协议栈的角度:
1.温度计一般扮演服务器角色,提供所需要的数据与对应服务。
2.工作站一般扮演客户机角色,向服务器发起各种服务请求。
3.控制器既可以是客户机也可以是服务器。
4.温度计与控制器的物理连接是RS485,链路层是MS/TP主从令牌传递协议。
5.控制器与操作员的电脑物理连接是以太网,链路层为LLC中类型1,无连接(UDP)。
接下来讲的a~j点的部分,都是BACnet协议对实际楼宇通讯与控制网络中的抽象描述。
“BACnet设备”:指的是支持BACnet协议进行数字通信的真实或虚拟的设备。一般情况下,
一个物理设备就是一个“BACnet”设备:如上面栗子中的温度计,控制器,专门的工作站。
一个虚拟设备模拟一个“BACnet设备”,例如之后将提到的BACnet调试工具下创建的虚拟BACnet设备。
或者也可以是一个物理设备具有多个“虚拟BACnet设备“的功能。一个BACnet网络上可理论上可存在222(超过四百万)个的设备。
“BBMD”:BACnet/IP 广播管理设备,其将由一个 BACnet/IP 设备在其子网内发送的 BACnet 广播报文直接传送给其它子网中的 BACnet/IP 设备,有些时候BBMD是集成在其他BACnet设备中。
“外部设备”:是一个在独立IP段上的设备,如果其加入当前BACnet/IP网络的IP子网,则要向BBMD请求外部设备注册,注册到BBMD的外部设备表(FDT)的一个表项中。
如下图:
在BACnet中,对象就是一组数据结构,BACnet协议中存在许多标准的对象,参照协议文档,例如:“Analog Input”、“Accumulator”、“Binary Input”、“Multi-state Output”等等,目前1.0.0版本的源码提供64种的标准对象。每个BACnet设备中都具有一些(至少一个)对象,用于描述这个设备的各个功能行为,每个设备都仅允许有一个设备对象(device_object),每个对象在设备中都具有唯一的object_identifier,设备对象的object_identifier由一个网络号和一个MAC地址组成在系统中唯一确认。如下图:
在上面栗子中,温度计是个BACnet设备,其有测量环境温度的功能,获取的温度是浮点型的模拟量,所有比较适合温度计这bacnet设备的对象应该是"Analog Input",加入温度计有不同点位测量温度,也就可以包含多个该类型的对象,如"Analog Input0","Analog Input1"等等。
属性就是对象这个数据结构里的信息,设备可以从数据结构中读取数据信息,也可以向数据结构中写入信息,这就是对对象属性的操作,从而完成设备之间信息通信的目的。比较经典的一句概况:属性的作用是参数化对象的功能并显示结果。
属性分为必需和可选两种,用三个字母表示:
类型 | 释义 |
---|---|
O | 表示此属性是可选 |
R | 表示此属性是必需的且是用 BACnet 服务可读的 |
W | 表示此属性是必需的且是用 BACnet 服务可读和可写的 |
每个对象中都必须包含object_identifier、object_name、object_type这三个属性。如下图:
在上面的栗子中,温度计的温度值如果要通过BACnet协议发送到客户端那,则其测量的值要被赋值在对应"Analog Input"标准对象的"Present_Value"属性中。
服务就是BACnet设备之间进行信息通信的手段。在面向对象技术中,与对象相关联的是属性和方法,属性用来说明对象,而方法是外界用来访问或作用于对象的手段。在 BACnet 中,把对象的方法称为服务(Service),实现服务的做法就是在网络中的设备之间传递请求和服务应答报文。
BACnet应用层提供两种类型的服务:证实服务(confirmed “C”),非证实服务(unconfirm “U”),定义了四种服务原语:请求、指示、响应、证实。如下图:
证实服务:建立在C/S通信模型的形式上。如下图:
非证实服务:不存在C/S形式,只有发送方与接收方。如下图:
BACnet中提供超过35种的标准服务,并划分了六个类别:
入门的化,一般是对象访问服务和报警与事件服务。
对上面的栗子中,客户机访问温度计温度,一般利用对象访问服务类别中的读服务,有时候也会用到写服务(一般用于设备报警或事件测试)。
如果BACnet给出标准的常用信息不满足使用者的业务,使用者也可用自己扩展所需的非标准化信息。
BACnet标准可以给生产厂商对其设备的非标准信息交换提供如下四个方面的扩展:
拿上面那个栗子说,假如这个温度计还有湿度和噪声强度检测,或者这个温度计功能多样,有行人靠近检测,还集成摄像头可以拍照录像,那单单一个"Analog Input"对象和它包含的"Present_Value"属性满足不了这个温度计的功能了,那厂商可以,在在"Analog Input"对象中在已有的属性上扩展多些符合该温度计功能的专有属性,或者额外自创个新的非标准的专有对象,再在这个专有对象里创建合适的属性,从而满足自己的需求。
安全这部分,我还没了解清楚,暂时放着先。
BACnet中,这网络安全部分是可选的,主要是提供:供对等实体鉴别,数据源鉴别和操作员身份验证,以及保证数据机密性和完整性的安全机制。
在协议中,设备实现BACnet网络安全的最低条件如下:
BIBBs主要是一个或多个BACnet服务的集合,标准中分出好多类别,也称为互操作域:
一般设备常用的是数据共享BIBB与报警和事件管理BIBB,简单地说,数据共享就是设备之间进行单向或者双向地数据传输。报警与事件管理就是设备的某些数据超过警戒值一段时间就会报警或者产生事件,然后通知到其他设备。
就上面栗子中的温度计和工作站来说,温度计需有数据共享BIBB,其中应包含执行读服务,如下图:
当如果温度超过设定的高限制值或低限制值时,则需要报警和事件管理BIBB,其包含发起警报与事件通知服务,如下图:
对应的,工作站也需要数据共享BIBB,包含发起读服务,如下图:
当温度计有警报时,需要报警和事件管理BIBB,包含执行警报与事件通知服务接收,如下图:
这个一致性声明,是由设备厂商提供的,描述该设备对BACnet有哪些支持。
提供的PICS文件包含信息如下:
BACnet这个协议栈应用层除了上述说的,还有包含非常多的其他要点,我讲的也只是冰山一角,具体的其他内容,还得去参考协议文档。
比如数据是如何填装的,流向的,这涉及到PDU这个名词,每层处理不同的PDU,如应用层就涉及APDU这种数据包,还有整体的数据流向图:
功能上比如报警和事件通知的产生机制,一般涉及到"内部报告",和"算法变化报告"两种机制。还有发布/订阅COV的功能,等等。
暂时未深入了解,之后再完善。
从最上面的层次图可看出,底层可以有5种方式进行通讯,如要上手,首选是BACnet/IP。
设备只要处于同一个局域网下,就可以调试与测试设备的BACnet相关功能了。
其他的,我也了解不多,一般简单的传感器适合采用MS/TP(从设备)方式,物理层上就是熟悉的RS485了。
免费的上位机工具,一般网上搜的到的:
Yabe: 链接
VTS:链接
Wireshark:链接
simulator:链接(这个是要收费的,但有30天试用,够学习用了)
源码,github上有,不能科学上网的伙伴,就下我的,我的是1.0.0版本
bacnet-stack-1.0.0
我们有个国标也详细描述了需要用到的BACnet通信协议,值得参考。
链接
入门讲义:
简单的BACnet讲义
各位大神,创作不易,如需使用,注明出处~