Bootstrap

BACnet协议详解——Object篇之device object

写在前面

时间过得真快,三周的时间就这么一下子就过去了,我的blog又拖更了。这段时间经历了很多,公司开始裁员了。当然,这波裁员没有波及到我,但是作为这个行业的人,也要开始对自己的道路有一些思考了。互联网大厂开始开源节流,ChatGPT横空出世,YQ之后经济复苏缓慢,每一个都牵动着打工人的心。车贷房贷的压力让我们不得不在打工的路上越来越卷,还好我所在的公司是一所外企,但是有人在的地方就有江湖,有中国人在的职场必定就有内卷。吐槽一下心中的郁结,明天还是阳光灿烂,毕竟还有那么多人在等着跟我们伸手。就像呼兰脱口秀里说的,早上要干翻这个世界,晚上回来被这个世界干的服服帖帖。但第二天依然得有干翻这个世界的尽头,不然怎么办呢!希望大家都能保持高昂的斗志,去探索技术的宇宙吧!

总体陈述

言归正传,还是要说技术的。在写技术之前,我想了半天这个标题叫什么。我觉得英文单词perspective最为贴切吧,但是用中文想了半天才想到“总体陈述”这个词。这个部分就给大家对前面几章的内容做一个总结。我想如果你认真的看了前面几章内容的话,并且再加上BACnet本身协议的阅读,你会很迷糊这是要干什么。反正我当时读完这几章之后,我是云里雾里还不知道BACnet要干什么。今天所讲的这个Object就是应用的开始,但是当你深入的理解应用之后,你就会理解为什么要把之前的内容放在最开始讲了。这是基石,也就是地基。盖房子可能你永远卡不到地基,但是肯定是从地基开始做起。然而,对于各位看官理解这个协议,从地基去讲确实有点不合适。所以我就在这里将应用之前,先把所有的地基先串一串,让大家了解一下地基到底是怎么跟房子连接起来的,然后再详细的去讲房子以及里面的窗户和装修等等。
在前面几篇文章中,大家应该对BACnet协议从应用层到物理层有了一定的了解。物理层用于数据的实际传输,链路层用于管理物理层使所有的设备都能在一个稳定的通信规则中稳定畅通的通信,网络层用于实现多个链路层的情况下数据的路由和分享。通过之前的文章,我想大家都大概对这三个层级有了一个大概的认识,也基本了解了它在各自位置的功能。但是当你再回顾应用层的协议和讲解时,你会很模糊,这个应用层到底是在干什么呢!其实,在我看BACnet协议的时候,我也有这样的感觉,这个应用层到底是在干什么呢?尤其是在你看了BACnet协议之后,里面还有关于BACnet数据的组包规则什么的,你会更加晕头转向。但是当你看到BACnet协议栈之后,再看到BACnet协议中的Object章节,你就会慢慢的清晰起来。因为之前章节所讲的东西都是再BACnet协议栈内部的东西,这些东西大部分对于你来说,大部分都是黑箱,你通过调用API最终都要用到之前的那些知识点。这些知识点只有在你调试遇到问题或者在你看BACnet协议栈理解BACnet协议的时候,有很大的作用。哦,还忘了一点,你一直BACnet协议栈的时候,之前讲过的基础知识,尤其是物理层和数据链路层,也是很有帮助的。那么就言归正传了,Object是什么呢?或者说怎么理解之前所讲的应用层和Object呢?
在这里插入图片描述
如上图,这里就不得不引入另一个在BACnet中很重要的名词service。Object、service和application layer的关系如上图所示。Object可以理解为储存数据的数据库。Obejct根据不同的需求又定义不同类型的object,但是本质上将,它们都是用于存储数据的数据库。而service就是application layer或者说客户端等等访问Object的方式。Service最终实现的方式就是通过application layer中的confirmed request/response或者unconfirmed request来实现的。这里来举个例子,比如说,read property是BACnet中的一个service,客户端就可以用这个service告诉服务器,我要读取你的Object中的某个数据了,其过程如下图所示:
在这里插入图片描述

Object

Object分类

  • Device Object : 一个设备中只能有一个Device Object,这个device object相当于就是设备的名片,通过device object的一些属性,我们可以在BACnet的网络中找到我们想要的设备,因此它的名字或者ID等一些属性必须是全网唯一的。举个例子,这个应该就像你的电脑的IP地址(当然这里说的是固定IP地址,虽然一般情况下,我们的电脑不具有这个东西,但我们现在就假设你的电脑是固定IP地址,关于什么是固定IP地址,或者为什么个人电脑网络为什么没有固定IP地址,请不知道的小伙伴自己去查),我们在网络中输入这个IP地址就能找到你的电脑,如果有另外一台电脑也跟你用同样的IP,那么输入这个IP地址,就不知道找到的电脑中哪个是你的电脑了。
  • Analog Input Object : 模拟量输入Object
  • Analog Output Object: 模拟量输出Object
  • Analog Value Object : 模拟量Object
  • Binary Input/Output/Value Object : 二进制输入/输出/值Object
  • File Object : 文件Object,用于文件的传输
  • Multi-state Input/Output/Value Object : 这里的Multi-state有点像程序里面的枚举变量,也就是他肯定是整数,但是不一定连续,但是每个值都有实际的意义说明
  • 我就不一一列举了,有很多Object,在下面或者以后的篇章中我会对一些常用的或者在一些Service中用到的Object进行一些讲解

Object组成

所有的Object都是由各种各样的property组成的,所谓的property就是各种各样的用于说明Object或者完善Object功能的的数据。所有的Object里面都有的property是Object id, Object name, Object type, Description等。

Device Object

因为每个BACnet设备必须至少有一个Object就是Device Object,所以我们就先讲这个最重要的Object。如果你仔细看了前面的章节,你会发现在前面章节中有一些关于网络层和数据链路层的参数都是由device Object来确定的。这也是Device Object重要的原因,因为它不仅定义了自己在全网中的名片,还规定了自己在全网中通信的一些参数,所以它是BACnet通信能够正常运转起来的基石。正因为如此,在BACnet协议栈中,你会发现它肯定是首先被初始化的。
在这里插入图片描述在这里插入图片描述

  • Object_Identifier: 它的值必须是在全网内唯一的

  • Object_Name : 它是一个字符串,也必须在全网内是唯一的,最小的长度是一个字符,在以后的篇章中会将service,尤其是发现的过程中,会解释为什么这些东西要是全网唯一

  • Object_Type : DEVICE type

  • System_Status : 用于显示当前BACnet设备的物理和逻辑上的状态

    • OPERATIONAL
    • OPERATIONAL_READ_ONLY
    • DOWNLOAD_REQUIRED
    • DOWNLOAD_IN_PROGRESS
    • NON_OPERATIONAL
    • BACKUP_IN_PROGRESS
    • 这些状态除了BACKUP_IN_PROGRESS是与BACnet协议中的BACKUP服务相关的,其它状态的具体意义都是用户可以自己定义的
  • Vendor_Name : BACnet设备厂商的名字,是一个字符串

  • Vendor_Identifier : 有一些设备厂商是有独立id,在这里有一个概念要提一下read-only property, 字面意思就可以看出来是这个属性是只读的,但是它会涉及到后面章节的service的问题,也就是你访问这些property的方式就是service,这个只读其实的意思就是你只能通过读这个service来访问它,而不能通过写的service来操作它。

  • Location : 这个属性要说一下,一般都要去实现,因为它涉及到你在哪个时区,与你将来的时间控制方面的service会有所联系。

  • Protocol_Version : 协议主版本号都是1,目前没有什么改变

  • Protocol_Revision: 可以理解为协议的次版本号,这个一般跟你用的协议栈有关系,也就是协议栈跟哪个版本的协议对应,然后协议栈会有自己的这个次版本号,因为BACnet的BTL认证会有对这个版本的要求,所以当你在挑选协议栈的时候,一定要注意一下。

  • Protocol_Services_Supported : 这个属性说明了在这个设备中实现的service,当对方获取设备的device object之后,就知道这个device支持哪些service,这样就避免一些通信的冗余。

  • Protocol_Object_Types_Supported : 意如其名,说明device支持的object类型

  • Object_List : 在这个device中实现的所有的object都必须将object id放在这个list中

  • Property_List : 顾名思义,就是这个object实现的property的列表,因此当其他设备不知道这个设备的device object都实现了哪些property的情况,就可以先读这个property list,然后就知道这个device object中都有哪些property了,就可以正常的操作这些property了。那这时就会有看官说了,不是上面的图上已经给出了property的定义了,不应该是device object都要把这些property实现吗?当然不是,你可以看到最后一列,有R O的那一列,R就代表是必须实现的,O就是代表optional也就是可以实现可以不实现。

  • 这个property太多了,我就不再一一的讲解了,而且除了我上面讲解的是必须实现的property之外,其它必须实现的property如max_info,Max_APDU_Length_Accepted等等都是通讯层必须的一些条件设定,我在前面的章节讲通讯的时候也有了大部分的说明,还有一些不是必须实现的property,如Local_Time,Local_Date(这两个与schedule service有关),Last_Restore_Time(这个与restart和backup service有关)等,这些都是在你需要实现一些特定的service的时候才需要实现的东西。所以这些property将会在后面的章节讲到相应的service的时候进行说明,不然的话,我现在即使说一下property的意义,在没有跟你讲清楚它的应用场景的情况下,你对这个property的理解也会是很模糊。

最后聊两句

写这一篇的时间着实有点长了,今天就作为一个收尾吧!后面再单独开一篇来写了,如果把其他的object也加进来的话,那么这篇文章可就太长了,先读读device object的理解一下再说。最近在研究NFC,估计抽时间把这个事情总结一下,也写写发出来,既是对自己的总结,也是跟大家交流一下,看看自己哪里理解的不对。还有就是各位看官,看完文章多多点赞收藏啊,虽然点赞收藏对于我来说也没有什么利益相关,但是看到大家的认可也是一种鼓励啊!每天工作之余,在电脑前,边看文档,边看代码,边回忆,然后给大家码字,也不是一件很容易很轻松的事情,大家多多鼓励吧,谢谢!还有就是可以留言的啊!大家互相交流啊!

;