原创 zigbee路由原理-树型

2009-9-1 07:41 2284 4 4 分类: MCU/ 嵌入式

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


}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条