1、第1章BACnet协议概述本章介绍BACnet协议的产生及协议模型,讨论BACnet网络的体系结构、拓扑结构、协议栈以及数据流。1.1BACnet协议模型1.1.1BACnet简介BACnet(ADatamunicationProtocolforBuildingAutomationandControlNetwork)是一种为楼宇自动控制网络所制定的数据通信协议,它由美国冷暖空调工程师协会组织的标准项目委员会135P(StandardProjectmittee:SPC135P)于1995年6月制定。BACnet标准产生的背景是用户对楼宇自动控制设备互操作性(Interoperability)的广
2、泛要求,即将不同厂家的设备组成一个一致的自控系统。BACnet实现楼宇自控设备的互操作性的思想是这样的,一般楼宇自控设备从功能上讲分为两部分,一部分专门处理设备的控制功能,另一部分专门处理设备的数据通信功能,不同厂商生产的设备使用各自专门的数据通信的方式,所以不同厂商的设备之间没有很好的互操作性。BACnet就是要建立一种统一的数据通信的标准,用于设 备的 通 信 部 分,从而使得按这种标准生产的设备,都可以进行通信,实现互操作性。BACnet标准只是规定了楼宇自控设备之间要进行“对话”所必须遵守的规则,并不涉及如何实现这些规则,各厂商可以用不断进步的技术来开发,从而使得整个领域的技术不断进步
3、。1.1.2BACnet协议模型SPC征集了各方面的意见,同时参考了国际上各种现已成文的或是事实上的数据通信标准,讨论得出了一个具有以下特性的网络协议模型:(1) 所有的网络设备,除了主从/令牌传递式从属机(MS/TPslaves :master-slave/token-passingslaves)以外,都是对等的(Peer)。当然某些同等设备可能比其他具有更多的特权(Privilege)和职责(Responsibility)。(2)每一个网络设备都称之为是一个“对象”(Object)的实体(entity),这是一个具有网络访问特征的集合模型。每个对象又用一些“属性”(Property)来描述
4、,这些属性表示了设备的硬件、软件以及操作的各个方面。在不需要了解设备内部设计或配置细节的情况下,对象提供了识别和访问设备信息的方法。尽管该标准规定了广泛的应用对象的类型以及它们的属性,但是一旦需要,利用开发工具仍可以自由地增加新的对象类型。(3)通信功能是通过读写某些对象的属性,以及利用其他协议提供的“服务”(Service)来完成的。尽管该标准规定了一套详尽的服务,但是一旦需要,该标准的机制也同样允许利用开发工具增加新的服务。(4)设备的完善性(Sophistication),即实现特定服务请求或理解特定对象类型种类的能力,是由设备的“一致性类别”(ConformanceClass)所反映的
5、。每一种类别定义了一个包括服务、对象、属性的最小集合,声明为某一类别的设备必须支持其相应的集合。(5)由于该标准遵循了ISO的“分层”通信体系结构的概念,因此使用不同的网络访问方法和物理介质可以交换相同的报文。这样可以根据传输速度和吞吐量的要求,采用相宜的开销来配置BACnet网络。(6)该标准是为暖气、通风、空调、制冷控制设备所设计的,同时它也为其他楼宇控制系统的集成提供了基本原则,例如照明、保安、消防系统等。虽然这些扩展超出了该标准的范围,但实现起来却简单明了。并且,标准中定义的许多对象和服务也可以不加修改地被应用。当然,一旦这些其他类型的楼宇控制功能需要,也可以简单方便地定义新的对象和服
6、务。(7)该标准的目的是为暖气、通风、空调、制冷控制设备和其它楼宇自控设备的监控定义数据通信的服务和协议。除此之外,标准还定义了抽象的、面向对象的表示法,用来描述这些设备间的信息通信,以便于在楼宇中使用数字控制技术。所有的通信协议都是一个解决各种信息交换问题的方案的集合,并且随着时间的推移和技术的进步而不断改变,BACnet网络同样也不例外。1.2BACnet协议的体系结构国际标准化组织在制定计算机网络通讯协议标准时定义了一个模型,称为开放式系统互联参考模型(OSI模型),模型的目的是解决计算机与计算机之间普遍的通信问题,并将这个复杂的问题分解成7个小的、易解决的子问题,每个子问题只与某些通信
7、功能相关联,如图1-1所示。这样每个子问题便形成了协议体系结构中的一“层”。任何两个遵循该模型及有关标准的设备或系统,都可以实现互连和互操作。SPC制定BACnet标准时,确定BACnet作为一种开放性计算机局域网协议,它仍然采用OSI模型的“分层”通信体系结构的概念。在确定分层的层数时,考虑了下列两个因素:第一,OSI模型的实现需要很高的费用,实际上在绝大部分楼宇自控系统应用中也并不需要这么多的层次。但是从OSI的功能性方面考虑,经过简化后,OSI模型仍然是设计楼宇自控协议的一个很好参考,如果只包含OSI模型中被选择的层次,其它各层则去掉,这样减少了报文长度,降低了通信处理开销,同时也会节约
8、楼宇自控工业的生产成本。第二,如果能够充分利用现有的、易用的、广泛使用的局域网技术,如Ethernet、ARCNET和LonTalk,不但可以降低成本,同时也有利于性能的提高。由此,SPC确定BACnet标准协议体系结构为一个包含四个层次的分层体系结构,这四个层次相对于OSI模型中的物理层、数据链路层、网络层和应用层,如图1-2所示。BACnet标准定义了自己的应用层和网络层,对于其数据链路层和物理层,提供了以下五种选择方案:第一种选择是ISO8802-2类型1定义的逻辑链路控制(LLC)协议,加上ISO8802-3介质访问控制(MAC)协议和物理层协议。ISO8802-2类型1提供了无连接不
9、确认的服务,ISO8802-3则是著名的以太网协议的国际标准。第二种选择是ISO8802-2类型1定义的逻辑链路控制(LLC)协议,加上ARCNET(ATA/ANSI878.1)。第三种选择是主从/令牌传递(MS/TP)协议加上EIA-485协议。MS/TP协议是专门针对楼宇自控设备设计的,它通过控制EIA-485的物理层,向网络层提供接口。第四种选择是点对点(PTP)协议加上EIA-232协议,为拨号串行异步通信提供了通信机制。第五种选择是LonTalk协议。这些选择都支持主/从MAC、确定性令牌传递MAC、高速争用MAC以及拨号访问。拓扑结构上,支持星型和总线型拓扑;物理介质上,支持双绞线
10、、同轴电缆、光缆。以下详细讨论BACnet选择一个四层体系结构的原因。首先仔细考虑BACnet网络的独特特征。BACnet的特征主要有以下两点:(1)BACnet网络是一种局域网。即使在某些应用中,楼宇中设备间远距离的通信必不可少时,这一点仍然是不变的。这种远距离的通信功能,是由电信网来实现。通信过程中要解决的路由、中继、可靠传输等问题,都由电信网来处理。在此电信网可看成是BACnet网络外部的部分。(2)BACnet设备是静态的,即在空间上,它们不会经常被移来移去。在要完成的功能上,从某种意义上说也是不变的,即不会今天生产的设备的功能是这样,明天就完全不同了。在充分了解BACnet网络的特征
11、后,就可讨论OSI模型的各层在BACnet网络中的适用性了。OSI模型的物理层提供了设备间的物理连接,以及传输载波信号的方式。显然在BACnet协议中,物理层是必不可少的。OSI模型的数据链路层,负责将数据组织成帧(Frame)或分组(Packet)、管理通讯介质的访问、寻址(Address),以及完成一些错误校正(ErrorRecovery)和流量控制。这些都是BACnet协议所需要的,因此数据链路层也是必不可少的。OSI网络层的功能,包括将全局地址解析为局部地址,在一个或多个网络中进行报文的路由,协调不同类型网络的差异(如不同网络所允许的最大报文长度),序列控制,流量控制,差错控制,以及多
12、路复用。由于BACnet网络的拓扑特点,在各个设备之间只存在一条逻辑通路(参见图3),这样便不需要最优路由的算法。其次,BACnet网络是由中继器或网桥互联起来的一个或多个网段所组成的网络,它具有单一的局部地址空间。在这样一种单一网络中,许多OSI网络层的功能也变得多余,或者与数据链路层相重复。当然在某些BACnet网络系统中,网络层也可能是必不可少的。例如,在一个BACnet的网际网(internet)中,当两个或多个网络使用了不同的MAC层时,便需要区别局部地址和全局地址,这样才能将报文路由到正确的网络上去。在BACnet协议中,通过定义了一个包含必要的寻径和控制信息的网络层头部,来完成这
13、种简化了的网络层功能。传输层主要是负责提供可靠的端到端的报文传输、报文分段、序列控制、流量控制,以及差错校正。传输层的许多功能与数据链路层相似,只是在作用范围上有所不同。传输层提供的是端到端的服务,而数据链路层则提供的是单一网络上点到点的服务。由于BACnet支持多种网络的配置,因此协议必须提供传输层端到端的服务。在BACnet网络中要提供三个方面的传输层的功能,第一是可靠的端到端传输和差错校正功能,第二是报文分段和端到端的流量控制,第三是实现报文的正确重组,序列控制。由于BACnet是建立在无连接的通信模型基础上的,因此所需的服务大大减少,并且可以被高层来实现,所以,传输层的这些功能可以通过
14、BACnet应用层来实现,这样,在BACnet协议体系中不单独设置传输层,相应的功能放在应用层中完成,从而节省了通信开销。会话层的功能是在通信双方之间建立和管理长时间对话。包括建立同步标志点,用来在出错时回复到前一个标志点,以避免对话重新开始。但在一个BACnet网络中,绝大部分的通信都是很简短的,比如读写一个或一些值,通知某个设备某个警报或事件,或者更改某个设定值。当然长时间的信息交换偶然也会发生的,比如上载或下载某个设备。由于绝大部分事务处理都是简短的,会话层的服务极少用到,再考虑到带来的开销,因此BACnet标准中不包括这层。表示层为通信双方提供了屏蔽下层传送语法的服务。这种传送语法是用
15、来将应用层中抽象的用户数据表示,变成适合下层传输的字节序列。但当只存在一种传送语法时,表示层的功能便减少到对应用程序的数据进行编码。由于在BACnet在应用层中定义了一个固定的编码方案,因此一个独立的表示层也变得不再需要。协议的应用层为应用程序提供了完成各自功能所需的通信服务。在此基础上,应用程序可以监控HVAC&R和其它楼宇自控系统。显然应用层是本协议所必需的。从以上讨论中,可以得到以下几点:1 实现一个完全的OSI七层体系结构需要大量的资源和开销,因此它对于目前的楼宇自控系统是不适用的。2 根据OSI模型,采用现有的计算机网络技术将会带来以下好处:节约成本,便于与其它计算机网络系统集成。3
16、根据楼宇自控系统的环境及要求,可以通过去除OSI某些层的功能来简化OSI模型。4由物理层、数据链路层、网络层和应用层组成的一个简化体系结构,是当今楼宇自控系统的最佳解决方案。1.3BAC网络的拓扑结构为了应用的灵活性,BACnet并没有严格规定网络的拓扑结构。BACnet设备可以通过专线或拨号异步串行线,与四种局域网之一进行物理相连。而这些网络可以通过BACnet路由器或一对半路由器进一步互联。在BACnet网络中,定义了如下这样一些拓扑结构:1. 物理网段(PhysicalSegment):直接连接一些BACnet设备的一段物理介质。2. 网段(Segment):多个物理网段通过“中继器”在
17、物理层连接,所形成的网络段。3. 网络(Network):多个BACnet网段通过“网桥”互连而成,每个BACnet网络都形成一个单一的MAC地址域。这些在物理层和数据链路层上连接各个网段的设备,可以利用MAC地址实现报文的过滤。4.网际网(Internetwork):将使用不同LAN技术的多个网络,用BACnet“路由器”互联起来,便形成了一个BACnet“网际网”。在一个BACnet网际网中,任意两个节点之间恰好存在着一条报文通路。这些概念如图1-3所示。1.4BACnet的协议栈和数据流在BACnet中,两个对等应用进程间的信息交换,依然按照OSI技术报告中关于ISO的服务惯例(ISOT
18、R8509),被表示成抽象的服务原语的交换。BACnet定义了四种服务原语:请求、指示、响应和证实原语,用来传递某些特定的服务参数。而包含这些原语的信息,又是由BACnet标准中定义的各种协议数据单元(PDU:ProtocolDataUnit)来传递的。当应用程序需要同远地的应用进程通讯时,它通过调用API访问本地的BACnet用户单元(应用层中为用户应用程序提供服务的访问点)。API的某些参数,如接收服务请求的设备的标志号(或地址)、协议控制信息等,将直接下传到网络层或数据链路层。而其余参数将组成一个应用层服务原语,通过BACnet的用户单元传到BACnet的应用服务单元(应用层中利用下层服
19、务完成应用层服务的部分)。从概念上来讲,由应用层服务原语产生的应用层协议数据单元(APDU),构成了网络层服务原语的数据部分,并通过网络层服务访问点下传到网络层。同样,这个请求将进一步下传到本地设备协议栈的以下各层。整个过程如图1-4所示(见下一页)。于是,报文就这样被传送到远地的设备,并在远地设备协议栈中逐级上传,最后指示原语看起来似乎是直接从远地的BACnet应用服务单元上传到远地的BACnet用户单元。任何从远地设备发回的响应,也是以该方式回传给请求设备的。 BACnet协议采用的分层思想,来源与一个简单的科学原理分层原理(LayeringPrinciple)。即“在目标计算机上的第N层
20、软件必须恰好接收由在发送计算机上的第N层软件所发送的数据”。换句话说,在数据发送前,协议进行的任何转换在接收时必须被完全地逆转换。如果在发送计算机上的一个特定层将一个头部放入帧中,在接收计算机的相应层必须除去该头部。分层思想简化了协议的设计和测试,避免了一层协议软件引入其它层可见的改变。这样,每一层的发送和接收软件可独立于其它层进行设计、实现、测试。第2章BACnet应用层规范本章介绍BACnet的应用层规范的原理和运行机制,概要介绍BACnet应用层的模型、主要的服务原语以及应用层报文的结构,并讨论BACnet各种报文的传输过程以及与报文传输相关的其它问题。2.1BACnet协议的应用层规范
21、BACnet网络的应用层协议要解决三个问题,向应用程序提供通信服务的规范,与下层协议进行信息交换的规范,和与对等的远程应用层实体交互的规范。首先对一些相关的概念进行说明。应用进程是指,为了实现某个特定的应用(例如,节点设备向一个远端的温度传感器设备请求当前温度值)所需要的进行信息处理的一组方法。一般来说,这是一组计算机软件。应用进程分为两部分,一部分专门进行信息处理,不涉及通信功能,这部分称为应用程序。另一部分处理BACnet通信事务,称为应用实体。应用程序与应用实体之间通过应用编程接口(API)进行交互。BACnet应用层协议只对应用实体进行规范,不涉及应用程序和应用编程接口。但在具体实现过
22、程中,应用编程接口一定是某个函数、过程或子程序的调用。图2-1示出了这些概念,图中阴影部分是应用进程位于BACnet应用层中的部分。应用实体本身又由两部分组成,分别是BACnet用户单元和BACnet应用服务单元(ASE)。应用服务单元是一组特定内容的应用服务,这些应用服务包括:报警与事件服务,文件访问服务,对象访问服务,远程设备管理服务,虚拟终端服务,和网络安全性。用户单元的功能是支持本地API,负责保存事务处理的上下文信息,产生请求标志符(ID),记录标志符所对应的应用服务响应,维护超时重传机制所需的超时计数器,以及将设备的行为要求映射成为BACnet的对象。我们将在后续的文章中介绍这些应
23、用服务和对象的内容。“BACnet设备”是指任何一种支持用BACnet协议进行数字通信的真实的或者虚拟的设备。一个BACnet设备有且只有一个“设备对象”,而且被一个网络号和一个MAC地址唯一确定。在大多数情况下,一个物理设备就是一个BACnet设备,例如一个支持BACnet协议通信的温度传感器就是一个BACnet设备。但是也可能有一个物理设备具有多个“虚拟的”BACnet设备的功能,在BACnet标准的附件H中对此进行了详细规范。当一个BACnet设备中的应用程序需要与网络中其它BACnet设备中的应用程序进行通信时,应用程序只需通过调用API访问本地的BACnet用户单元来实现。例如,一个
24、BACnet设备的应用程序要向一个远地设备的应用程序发送一个请求服务信息,它调用API,并将相应的参数填入API中。API中的某些参数,如服务请求接收设备的标志号(或地址)、协议控制信息等,将直接下传到网络层或数据链路层;其余参数则组成一个应用层服务原语,通过BACnet用户单元传到BACnet应用服务单元(ASE),形成应用层协议数据单元(APDU)。APDU则通过网络层的服务访问点(NSAP)下传到网络层,成为网络层服务原语的数据部分。这个请求将进一步下传到本地设备协议栈中的下层,最终由物理层传送到远地设备,并通过远地设备协议栈逐级上传到远地用户单元。从远地设备看起来,指示原语似乎是直接从
25、它自己的BACnet应用服务单元传到其BACnet用户单元的。同样,任何从远地设备发回的响应,也是以相同方式回传给请求设备。BACnet应用层协议包含了OSI模型中的应用层到传输层中的相应内容,所以除了应用层服务的功能外,还要有端到端可靠传输的功能。因此,BACnet应用层规范就是为了保证BACnet设备的应用程序能够与网络中远地BACnet设备的应用程序进行端到端可靠通信而制定的一组规则,其主要内容包括:BACnet应用层提供的服务类型,上下层之间交换的接口控制信息,和对等层协议数据单元的传输机制。2.2BACnet应用层服务类型BACnet的应用层提供两种类型的服务,分别是“证实服务”和“
26、非证实服务”。在BACnet中,两个对等应用进程间的信息交换,根据ISO的服务惯例,被表示成抽象的服务原语的交换。BACnet定义了四种服务原语:请求(Request)、指示(Indication)、响应(Response)以及证实(Confirm)原语,可以用来传递某些特定的服务参数。而包含这些原语的信息,又是由标准中定义的各种协议数据单元(PDU)来传递的。下面列出各种服务原语:CONF_SERV.responseCONF_SERV.ConfirmCONF_SERV.RequestCONF_SERV.indicationUNCONF_SERV.requestUNCONF_SERV.indi
27、cationSEGMENT_ACK.requestSEGMENT_ACK.requestERROR.requestERROR.indicationREJECT.requestREJECT.indicationABORT.requestABORT.indicationCONF_SERV的标识表明使用的是BACnet证实服务PDU。UNCONF_SERV、SEGMENT_ACK、ERROR、REJECT和ABOUT,分别表明使用的是非证实服务PDU、分段回应PDU、出错PDU、拒绝PDU和放弃PDU,后面这些都是非证实服务类型。证实服务是建立在客户/服务器通信模型的基础上的,客户端通过某个服务请求
28、实例,向服务器请求服务,而服务器则通过响应请求来为客户端提供服务,如图2-2所示。在交互过程中,担当客户角色的BACnet用户,称为请求方BACnet用户;担当服务器角色的BACnet用户,称为响应方BACnet用户。证实服务的具体过程如下:由请求方BACnet用户发出的一个CONF_SERV.request原语,形成请求PDU发送给响应方BACnet用户。当该请求PDU到达响应方BACnet用户时,响应方BACnet用户则收到一个CONF_SERV.indication原语。同样,由响应方BACnet用户发出的一个CONF_SERV.response原语,形成响应PDU回传给请求方BACne
29、t用户。当响应PDU到达请求方BACnet用户时,请求方BACnet用户则收到一个CONF_SERV.CONF_SERV.confirm原语。因此,整个过程中请求方BACnet用户和响应方BACnet用户都要接收和发送PDU。在非证实服务中,不存在上述客户/服务器模型、“请求方BACnet用户”和“响应方BACnet用户”等概念,只有“发送方BACnet用户”和“接收方BACnet用户”。前者指的是发送PDU的BACnet用户,后者指的是当一个PDU到达时,接收到一个指示(indication)或证实(confirm)的BACnet用户。图2-3为正常的证实服务报文传递的示意图,图2-4为正常
30、的非证实服务报文传递的示意图。2.3BACnet应用层报文分析2.3.1应用层接口控制信息除了服务原语和服务参数外,应用实体还通过API与应用程序交换各种接口控制信息(ICI)参数,其具体内容取决于服务原语的类型。应用实体接收到的ICI参数将下传到下面各层,以便于各层PDU的构建。而应用实体回传给应用程序的ICI参数,则包含了其以下各层从各自的PDU中得到的信息。通过API与各种服务原语交换信息的ICI参数包括:1. “目的地址”(DA:):将要接收服务原语设备的地址。其格式(如设备名称、网络地址等)只与本地有关。这个地址也可以是多播地址、本地广播地址或全局广播地址类型。2. “源地址”(SA
31、):发送服务原语的设备的地址。其格式只与本地有关。 3.“网络优先权”(NP):表示网络优先权的参数。4.“需回复数据”(DER):一个逻辑值参数,用来指明某个服务是否需要一个回复服务原语来确认。2.3.2应用层协议数据单元的编码在BACnet中,使用应用层协议数据单元(APDU)来传递包含在应用服务原语和相应的参数中的信息。BACnet选择ISOStandard8824规范中的方法来表征BACnet服务的数据内容。并且,BACnet规定了APDU的编码内容,这些编码内容在BACnet标准中的有关章节中进行了详细的描述。BACnet的APDU由协议控制信息(PCI)和用户数据两部分组成。PCI
32、中包含进行应用层协议操作所需要的数据,这些数据包括:APDU的类型,匹配服务请求和服务响应的信息,执行分段报文重组的信息。这些信息包含在报文的头部,也称为APDU的固定部分。用户数据中包含每种服务请求和服务响应的具体信息,这部分也称为APDU的可变部分。2.3.3 BACnet报文的分段为了实现长报文(长度大于通信网络、收/发设备所支持的长度)的传输,有必要对报文进行分段。在BACnet体系结构中,不存在单独的传输层,因此报文分段不是由传输层实现,而是由应用层来完成。并且,在BACnet中只有Confirmed-Request和plex-ACK报文可能需要分段,因此分段还是BACnet的一个可
33、选特性。1报文分段的原则每个由BACnet报文编码而成的数据流序列,按下面规则进行分段,然后再在网上传输。一个完整的报文尽可能作为一个APDU发送。当一个完整的报文不可能作为一个APDU发送时,则应分段成最少个数的多个APDU发送。一个报文分段的长度(以bit为单位)应是8的整数倍,即对报文进行分段时,字节是最小的分割单位。2BACnetAPDU最大长度的确定在BACnet中,APDU的长度也是没有固定的,而是定义了一个确定APDU最大长度的原则,即APDU最大长度应是以下长度值中的最小值:设备所能发送的APDU的最大长度。一般与本地设备的缓冲区大小等本地因素有关。BACnet网际网所能传输到
34、远地设备的APDU的最大长度。一般由本地、远地,以及中间传输网络的数据链路所决定。远地设备所能接收的APDU的最大长度,其值不能小于50个字节。3与分段有关的协议控制信息(PCI)为了支持报文分段,BACnet协议在BACnet-Confirmed-Request-PDU和BACnet-plexACK-PDU的头部,定义了四个与分段有关的协议控制信息参数。其中两个是布尔型参数,另两个是八位二进制无符号整数。这些参数可以使接收方对到达的分段进行正确的重组,从而保证端到端的可靠传输。2.4BACnetAPDU的传输BACnet的APDU收发协议的详细细节,包含在BACnet复杂的事务状态机制(TS
35、M:TransactionStateMachine)中,以下的讨论旨在对几种主要APDU的传输过程有整体的认识。2.4.1证实请求报文的传输客户端设备在传输了一个完整未分段的证实请求报文(Confirmed-RequestMessage)后,或在等待接收分段证实请求报文最后一个分段所对应的确认信息时,将启动一个计时器。该计时器用来计量对请求报文回应的时间。一旦收到了针对该请求报文所发的出错APDU、拒绝APDU、放弃APDU、简单回应APDU或复杂回应APDU,则停止计时,同时通知客户应用程序。如果计时器的时间值超出了客户设备对象的APDU_TimeOut属性值,则整个报文重新发送,计时器重新
36、计时。所有报文的超时重传均按此过程进行,直至重传次数超出了客户端设备对象“APDU重传次数”属性所规定的次数。若超出规定值仍未收到响应,该报文将被丢弃,同时通知客户应用程序。2.4.2分段证实请求报文的传输客户端设备在发送分段证实请求(SegmentedConfirmed-RequestMessage)PDU的第一个分段之前,首先选择一个预设窗口值,以表示它在收到一个分段回应之前,一次准备发送的报文分段最大个数。它通常由报文分段的“建议窗口尺寸”参数表示,取值范围为1至127,在该处其具体取值只与客户端有关。在传输完第一个分段后,客户端设备将启动一个计时器,用来计量对报文分段回应的时间。一旦收
37、到了针对该报文分段所发的拒绝APDU、放弃APDU或分组回应APDU,则停止计时,同时通知客户应用程序。如果计时器的时间值超出了客户设备对象的APDU_Segment_TimeOut属性值,则这个分段将重新发送,计时器重新计时。所有报文分段的超时重传均按此过程进行,直至重传次数超出了客户端设备对象中“APDU重传次数”属性所规定的次数。若超出规定值仍未收到响应,该报文将被丢弃,同时通知客户应用程序。当服务端设备收到分段证实请求PDU的第一个分段后,将会选择一个实际窗口值,以表示它在发送一个分段回应前,一次准备接收的报文分段最大个数。同样,该值的取值范围也规定在1至127之间,同时它还不能大于证
38、实请求PDU中的预设窗口值,在该处其具体取值只与服务器端有关。在收到第一个分组回应APDU后,客户端设备从中得到服务器端设备的实际窗口值,并将该值设置成它的实际窗口值。这样,客户端设备和服务器端设备的实际窗口值大小一致。客户端便可以在收到一个分段回应APDU之前,一次发送多个分段;服务器端也可以在发送一个分段回应APDU之前,一次接收多个分段。客户端发送完整个报文或发送了窗口值个数的多个分段后,将启动一个计时器,用来计量对这些报文分段回应的时间。一旦收到了针对这些报文分段所发的拒绝APDU、放弃APDU或分组回应APDU,则停止计时。如果计时器的时间值超出了客户设备对象的APDU_Segmen
39、t_TimeOut属性值,则这些分段将重新发送,计时器重新计时。所有报文分段的超时重传均按此过程进行,直至重传次数超出了客户端设备对象中“APDU重传次数”属性所规定的次数。若超出规定值仍未收到响应,该报文将被丢弃,同时通知客户应用程序。客户端在发送分段的过程中,可能会收到拒绝APDU、放弃APDU或分段回应APDU。在这种情况下,收到拒绝APDU或放弃APDU将会中止请求的传输;收到分段回应APDU,将会作为序号等于或小于该APDU中分段数参数值的所有分段的确认,而那些没有被确认的分段将按上述过程重传。2.4.3分段复杂回应报文的传输分段复杂回应报文(SegmentedplexACKMess
40、age)的传输过程与分段证实请求报文的传输过程相类似,主要不同之处在于:在分段复杂回应报文的传输过程中,由服务器端设备发送复杂回应报文的分段,由客户端设备接收并发分段回应APDU在分段复杂回应报文的传输过程中,客户端设备只能回应放弃APDU或分段回应APDU,而不能回应拒绝APDU。2.4.4分段回应APDU的传输分段回应APDU是分段接收方设备用来回应发送方的信息。在以下四种情况下,设备需传输一个SegmentACK。设备收到报文的第一个分段。设备收到未确认的、有序的、数量为实际窗口值的多个报文分段构成的序列。设备收到一个乱序分段报文(可能表明丢失了某个分段)。设备收到报文的最后一个分段。2
41、.5与传输有关的其它问题2.5.1事务状态机制的中止在一个证实请求的服务过程中,客户端与服务器端都将创立各自的事务状态机制,以便针对各种情况分别进行处理。该事务状态机制的终止由一些条件所决定。对于客户端,当出现以下几种情况时,事务处理终止,同时结束该事务状态机制。当收到服务器端设备发来的简单回应、不分段复杂回应、出错、拒绝或放弃APDU时。收到服务器发来的分段复杂回应APDU的最后一个分段,并发送了相应的分段回应APDU后。当超时重传次数用尽后。在向服务器发送了包含该事务处理过程标志符的放弃APDU后。对于服务器端当出现以下几种情况时,将终止事务处理,同时结束该事务状态机制。当向客户端设备发送
42、完简单回应、不分段复杂回应、出错、拒绝或放弃APDU后。当收到客户端设备发来的针对分段复杂回应APDU的最后一个分段的回应APDU后。当接收到客户端发来的包含该事务处理过程标志符的放弃APDU后。在传输一个分段复杂回应APDU的过程中,超时重传次数达到规定值仍未成功时。2.5.2重复报文的处理在一个事务处理过程中,由于使用了BACnet的出错重传机制,设备不可避免的会接收到重复的报文或报文分段。对此,BACnet协议中是按以下各种可能出现的情况分别处理的。服务器接收到一个重复的证实请求报文。这时,如果服务器具有识别重复证实请求报文的能力,则该重复报文将被服务器丢弃。否则,服务器仍会响应这个重复
43、的证实请求报文。这样的话,客户端应当根据响应中的标志符不与任何一个当前的事务状态机制绑定,来忽略该重复响应。服务器接收到一个重复的证实请求报文分段,即已经收到该分段并发送了分段确认。在这种情况下,服务器应忽略该重复分段并回传一个适当的分段回应APDU。判断分段是否重复的依据是:任何一个分段都可以由其对等方地址、标志符以及分段序号唯一确定。 客户端接收到一个重复的复杂回应分段,即该分段已经收到并确认了。客户端应忽略该重复分段并回传一个适当的分段回应APDU。设备接收到一个重复的分段确认APDU。这时,该设备应忽略重复的分段确认APDU。2.5.3资源的回收上述BACnet的出错重传过程,其具体实
44、现需要客户和服务器两端提供一定的资源。这些资源通常是事务处理的各个细节,包括事务状态机制(TSM)、计时器以及APDU或APDU分段缓冲区等。当出错重传过程失败时,这些相关的资源也变得失效,应被释放掉。资源释放的具体细节取决于系统的具体设计。作为建议,BACnet协议给出了资源失效而应释放的依据:客户端收到对一个证实请求APDU的完整响应后。在客户端,当一个证实请求APDU被重发了“APDU重发次数”属性所规定的次数,但仍未成功时。在客户端,当一个证实请求APDU分段被重发了“APDU重发次数”属性所规定的次数,但仍未成功时。在服务器端,当发送了对某个证实请求APDU的响应并收到相应的分段回应
45、后。第3章BACnet网络层规范本章介绍BACnet协议网络层的原理和运行机制,包括BACnet网络层的功能、主要的服务原语以及网络层报文的结构,并简要介绍BACnet路由器的运行规程。3.1BACnet网络层规范的内容BACnet网络层的目的是提供一种方法,使用这种方法,不用考虑网络所使用的BACnet数据链路技术,可以将报文从一个BACnet网络传递到另一个BACnet网络。数据链路层提供将报文在本局域网内传递到某个设备或者广播到所有设备的能力,而网络层则提供将报文直接传递到一个远程的BACnet设备、广播到一个远程BACnet网络、或者广播到所有的BACnet网络中的所有BACnet设备
46、的能力。一个BACnet设备被一个网络号码和一个MAC地址唯一确定。我们将那些使用不同的数据链路层技术的局域网称为异类网络,例如,以太网、ARCNET网络和Lonworks网络等就是异类网络。网络层的功能就是实现连接两个异类的BACnet局域网。实现异类网络连接的设备称为“BACnet路由器”。从协议的观点看,网络层的功能是向应用层提供统一的网络服务平台,屏蔽异类网络的差异。同时,BACnet网络层协议也建立路由器建立和维护它们的路由表的方法,这将使得路由器自动配置和报文在路由器之间的流动成为可能。3.1.1BACnet网络层的服务原语BACnet网络层向应用层提供的服务是不确认的无连接形式的
47、数据单元传送服务。与这种交互相关的原语是N-UNITDATA请求和指示,其参数如下:N-UNITDATA.request(destination_address,data,network_priority,data_expecting_reply)N-UNITDATA.indication(source_address,destination_address,data,network_priority,data_expecting_reply)“目标地址”和“源地址”参数提供下列事物的逻辑连续配置:1)一个可选择的网络号码,2)适合于下层LAN技术的MAC地址,3)链路服务接入点。网络号码XFFFF表示此报文广播到目前能够到达的所有网络的所有设备。目前能够到达的网络是指那些在BACnet互联网中已经具有一条有效连接的网络。“数据”参数是从应用层传递过来的网络服务数据单元(NSDU),其中包含一个完全编码的BACnetAPDU。“网络优先级”参数是一个数字值,由BACnet路由器中的网络层用来确定任何可能的优先于先进先出排队等待规则的情况。“data_expecting_reply