Zigbee有两种地址分配方式:分布式分配机制和随机分配机制。
1.随机分配机制
随机分配机制是指当NIB的nwkAddrAlloc值为0x02 时,地址随机选择。在这种情况下nwkMaxRouter就无意义了。随机地址分配应符合NIST测试中的描述 。当一个设备加入网络使用的是Mac地址,其父设备应选择一个尚未分配过的随机地址。一旦设备已分配一个地址,它没有理由放弃该地址,并应予以保留,除非它收到声明,其地址与另一个设备冲突。此外,设备可能自我指派随机地址,比如利用加入命令帧加入一个网络。
2.分布式分配机制
我们知道,每个zigbee设备应该拥有一个唯一的MAC地址。协调器(coordinator)在建立网络以后使用0x0000做为自己的短地址。在路由器(router)和终端(enddevice)加入网络以后,使用父设备给它分配的16位的短地址来通讯。那么这些短地址是如何分配的呢?
16位的地址意味着可以分配给65536个节点之多,地址的分配取决于整个网络的架构,整个网络的架构由这3个值决定:
1.网络的最大深度(Lm);
2.每个父亲设备拥有的孩子数(Cm);
3.第2条的孩子设备当中有几个是路由器(Rm)。
有了这3个值就可以根据下面的公式来算出某父设备的路由器子设备之间的地址间隔Cskip(d):
上面这个公式是用来计算位于深度d的父亲设备的,它所分配的子路由器之间的短地址间隔。该父亲设备分配的第1个路由器地址=父亲设备地址+1,分配的第2个路由器地址=父亲设备地址+1+Cskip(d),第3个路由器地址=父亲设备地址+1+2×Cskip(d),依次类推。
计算终端地址:
这个公式是来计算A parent这个父亲设备分配的第n个终端设备的地址A n。
来举个简单的例子,假设有一个Zigbee网络,最大深度为3,每个父亲的最大孩子数是5,在孩子当中路由器数量是3,如图所示:
由图可知,协调器的Cskip(d) = (1+5-3-5×3^(3-0-1))/(1-3) = 21,所以协调器的第一个路由器是1,第二个就是22,换算成十六进制就是0x0016。协调器的第1个终端地址 = 0x0000+21×3+1 = 64 = 0x0040、第2个就是0x0041。由此可见所有同一父亲的终端设备的短地址都是连续的。
不难看出一旦Lm、Cm、Rm这3个值确定了,整个网络设备的地址也就确定下来。所以知道了某个设备的短地址就可以计算出它的设备类型和它的父设备地址。