您的位置:首页 > 理论基础 > 计算机网络

【BACnet】4.bacnet-stack-0.8.0工程与BACnet标准协议之间的代码关系(网络层)

2013-03-24 13:38 441 查看

BACnet网络层:

1.在BACnet体系结构中,网络层位于多种局域网技术之上,其作用是屏蔽不同局域网的差异,向应用层提供统一的“视图”。这就要求网络层不仅具有路由功能,在不同的BACnet网络间将报文由一个设备传送到另一个远程设备,或将一个报文广播到另一个远程网络上,或将一个报文广播到所有网络上的所有设备,而且网络层必须具有灵活的地址映射功能,以适应不同局域网MAC地址的转换。因此,在不同BACnet网络间进行报文转发路由就形成了BACnet网络层的主要功能。

2.BACnet网络层功能根据BACnet网络的特点,对ISO-RM网络层功能进行了恰当的选择和删除,主要体现在:a)删除了ISO-RM网络层中的路由计算和路由优化功能,只保留了路由选择功能。同时,BACnet标准规定任意两设备之间只有一条路径,使得BACnet网络层的路由功能得到了极大的简化;b)BACnet网络层只提供非证实服务,不提供面向连接的服务功能,证实服务已经有应用层进行完成;c)同时,由于BACnet网络设备间交换的信息比较简单,字节数较少,可以使用不分段的报文进行传输,所以BACnet网络层删除了报文分段和组装的功能。

局域网

报文最大长度

ISO8802-3(Ethernet)

1497Bytes

MS/TP(主从/令牌)

501Bytes

3.网络层服务:
BACnet网络层值提供无连接服务功能,因而其服务也只有“无证实服务”一种。相应的,网络层服务原语只有N-UNITDATA.request和N-UNITDATA.indication两种

N-UNITDATA.request{

                           destination_address,    --  目的地址

                           data,                           --  由应用层协议数据单元APDU组成

                           network_priority,           --  网络优先权

                           data_expecting_reply    --  数据回复标志

                           }

N-UNITDATA.request{

                           source_address,          --  源地址

                           destination_address,    --  目的地址

                           data,                           --  由应用层协议数据单元APDU组成

                           network_priority,           --  网络优先权

                           data_expecting_reply    --  数据回复标志

                           }

destination_address和source_address由如下3个部分组成:

(1)网络号:每个BACnet网络均有唯一的标识符,这个就是BACnet网络号,用于BACnet互联网络路由功能。为16位无符号整数,目的地址的网络号范围:1~65535;源地址网络号的范围:1~65534。若目的地址为0xFFFF,表示BACnet互联网络的全局广播地址。如果报文在BACnet网络中进行当地广播,则可以省略“网络号”参数;

(2)MAC地址:用于BACnet网络内部路由,将报文从一个设备节点路由到另一个设备节点,或者是组播及广播方式。BACnet网络不通的局域网络具有不同的MAC地址和表示方式。ISO8802-3用6个字节表示MAC地址,而MS/TP只用一个字节表示MAC地址。

(3)链接服务访问点(LSAP):举个例子,在LLC协议数据单元中,服务访问点的作用与类型字段类似,用于标识LLC协议数据单元中所使用的高层协议,或标识对LLC协议数据单元数据部分进行处理的网络层实体。BACnet标准规定,ISO8802-2LLC协议数据单元中的源服务访问点(SSAP)和目的服务访问点(DSAP)均为0x82,若两个域俊文0x82,则表示数据部分为BACnet数据报文,并有BACnet网络层实体进行处理。若DSAP为0x06,则数据部分为IP报文,并由IP网络层实体进行处理。

4.网络层协议数据单元:
BACnet网络层协议数据单元NPDU包括网络层协议控制信息NPCI和网络层用户数据部分NUD。NPCI用于网络层协议本身的管理和控制,如初始化路由表,网络层流量控制,路由表查询等;NUD主要用于传输应用层协议数据单元。大多数网络层协议管理和控制报文NPDU是BACnet路由器信息交换的单元,只由路由器进行处理。

Version       1Byte主版本 BACnet协议的版本号
Control       1Byte
DNET          2Byte最终目的网络号,取值1~65535,为0XFFFF表示全局广播,缺省表示本地广播
DLEN          1Byte最终目的MAC地址长度,为0表示远程广播报文,非0表示DADR的长度
DADR          可变最终目的MAC地址。长度由DLEN确定,不同局域网有不同的MAC地址,在远程广播报文中该域缺省
SNET          2Byte源网络号,取值1~65534
SLEN          1Byte
SADR          可变
HopCount      1Byte转发计数,经过的BACnet路由器次数,如果DNET存在,该域必须存在,且初始化为0XFF
MessageType   1Byte报文类型,用于标识网络层协议管理和控制报文的类型。
VendorID      2Byte厂商标识号
NUD           Nbyte网络层用于数据部分,APDU
 

Control比较复杂:

Control域BIT 71 表示NUD是网络层协议管理和控制报文,MessageType必须存在      
 0 表示NUD传送的是BACnet APDU报文,无MessageType      
BIT 6Reserved as 0      
BIT 51 表示DNET DLEN 和hopcount都存在,DLEN=0表示远程广播      
 0 表示上述三者都不存在      
BIT 4Reserved as 0      
BIT 31 表示SNET SELEN SADR都存在      
 0 表示上述三者都不存在      
BIT 2       
BIT 1       
BIT 0       
BACnet报文的广播方式:

本地广播:使用本地局域网的MAC广播地址,如Ethernet使用全F,0xffffffffffff。

远程广播:先将报文发送至相应的路由器上,然后由该路由器作为远程网络上的源设备,在远程网络上进行本地广播操作。DNET=远程网络的网络号,DLEN=0

全局广播:DNET=0XFFFF

5.网络层协议管理和控制报文:
1.网络层协议管理和控制报文主要用于BACnet路由器的管理和控制,由NPDU的Control域的BIT7来控制:

/*Network Layer Message Type */
/*If Bit 7 of the control octet described in 6.2.2 is 1, */
/* a message type octet shall be present as shown in Figure 6-1. */
/* The following message types are indicated: */
typedef enum {
NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK = 0,     /* 查询到达某一BACnet网络的路由器 */
NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK = 1,       /* 用于BACnet路由器对上者的查询应答 */
NETWORK_MESSAGE_I_COULD_BE_ROUTER_TO_NETWORK = 2,
NETWORK_MESSAGE_REJECT_MESSAGE_TO_NETWORK = 3,
NETWORK_MESSAGE_ROUTER_BUSY_TO_NETWORK = 4,
NETWORK_MESSAGE_ROUTER_AVAILABLE_TO_NETWORK = 5,
NETWORK_MESSAGE_INIT_RT_TABLE = 6,
NETWORK_MESSAGE_INIT_RT_TABLE_ACK = 7,
NETWORK_MESSAGE_ESTABLISH_CONNECTION_TO_NETWORK = 8,
NETWORK_MESSAGE_DISCONNECT_CONNECTION_TO_NETWORK = 9,
/* X'0A' to X'7F': Reserved for use by ASHRAE, */
/* X'80' to X'FF': Available for vendor proprietary messages */     /* 用于扩展 */
NETWORK_MESSAGE_INVALID = 0x100
} BACNET_NETWORK_MESSAGE_TYPE;

6.网络层协议规程:
1.网络层协议功能除发送、接收和转发报文外,还必须在两种路由器(BACnet路由器和半路由器)中维护与路由相关的路由表。

2.发送本地报文:网络层实体一旦接收从应用层实体发出的N-UNITDATA.request原语,就检查请求原语参数"destination_address"中的DNET部分,若DNET不存在,表示最终接收设备与发出此原语请求的设备处于同一个BACnet网络中。接着会构造一个Control域表示不存在DNET DADR HOPCOUNT SNET SADR域,然后与N-UNITDATA.request原语传递来的data参数组合起来,形成一个NPDU报文,进而发出相应的DL-UNITDATA.request原语,该原语请求数据链路层实体处理NPDU,从而发送一个NPDU报文。tips:a)实际上就是根据MAC来转发,走二层。b)根据request原语带来的信息构造NPDU

3.接收本地报文:   一旦从对等网络实体接收到一个NPDU,接收设备节点的网络层实体在验证第一个字节为0x01后,接着讲第二个字节用为Control域,并检查该字节的最高位bit7,用于判断NPDU的类型,不同类别的报文按如下方式进行处理:MARK:如何区分是收到本地的报文还是远程的报文?

(1)本地报文:如果Control域最高位为0,表示传送的为APDU报文。若没有DNET及其相应的域,或DNET存在且为0xFFFF,则分别表示报文到达最终目的设备节点,或在该BACnet网络进行广播。网络层实体进而指示应用层实体(AE)对NPDU中的数据部分进行处理,若不能指示应用层实体,非路由节点则丢弃该NPDU,而路由节点不论是否指示成功,均会对DNET为0xFFFF的报文向其他网络广播;

(2)远程报文:若Control域的最高位为1,表示该NPDU为网络层协议管理和控制报文。若没有DNET及其相应的域,或DNET为0xFFFF,则分别表示报文到达最终目的设备节点,或在该BACnet网络进行广播。网络层实体就解释报文的类型,并根据不同的报文类型作出相应的操作,若果不能解释报文,非路由节点就简单的丢弃该报文,而路由节点还要返回一个Reject-Message-To-Network,以说明错误。

4.发送远程报文:络层实体一旦接收从应用层实体发出的N-UNITDATA.request原语,就检查请求原语参数"destination_address"中的DNET部分,若DNET存在,表示最终接收设备与发出此原语请求的设备不处于同一个BACnet网络中。并根据“network-priority”参数的值构造一个控制Control域字节,表示存在DNET DADR HOPCOUNT SNET SADR域,然后与N-UNITDATA.request原语传递来的data参数组合起来,形成一个NPDU报文,进而发出相应的DL-UNITDATA.request原语,该原语请求数据链路层实体处理NPDU,从而发送一个NPDU报文。

5.接收远程报文:当网络层实体接收到来自数据链路层的一个DL-UNITDATA.indication原语时,将该原语的data参数部分作为一个NPDU,检查其第一个字节是否为BACnet版本号1,若Control域表明存在DNET域,但其值不等于0XFFFF,同时网络实体所属的BACnet设备不是路由器,则网络实体丢弃这个报文;若网络实体表明是一个BACnet路由器,则网络实体把NPDU按优先级次序放入一个报文队列或多个队列中(按优先级分)。

对于接收到的远程报文,根据下面3种情况进行操作:

a)路由器直接连接到DNET所指的网络:路由器会把DNET DADR HOPCOUNT从NPCI中除去,同时相应的调整控制字节,表示只存在SNET SADR域,最后将报文直接送往目标设备,目标设备的DA值等于报文中的DADR参数;

b)报文需要传向另一个路由器:路由器将转发计数减1,若hopcount>0,则将报文发向通往目标网络的下一个路由器,若不能确定下一个路由器,该路由器会发送一个Who-Is-Router-To-Network报文,来确定下一个路由器。若hopcount=0,则丢弃该报文;

c)DNET是全局广播网络号码,并且hopcount>0,路由器将使用与每个数据链路想适应的广播地址,把这个报文广播到出了报文的源网络之外的与路由器直接相连的所有网络。

7.路由器:
1.路由表:路由表是实现路由功能的关键,因此对路由表进行维护则是正确路由的前提。路由器用端口连接不同的BACnet网络。每一个端口与一个BACnet网络相连,并在连接的BACnet网络中分配一个唯一的MAC地址。MARK:这个地方指的是这个路由器在不同BACnet网络中有不同的MAC地址吗?

路由表可以根据端口进行配置,其中,每一个端口由下列信息组成:

(1)端口的MAC地址,所占字节数与MAC地址长度相等

(2)与该端口直接相连的BACnet网络的网络号,占用2个字节

(3)列表项:表中每一个项包含3个元素,a)可到达的网络的网络号表;b)为下一个路由器的MAC地址,指的是与该端口直接相连的网络上的另一个路由器,通过该路由器可以到达a)中元素的网络;c)为“可到达状态”列表,分别对应为a)中元素的网络号。“可到达状态”描述了经过该端口和“下一个路由器”到达a)组元素中的网络链路是否建立,若由于路由器失效而不可到达,则为“Permanent(永久)”状态,若由于流量控制或PTP链路还没有建立时,则可以为“Temporary(暂时)”状态。

若一个路由器有多个端口,则该路由器必须具有相应数量的路由器路由信息。路由表可以在初始化时候人工配置,当接入网络时,利用I-Am-Router-To-Network报文广播自身的路由表信息,以便其他路由器能及时更新路由信息,同时,该路由器也可以接受其他路由器发出的I-Am-Router-To-Network报文以便更新本身的路由表,这样就可以保证所有路由表信息保持同步。

/* information for routing table */
typedef struct _routing_table_entry {
uint8_t mac[MAX_MAC_LEN];
uint8_t mac_len;
uint16_t net;
DNET *dnets;
} RT_ENTRY;



8.网络层协议管理和控制报文--报文结构与功能及路由器规程                                                       

 1.Who-Is-Router-To-Network:

 


 MARK:结合书上6.4.2和6.6.2一起看,工程中的代码在whoisrouter下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BACnet 协议栈 网络层