您的位置:首页 > 其它

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

2011-08-18 15:31 260 查看
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地址,然后分配给这个节点,具体的实现代码就更为复杂了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: