注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

易拉罐的博客

心静自然凉

 
 
 

日志

 
 

转 ZigBee Z-Stack2007 开发者手册 第五章 路由  

2015-11-04 13:39:38|  分类: 物联网 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
综述  
        一个mesh网络被定义成这样一个网络,在这个网络中路由信息是分散式的,是协同过程,包括许多同等地位的设备互利共赢地提供路由。  路由对于应用层来说是完全透明的。应用层仅向任何设备发送目的数据,这个数据向协议栈的下层传送,而下层负责寻找路由。因此,应用层并不知道在一个多跳网络中路由是怎样运行的。  路由也体现了ZigBee网络的自愈本质。如果一个特定的无线路由失败,路由函数最终将会找到一个新路由,新路由将避免特定路由链接。这大大加强了无线网络的可靠性也是ZigBee的重要特征之一。  多对一路由是一种特殊的路由表,它将处理包括集中交通在内的情况。这是ZigBee PRO特性的一部分,这将特别有助于减小当网络中的所有设备向一个网关或者数据集中器发送数据包时的交通量。多对一路由发现将在5.4节有详细介绍。 

路由协议 
           ZigBee采用一种ad-hoc网的基于AODV(Ad-hoc On-demand Distance Vector)路由协议的协议。在传感器网络中简化了这种协议,ZigBee路由协议简化了支持移动节点、链路失败、数据包丢失的环境。  相邻路由器是指在彼此无线范围内的路由器。每个路由器将在相邻路由表中跟踪他们相邻路由器,当路由器收到来自一个相邻路由器的任何信息(单播,广播或帧)时将会更新相邻路由表。  当一个路由器从它的应用或另外一个设备收到一个单播数据包,NWK层将会根据下面的程序转发这个包。如果目的地是相邻的路由器(包括它的子设备)中的一个,这个包将会被直接发送到目的设备。否则,路由器将会查找它的路由表,找到一个和包中的目的路由相对应的条目。如果有有效地目的地址路由表条目,包将会中继到下一跳地址,下一跳地址在路由条目中有所储存。如果一个单一的传送尝试失败,网络层将会重复发送这个包的过程直到被确认,最多可以重复尝试NWK_MAX_DATA_RETRIES次。在网络层的最大的尝试次数可以在“f8wconfig.cfg”中配置。如果在路由表中不能找到一个有效地条目或者在失败了最大次数的尝试以后,新的路由发现将会被初始化,包将会被缓存直到处理完成。  
           ZigBee终端设备没有任何路由功能。一个终端设备希望向任何一个设备发送包,它将会发给它的父节点,父节点将会在自己的立场上寻找路由。同样的,当任何设备希望向一个终端设备发送一个包或者初始化路由发现,这个终端设备的父节点将会从自己的立场进行响应。  注意到ZigBee树型地址(non-PRO)分配表使基于自己地址而产生出到任何目的地的路由成为可能。在Z-Stack中,这种机制将在周期性路由过程不能被初始化(通常是因为缺少路由表空间)的情况下被用作自动撤退。  另外,在Z-Stack中,路由实现也最佳化了路由表储存。通常,对于每个目的设备都需要一个路由表条目。但是,通过联合一个特定父节点的所有终端设备的条目和父设备的条目,将在不损失任何功能的前提下最佳化存储。 
             ZigBee路由,包括协调器执行以下路由功能(i)路由发现和收集(ii)路由管理(iii)路由期满。

路由发现和选择  
            路由发现是通过网络设备在网络中相互协同发现和建立路由路径的一个过程。一个路由发现可以被任何路由设备初始化,路由发现通常被执行的和一个特定的目的设备有关。路由发现机制搜索在源设备和目的设备之间的所有可能路由,并尽量选择最好的可能路径。  
           路由选择选择最小可能代价的路径。每个节点不断地追踪到达所有它的邻居节点的“链路代价”。链路代价是一个典型的接收信号强度的函数。通过把一条路径上的所有链路代价相加,就会导出整条链路的“链路代价”。路由算法将会寻找最小“链路代价”的路径。  
           路由发现是通过应用请求/响应包实现的。一个源设备通过向它的邻节点广播一个路由请求包(RREQ)来请求达到目的地址的路由。当一个节点接收到一个RREQ包,它将重复广播这个包。但是在这之前,它将通过增加最新的链路代价和在自己的路由发现表(5.3.2)中建立条目来更新RREQ包中的代价表。通过这种方法,RREQ包携带者路由所经过的所有链路代价的总和。这个过程将会重复进行直到RREQ到达了目的设备。许多RREQ将会通过不同的路径到达目的设备。每个RREQ包将会包含它所经过的所有路径的链路代价的总和。目的设备将会选择最好的RREQ包并且回发一个路由回复(RREP)包到源设备中去。 
           RREP包是沿着相反的中间节点的路径单播到初始请求的节点。当RREP包传播到源设备的时候,中间节点更新它们的路由表用来指示到达目的设备的路径。每个中间节点的路由发现表被用来决定RREP要传回到源设备的下一跳并且创建路由表中的条目。  一旦一个路由被创建了,数据包就能被传送了。当一个节点失去了和它下一跳的连接后(当发送数据包后没有收到MAC  ACK),那么这个节点将通过向所有可能收到RRER的节点发送一个RERR来使路径失效并且在邻居路由表中标记这条链路为坏。在收到一个RREQ,RREP或RERR后,节点将更新它们的路由表。

路由维护  
           Mesh网络提供路由维护和自愈。中间节点追踪一条链路上的传送失败。如果一个链路(在两个邻居节点之间)是不能用的,上游节点将初始化所有用到这条链路的路径的路由修复。当下一次一个数据包要用到那条路径时,将会初始化路由发现。如果路由发现不能被初始化,或者因为某种原因而导致失败,一个路由错误(RERR)包将会被发送回到数据包的源节点,然后这个源节点负责初始化新的路由发现。任何一种路径的重建都是自动的。

路由期满  
           路由表为建立路径维护条目。如果一段时间内没有数据包被沿着这条路径传送,这条路径将会被标记为期满。期满的路径直到空间不够时才会被删除。因此路径不会被删除直到的确需要这样做。自动路由期满时间可以在“f8wconfig.cfg”中被设置。设置ROUTE_EXPIRY_TIME为秒级的期满时间。如果设置成0,表示关闭路由期满功能。

路由表存储  
           路由功能要求路由器维护一些表。

路由表  
          每个ZigBee路由器,包括协调器,都包含一个路由表,在这个路由表中设备存储为包提供路由的信息。每个路由表条目包含目的地址,下一跳节点和链路状态。所有被送到目的地址的包将通过下一跳进行路由。路由表中的条目也可以期满,对于那些从来不用的条目来说,这是为了重新利用表空间。  路由表的容量指示一个设备路由表还有空余的路由表条目或者它已经有一个和目的地址响应的路由表条目。路由表大小在“f8wconfig.cfg”中有所配置。设置MAX_RTG_ENTRIES来决定条目的数目(默认是40)。想要了解更多关于路由期满的细节,可以参考路由维护部分。

路由发现表  
           路由器设备包括路由发现、维护路由发现表。这个路由发现表被用来存储当路由发现正在进行时的临时信息。这些条目只存在于路由发现操作期间,一旦路由发现结束,条目将被删除。一旦一个条目期满,它可以被用于另一条路由发现操作。因此,这个值决定了在网络中可以同时被执行的路由发现的最大数目。这个值可以通过“f8wconfig.cfg”中的MAX_RREQ_ENTRIES进行设置。

多对一路由协议  
            为了让用户更加了解ZigBee路由协议,接下来将解释多对一和源路由过程。现实中,所有的路由将在网络层被维护并且路由对于应用层来说是透明的。提出多对一路由发现和路由维护是应用层的决定。

多对一路由综述  
            在ZigBee PRO中采用多对一路由是为了最小化通信交通量,尤其是当中央集权的节点存在时。在低功耗无线网络中通常都会有一个设备充当网关或者数据收集器。网络中的所有设备都至少维护一条可以到达中央节点的路由。为了达到这个目的,所有的节点都必须初始化到达中央处理器的路由发现,这取决于现存的基于ZigBee  AODV路由方案。路由请求广播将会产生和增加大量空中的网络信息流通量。为了更好地最佳化路由方案,多对一路由被允许一个中央数据处理器建立这样一种路由,这种路由从网络中的所有节点到达中央单元只有一条路由发现并且最小化了路由发现广播风暴。  
            源路由只是多对一路由的一部分,源路由可以为中央收集器向目的地发送响应或者确认提供一个有效地途径。集中器把整个从集中器到目的地的路由信息放到要被传送的数据帧里面去。这将最小化路由表的大小和网络中路由发现的信息流量。

多对一路由发现  
             下面这幅图体现了一个多对一路由发现过程的例子。为了初始化多对一路由发现,集中器向整个网络广播一个多对一路由请求。在接收到路由请求后,每个设备为集中器添加一个路由表项目并且将中继请求的相邻一跳的节点存储为下一跳地址。不产生路由回复。
转  ZigBee Z-Stack2007 开发者手册 第五章 路由 - 易拉罐bb - 易拉罐的博客
 
         发现并且最小化了路由发现广播风暴。  源路由只是多对一路由的一部分,源路由可以为中央收集器向目的地发送响应或者确认提供一个有效地途径。集中器把整个从集中器到目的地的路由信息放到要被传送的数据帧里面去。这将最小化路由表的大小和网络中路由发现的信息流量。  5.4.2  多对一路由发现  下面这幅图体现了一个多对一路由发现过程的例子。为了初始化多对一路由发现,集中器向整个网络广播一个多对一路由请求。在接收到路由请求后,每个设备为集中器添加一个路由表项目并且将中继请求的相邻一跳的节点存储为下一跳地址。不产生路由回复。    多对一路由请求命令和单播路由请求命令相似,并且用同一个簇ID和同样的帧格式有效载荷。路由请求的选项区中是多对一,目的地址是0xFFFC。接下来Z-Stack  API可以用来为集中器提供发出多对一路由请求。想要了解更多关于API的内容请参考Z-Stack  API文档。  
ZStatus_t  NLME_RouteDiscoveryRequest(uint16 DstAddress,byte options,uint8 radius) 
             选项区域列举了路由请求的选项。可以有一下值:
转  ZigBee Z-Stack2007 开发者手册 第五章 路由 - 易拉罐bb - 易拉罐的博客
             当选项值为0x01或0x03时,DstAddress区域将会被重写为多对一目的地址0xFFFC。因此,在多对一路由请求的情况下,用户可以将DstAddress设置为任何值。 

路由记录命令  
            以上的多对一路由发现程序建立了从所用节点到集中器的路由。反过来的路由(从集中器到其它设备)将由路由记录命令(源路由表)执行。源路由表的处理过程在图2中有所展示。R1用以前建立好的多对一路径向集中器发送数据包DATA,并且希望得到一个确认消息。为了提供一个从集中器发出ACK消息的路径,R1在发送数据包的同时也发送路由记录命令,路由记录命令将记录数据包所经过的路由路径并且给集中器提供相反的路径,相反的路径用来发送ACK消息。
转  ZigBee Z-Stack2007 开发者手册 第五章 路由 - 易拉罐bb - 易拉罐的博客
            在收到路由记录命令后,中继路径上的设备将把它们自己的网络地址添加到路由记录命令的中继表中。当路由记录命令到达集中器时,它将包含完整的数据包中继路径。当集中器发送ACK到R1时,在包的头部应当包含网络层中的源路径(中继表)。所有收到这个包的设备应当中继数据包到下一跳设备中去,下一跳设备是根据源路径发现的。
            对于没有存储器限制的集中器来说,它能储存它所收到的所有路径记录条目并在将来用它们发送包到源设备中去。因此,设备仅需要发送路由记录命令一次。然而,对于没有路由缓存能力的集中器来说,设备总是要在发送数据包的同时发送路由记录命令。集中器将会暂时保存源路由,但是在使用完之后就会丢弃掉。  
           总而言之,当网络中的许多设备都对一个设备要求路由时,多对一路由对于ZigBee单播来说是一种有效地加强。作为多对一路由的一种,源路由仅仅在特定的情况下使用。首先,当集中器回复源设备初始发出的请求时,会使用源路由。其次,如果集中器有足够的存储空间,它需要储存所有设备的路由信息。否则,无论何时设备向集中器发出请求时,它们都应该伴随着发送路由记录。 

多对一路由的维护  
            当一个设备发送一个多对一帧时链路失败(注意多对一路由帧和普通的单播数据包并没有区别,然而,路由表条目有一块区域用来表示目的地是集中器),这个设备将产生一个网络状态命令“Many-to-one route failure”。这个网络状态命令将通过随机的邻节点被中继到集中器,希望邻节点依然具有有效的连接到集中器的路由。当集中器收不到路由时,应用将决定是否要重新提出一个多对一的路由请求。  
            当集中器接收到网络状态命令时表明多对一路由失败,它将把这个指示传送到ZDO层,以下ZDApp.c中的ZDO回调函数被调用:  
           Void  ZDO_ManytoOneFailureIndicationCB()  
         系统默认为这个函数将重新进行多对一路由发现用来修复路由。你可以修改这个函数,如果你想使用更复杂的处理过程而不是系统默认的。

路由设置一览表 
转  ZigBee Z-Stack2007 开发者手册 第五章 路由 - 易拉罐bb - 易拉罐的博客
 
  评论这张
 
阅读(165)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017