4.3 网络层协议报文和运行规程
4.3.1 网络层协议报文
网络层协议报文是指BACnet网络层控制和管理报文,主要用于BACnet路由器配置和管理、路由表的维护、网络层拥塞控制、PTP链路控制和管理以及网络层功能查询等。有10种网络层协议报文,说明如下:
1.Who-Is-Router-To-Network报文
该报文类型域是X‘00’,有2B的网络号,并可由网络中任意节点产生,用广播方式发送和转发。Who-Is-Router-To-Network报文作用:
1)转发节点用来确定通达信宿节点所在网络的下一个路由器。
2)帮助路由器更新路由表。在没有网络号的情况下,接收此报文的路由器要返回其所有可通达的目标网络的列表。
2.I-Am-Router-To-Network报文
该报文类型域是X‘01’,后面有2B的网络号。作用是列出通过发送此报文的路由器可以到达的网络号。
3.I-Could-Be-Router-To-Network报文
此类报文类型域是X‘02’,后面有2B的网络号。该类型报文是BACnet半路由器对数据部分有DNET域的Who-Is-Router-To-Network报文进行回复的报文,由能够建立到达特定目标网络的点到点连接的半路由器使用,其网络号就是所响应的报文中包含的特定网络的网络号。
4.Reject-Message-To-Network报文
报文类型域是X‘03’,后面有1B的原因说明和2B的网络号。该类报文由BACnet路由器产生,作用是一个拒绝报文,直接发给生成被拒绝的报文的节点,网络号就是被拒绝报文中的网络号。
5.Router-Busy-To-Network报文
报文类型域是X‘04’,后面是可选择的2B的网络号。该报文由路由器产生,作用是通过路由器通知停止接收通过本路由器向某特定目标网络或者所有网络发送的报文。此报文通常用广播MAC地址发向相应的网络。如果没有可选择的2B的网络号,则表示到所有网络的报文都不接收。
6.Router-Available-To-Network报文
报文类型域是X‘05’,后面是可选择的2B的网络号。该报文由路由器产生,并以广播方式进行传输,用户数据部分为DNET列表,说明该路由器恢复或使能接收来自DNET列表网络的报文。当数据部分的“DNET表”默认时,表示该路由器恢复或使能来自所有网络的报文。
7.Initialize-Router-Table报文
报文类型域是X‘06’,作用是初始化一个路由器的路由表或者查询当前路由表的内容。此报文有一个数据段,包含有初始化路由表的信息。
8.Initialize-Router-Table-Ack报文
报文类型域是X‘07’,作用是对初始化路由表报文应答,表示路由器的路由表已经改变,或者已被查询。此报文的数据段具有与它应答的初始化路由表报文相同的格式。
9.Establish-Connection-To-Network报文
报文类型域是X‘08’,后面有2B的网络号和1B的“中止时间值”。作用是命令一个半路由器创建一个通达指定网络的点到点连接。
10.Disconnect-Connection-To-Network报文
报文类型域是X‘09’,后面有2B的网络号。作用是命令一个路由器释放所建立的点到点连接。
4.3.2 网络层协议运行规程
BACnet路由器和BACnet设备节点进行的数据通信分为本地和远程通信,“本地”通信是指信源节点和信宿节点在同一个BACnet网络中的通信,“远程”通信是指信源节点和信宿节点分处不同的BACnet网络之中。不管是“本地”通信也好,还是“远程”通信,都要遵循网络层协议运行规程。
1.本地数据发送和接收的网络层协议规程
(1)本地数据发送的网络层协议规程
当网络层实体收到来自应用层的一个N-UNITDATA.request原语时,它先检查“目标地址”参数中的DNET字段。如果不存在此字段,表明信宿节点设备与信源节点设备位于同一个BAC-net网络中。并根据“network-priority”参数构造一个DNET域、DADR域、HOP COUNT域、SNET域和SADR域均不存在的Control域的控制字节。再将该控制字节与在N-UNITDATA.request原语中传递来的“data”参数组合并发送一个NPDU报文,发出相应的DL-UNITDATA.request原语。
(2)接收本地数据的网络层协议规程
当网络层实体收到来自数据链路层的一个NPDU时,在验证第1个字节的版本号后,接着检查第2个字节(Control域)的最高位(第7位),来判断NPDU报文类别。不同类别的报文按如下方式进行处理。如果Control域字节的第7位是“0”,表示此报文中包含有APDU。Control域字节的第7位是“1”,表明此报文是网络层报文。
1)对于APDU报文,当不存在DNET域或者存在DNET域而同时包含有全球广播地址X‘FFFF’时,网络实体查找BACnet应用层实体。如果网络实体找到相应的应用层实体,就将来自于数据链路层的报文中的NPCI部分去掉,将其后作为“数据”参数的部分作为一个N-UNIT-DATA.indication原语传送给应用层实体。如果网络层实体不能找到相应的应用层实体并且网络层实体本身位于非路由器节点,则丢弃此报文。当存在DNET域且不是全球广播地址X‘FFFF’时,非路由器节点中的网络层实体丢弃此报文,路由器中的网络层实体的行为在后面介绍。
2)对于本地网络层报文,当不存在DNET域或者存在DNET域而同时包含有全球广播地址X‘FFFF’时,网络层实体解读此报文。如果报文不可解读,就向源设备发送一个Reject-Message-To-Network报文。当存在DNET域且不是全球广播地址X‘FFFF’时,非路由器节点中的网络层实体丢弃此报文。
2.远程数据发送的网络层协议规程
当网络层实体收到来自应用层的一个N-UNITDATA.request原语时,首先检查“目标地址”参数中的DNET字段。如果存在此字段,表明信宿节点设备和信源节点设备在不同的BACnet网络中,必须通过BACnet路由器实现通信。在NPCI控制字节中指明存在DNET、DADR、Hop Count域,但是不存在SNET和SADR域。在“网络优先级”域中,网络层实体填入提供的参数。接着填写相应的地址域。NPCI加在N-UNITDATA.request原语中的“数据”参数(就是NSDU)的前面,形成NPDU,传送给数据链路层,作为数据链路层原语中的“数据”参数。同时向数据链路层发送一个DL-UNITDATA数据链路请求原语。
对于某个特定的DNET,有以下4种建立相应BACnet路由器地址的方法:
1)用人工方式设定。
2)发送一个Who-Is请求报文,并且读取应答的I-Am报文中的“源地址”SA段而得到BACnet路由器地址。
3)使用网络层报文Who-Is-Router-To-Network来获得。
4)向一个远程DNET上的设备发送具有本地广播MAC地址的报文,然后读取远程设备的响应报文中的SA而获得。
3.接收远程数据的网络层协议规程
当网络层实体接收到来自数据链路层的一个DL-UNITDATA.indication原语时,将该原语的“data”参数部分作为一个NPDU,然后检查第二个字节,这是控制NPCI。对于非路由器的BAC-net设备中的网络层实体,如果发现此字节表示存在DNET域且其值不为X‘FFFF’,则丢弃此报文。如果NPCI的Control字节表明存在DNET域,同时网络实体属于BACnet路由器,则网络实体把NPDU按优先级次序放入一个报文队列或多个队列(按优先级分)中,并按照队列顺序进行转发报文。如果NPCI的Control字节表示NPDU包含一个网络层报文,则网络层实体还需进一步查看“报文类型”域。如果此域表示存在一个Reject-Message-To-Network报文,则网络层实体要执行专门的针对此报文的规程。如果存在SNET和SADR域,表示报文来自一个对等的路由器;不存在SNET和SADR域则表示报文来自于与路由器直接连接的网络。对于后一种情况,路由器根据路由表所示的报文来自网络的网络号,将SNET和SADR添加到NPCI中。SADR域设置成等于到达报文的SA。
BACnet路由器和要转发报文的网络连接情况分为:
1)收到报文的路由器直接与DNET所指示的网络相连接。这种情况的应对措施是:网络层实体去掉NPCI中的DNET、DADR和Hop Count域,将DA设置为等于DADR,然后将报文直接发送给目标设备。
2)收到报文的路由器不直接与DNET所指示的网络相连接。网络层实体先将报文的Hop Count域的值减1,如果此值仍然大于0,就将报文沿着目标网络方向传给下一站路由器。如果不知道下一站路由器的位置,就发送一个Who-Is-Router-To-Network报文来确定其位置。如果Hop Count域值为0,则丢弃此报文。
3)DNET表示的是全球广播网络号并且Hop Count域的值大于0,收到报文的路由器使用适合于每种数据链路的广播地址,向除了报文来自于网络以外的所有连接的网络广播此报文。如果Hop Count域的值为0,则丢弃此报文。