zigbee树形路由中分布式地址分配策略浅析

     ZIGBEE 网络层的功能主要包括组建网络,加入网络,离开网络,路由建立,数据传输等;树形网络中,每一个全功能设备都可以成为父节点,精简功能设备只能作为子节点。树形网络常采用树形路由机制。树形路由机制包括地址分配机制和树路由算法,树路由算法原理来源于分布式地址分配策略。

     以下解析分布式地址分配策略:
     在使用分布式地址分配的网络中,当协调器Coordinator建立一个新的网络,它将给自己分配网络地址0×0,网络深度Depth0=0。网络深度表示仅仅采用父子关系的网络中,一个传送帧传送到协调器所传递的最小跳数,协调器自身深度为0,而它的子设备深度为1。如果节点(i)想要加入网络,并且与节点(k)连接,那么节点(k)将称为节点(i)的父节点。根据自身的地址A(k)和网络深度Depth(k),节点(k)将为节点(i)分配网络地址A(i)和网络深度Depthi=Depthk+1。

     网络地址的分配与三个参数有关:参数nwkMaxChildren(Cm)表示路由器或协调器在网络中允许拥有子设备数量的最大值。参数nwkMaxRouters(Rm)表示子节点中路由器的最大个数,而剩下的设备数为终端设备数。参数nwkMaxDepth (Lm)表示网络的最大深度。根据下式和这三个参数可以算出在每一级(也就是每个深度的)情况下,兄弟(同级)节点之间的地址的取值间隔(Cskip)。

    其中d为网络深度(depth),可以取值为0~Lm-1,但是在这里要注意网络深度不从协调器开始计算!

    举个简单的实例:

    比如一个MAXCHILDREN = 4,MAXROUTER = 2,MAXDEPTH = 2的网络,CSKIP 布局为:
    深度为0的设备的CSKIP(0) 是: 5
    深度为1的设备的CSKIP (1)是: 1

    于是可以计算该网络的地址分配表如下:

COORINATOR 0X0

     ROUTER1 : 0X1

                          ROUTER11 : 0X2
                          ROUTER12 : 0X3
                          END13 : 0X4
                          END14 : 0X5

     ROUTER2 : 0X6

                          ROUTER21 : 0X7
                          ROUTER22 : 0X8
                          END23 : 0X9
                          END24 : 0Xa

    END1: 0Xb

    END2: 0Xc

其具体的地址分配公式如下:
若新加入的节点没有路由能力,既不能携带子节点,那么其地址计算公式如:

Ai = Ak + Cskip(d)*Rm + n 其中1≤n≤(Cm-Rm)

若新加入的节点有路由能力,即能够携带子节点,那么其地址计算公式如:
Ai = Ak + 1+ Cskip(d)·(n-1)

计算Cskip的算法代码如下:

int AddrParse::GetCskip(int id)
{
       int rel;

       if(M_MAXROUTER<1 || M_MAXDEPTH<1||M_MAXCHILDREN<1)//if wrong para
             return -1;

        if(id<0||id>M_MAXDEPTH)
             return -2;

        if(M_MAXROUTER ==1)//if 1 the ari is esay
        {
             rel = 1+M_MAXCHILDREN*(M_MAXDEPTH-id-1);
        }

        else if(M_MAXROUTER>1)//
        {
             int ml_increase=M_MAXDEPTH-id-1;
             int ml_temp = 1;

             if(ml_increase == -1)
             {
                  rel=(1+ M_MAXCHILDREN-M_MAXROUTER-M_MAXCHILDREN/M_MAXROUTER)/(1-M_MAXROUTER);
             }
             else if(ml_increase>-1)
             {
                 for(;ml_increase>0;ml_increase--)
                 {
                      ml_temp=M_MAXROUTER*ml_temp;
                 }
                 rel = (1+ M_MAXCHILDREN-M_MAXROUTER-M_MAXCHILDREN*ml_temp)/(1-M_MAXROUTER);
             }
        }
          if(rel>-1)
              return rel;
          else return 0;
}


但是要注意的是:输入参数id为网络深度,取值为1~Depth,而对于公式的计算却是按照0~Depth-1。实际若用到Zigbee的树形路由必须写这个函数,用来计算加入节点的ip地址,然后分配给这个节点,具体的实现代码就更为复杂了!


你可能感兴趣的:(ZigBee)