ZigBee
有两种地址分配方式:分布式分配机制和随机分配机制。
随机分配机制
随机分配机制是指当NIB
的nwkAddrAlloc
值为0x02
时,地址随机选择。在这种情况下,nwkMaxRouter
就无意义了。随机地址分配应符合NIST
测试中的描述。当一个设备加入网络使用的是MAC
地址,其父设备应选择一个尚未分配过的随机地址。一旦设备已分配一个地址,它没有理由放弃该地址,并应予以保留,除非它收到声明,其地址与另一个设备冲突。此外,设备可能自我指派随机地址,比如利用加入命令帧加入一个网络。
分布式分配机制
每个ZigBee
设备应该拥有一个唯一的MAC
地址。协调器coordinator
在建立网络以后,使用0x0000
做为自己的短地址。在路由器router
和终端enddevice
加入网络以后,使用父设备给它分配的16
位的短地址来通讯。那么这些短地址是如何分配的呢?16
位的地址意味着可以分配给65536
个节点之多,地址的分配取决于整个网络的架构,整个网络的架构由这3
个值决定:
- 网络的最大深度
Lm
,对应于ZigBee
协议栈的MAX_DEPTH
参数。 - 每个父亲设备拥有的孩子数
Cm
,对应于ZigBee
协议栈的MAX_CHILDREN
参数。 - 每个父亲设备拥有的孩子节点中路由器的最大数目
Rm
,对应于ZigBee
协议栈的MAX_ROUTERS
参数。
有了这3
个值就可以根据下面的公式来算出某父设备的路由器子设备之间的地址间隔
C
s
k
i
p
(
d
)
Cskip(d)
Cskip(d):
C k i p ( d ) = { 1 + C m ( L m − d − 1 ) , i f R m = 1 1 + C m − R m − C m ∗ R m L m − d − 1 1 − R m , o t h e r w i s e Ckip(d) = \left\{\begin{matrix} 1 + Cm(Lm-d-1), \; if Rm = 1 \\ \cfrac{1 + Cm - Rm -Cm*Rm^{Lm -d -1}}{1 - Rm}, \; otherwise \end{matrix}\right. Ckip(d)=⎩⎨⎧1+Cm(Lm−d−1),ifRm=11−Rm1+Cm−Rm−Cm∗RmLm−d−1,otherwise
上面这个公式是用来计算位于深度d
的父亲设备的,它所分配的子路由器之间的短地址间隔。该父亲设备分配的第1
个路由器地址等于父亲设备地址 + 1
,分配的第2
个路由器地址等于父亲设备地址 + 1 + Cskip(d)
,第3
个路由器地址等于父亲设备地址 + 1 + 2 * Cskip(d)
,依次类推。计算终端地址的公式如下:
A n = A p a r e n t + C s k i p ( d ) ∗ R m + n A_n = A_{parent} + Cskip(d) * Rm + n An=Aparent+Cskip(d)∗Rm+n
这个公式是来计算Aparent
这个父亲设备分配的第n
个终端设备的地址An
。来举个简单的例子,假设有一个ZigBee
网络,最大深度为3
,每个父亲的最大孩子数是5
,在孩子当中路由器数量是3
:
由图可知,协调器的
C
s
k
i
p
(
d
)
=
1
+
5
−
3
−
5
∗
3
3
−
0
−
1
1
−
3
=
21
Cskip(d) = \cfrac{1 + 5 - 3 - 5 \ast 3^{3 - 0 - 1}}{1 - 3} = 21
Cskip(d)=1−31+5−3−5∗33−0−1=21,所以协调器的第一个路由器是1
,第二个就是22
,换算成十六进制就是0x0016
。协调器的第1
个终端地址等于
0
x
0000
+
21
∗
3
+
1
=
64
=
0
x
0040
0x0000 + 21 \ast 3 + 1 = 64 = 0x0040
0x0000+21∗3+1=64=0x0040,第2
个就是0x0041
。由此可见所有同一父亲的终端设备的短地址都是连续的。不难看出一旦Lm
、Cm
、Rm
这3
个值确定了,整个网络设备的地址也就确定下来。所以知道了某个设备的短地址,就可以计算出它的设备类型和它的父设备地址。