ZigBee2004和ZigBee2007 均有对树型路由的支持.
ZigBee2004采用分布式地址分配策略;ZigBee2007地址分配策略可选,如果选用随机地址分配策略,就不支持树型路由.
当采用分布式地址分配策略时,网络层有一套算法来支持数型路由.
分布式地址分配策略的树型路由原理来原于地址分配算法原理.
当节点发送数据时,如果节点为终端节点,则数据直接发给终端节点的父节点,当接点为ROUTER点时,通过比较目标地址和CSKIP 可以知道是要向上传(传给父节点)还是向下传,传给某一个子节点.COORDINATOR只需要决定传给哪一个子节点.
判断某一个节点是不是自己的下游节点算法是:
如果目标地址比该地址大,切目地址小于该节点上一级CSKIP与该节点地址的和,
C语言实现代码为:
PRIVATE bool_t IsMyDescendant( uint16 parentaddr,
uint16 childaddr,uint8 parentdepth )
{
if (parentdepth == 0)
return TRUE;
else
{
if ((parentaddr < childaddr) &&
(childaddr < (parentaddr + get_Cskip( parentdepth-1 ))))
return TRUE;
else
return FALSE;
}
}
树型路由实现算法 C语言代码为:
PRIVATE bool_t JTreeRouting(uint16 dstaddr, uint16 *dstnexthop)
{
NWK_NeighborTable_s *ChildPtr;
if(dstaddr == 0xffff)
{
*dstnexthop = 0xffff;
return TRUE;
}
#ifdef I_AM_ENDDEVICE
*dstnexthop = psPib->u16CoordShortAddr;
return TRUE;
#else //router or coor
// Find which of my child nodes is the parent of the destination.
#ifndef I_AM_COORDINATOR
if (!IsMyDescendant( gsNWK_Para.gsNIB.u16nwkNetworkAddress,
dstaddr, gsNWK_Para.gNwkDepth ))
{
*dstnexthop = psPib->u16CoordShortAddr;
return TRUE;
}
#endif
ChildPtr = gsNWK_Para.neighbortablehead;
while(ChildPtr != NULL)
{
if(ChildPtr->u8Relationship == NEIGHBOR_CHILD )
{
if (((ChildPtr->u16Addr == dstaddr)
||IsMyDescendant(ChildPtr->u16Addr,dstaddr,
gsNWK_Para.gNwkDepth+1)))
{
*dstnexthop = ChildPtr->u16Addr;
return TRUE;
}
}
ChildPtr = (NWK_NeighborTable_s *)ChildPtr->next;
}//end while
return FALSE;
#endif
} |