
2. ZigBee
2.1 设备类型(Device Types)
在 网络中存在三种逻辑设备类型:协调器,路由
器和 终端设备。 网络由一个 以及多个 和
多个 组成。
上图是一个简单的 网络示意图。其中黑色节点为 ,红色
节点为 ,白色节点为 。
2.1.1 Coordinator(协调器)
协调器负责启动整个网络。它也是网络的第一个设备。协调器选择一个
信道和一个网络 也称之为 ,即 ,随后启
动整个网络。
协调器也可以用来协助建立网络中安全层和应用层的绑定 。
注意,协调器的角色主要涉及网络的启动和配置。一旦这些都完成后,
协调器的工作就像一个路由器或者消失 !。由于 网络本身的
分布特性,因此接下来整个网络的操作就不在依赖协调器是否存在。

2.1.2 Router(路由器)
路由器的功能主要是:允许其他设备加入网络,多跳路由和协助它自己
的由电池供电的儿子终端设备的通讯。
通常,路由器希望是一直处于活动状态,因此它必须使用主电源供电。
但是当使用树群这种网络模式时,允许路由间隔一定的周期操作一次,这
样就可以使用电池给其供电。
2.1.3 End-Device(终端设备)
终端设备没有特定的维持网络结构的责任,它可以睡眠或者唤醒,因此
它可以可以是一个电池供电设备。
通常,终端设备对存储空间特别是 " 的需要比较小。
注意:在
Z-Stack 1.4.1
中一个设备的类型通常在编译的时候通过编译选项
(ZDO_COORDINATOR
和
RTR_NWK)
确定。所有的应用例子都提供独立的项目文件
来编译每一种设备类型。
2.2 栈配置(Stack Profile)
栈参数的集合需要被配置为一定的值,连同这些值在一起被称之为栈配置。
联盟定义了这些由栈配置组成的栈参数。
网络中的所有设备必须遵循同样的栈配置。
为了促进互用性这个目标, 联盟为 #$$% 规范定义了栈配置。
所有遵循此栈配置的设备可以在其他开发商开发的遵循同样栈配置的网络中。
3. 寻址(Addressing)
3.1 地址类型(Address types)
设备有两种类型的地址。一种是 %& 位 地址,即 " 地址,另一
种是 '% 位网络地址。
%& 位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通
常由制造商或者被安装时设置。这些地址由 来维护和分配。

'% 为网络地址是当设备加入网络后分配的。它在网络中是唯一的,用来在
网络中鉴别设备和发送数据。
3.2 网络地址分配(Network address assignment)
使用分布式寻址方案来分配网络地址。这个方案保证在整个网络中
所有分配的地址是唯一的。这一点是必须的,因为这样才能保证一个特定的数
据包能够发给它指定的设备,而不出现混乱。同时,这个寻址算法本身的分布
特性保证设备只能与他的父辈设备通讯来接受一个网络地址。不需要整个网络
范围内通讯的地址分配,这有助于网络的可测量性。
在每个路由加入网络之前,寻址方案需要知道和配置一些参数。这些参数
是 "()*,"(+,)- 和 "(*.。这些参数是栈配置的一部分,
#$$% 协议栈已经规定了这些参数的值:"()*/0,"(+,)-/
% 和 "(*./#$。
"()* 决定了网络的最大深度。协调器位于深度 $,它的
儿子位于深度 ',他的儿子的的儿子位于深度 #,以此类推。"()* 参数
限制了网络在物理上的长度。
"(*. 决定了一个路由或者一个协调器节点可以处理的儿
子节点的最大个数。
"(+,) 决定了一个路由或者一个协调器节点可以
处理的具有路由功能的儿子节点的最大个数。这个参数是 "(*. 的一
个子集,终端节点使用"(*.1"(+,)剩下的地址空间。
如果开发人员想改变这些值,则需要完成以下几个步骤:
首先,你要保证这些参数新的赋值要合法。即,整个地址空间不能超过
#'%
,这就限制了参数能够设置的最大值。可以使用 234-4 文件夹
下的 -256 文件来确认这些值是否合法。当在表格中输入了这些数据后,如
果你的数据不合法的话就会出现错误信息。
当选择了合法的数据后,开发人员还要保证不再使用标准的栈配置,取而
代之的是网络自定义栈配置例如:在 57 文件中将 -)8+9.
改为 ):+8-9。然后 57 文件中的 "()* 参数将被设
置为合适的值。
此外,还必须设置 5 文件中的 27 数组和 2 数组。
这些数组的值由 "(*. 和 "(+,) 构成。
3.3 Z-Stack 寻址(Addressing in z-stack)
为 了 向 一 个 在 网 络 中 的 设 备 发 送 数 据 , 应 用 程 序 通 常 使 用
9;函数。数据包将要发送给一个 <)!2在 =<57 中定
义类型的目标设备。
typedef struct

{
union
{
uint16 shortAddr;
} addr;
afAddrMode_t addrMode;
byte endPoint;
} afAddrType_t;
注意,除了网路地址之外,还要指定地址模式参数。目的地址模式可以设置为
以下几个值:
typedef enum
{
afAddrNotPresent = AddrNotPresent,
afAddr16Bit = Addr16Bit,
afAddrGroup = AddrGroup,
afAddrBroadcast = AddrBroadcast
} afAddrMode_t;
因为在 中,数据包可以单点传送,多点传送=>或者广
播传送,所以必须有地址模式参数。一个单点传送数据包只发送给一个设备,
多点传送数据包则要传送给一组设备,而广播数据包则要发送给整个网络的所
有节点。这个将在下面详细解释。
3.3.1 单点传送(Unicast)
, 是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设
备。将 <" 设置为 '% 并且在数据包中携带目标设备地址。
3.3.2 间接传送(Indirect)
当应用程序不知道数据包的目标设备在哪里的时候使用的模式。将模式设
置为 并且目标地址没有指定。取代它的是从发送设备的栈的绑
定表中查找目标设备。这种特点称之为源绑定。
当数据向下发送到达栈中,从绑定表中查找并且使用该目标地址。这样,
数据包将被处理成为一个标准的单点传送数据包。如果在绑定表中找到多个设
备,则向每个设备都发送一个数据包的拷贝。
上一个版本的 $&,有一个选项可以讲绑定表保存在协调器
当中。发送设备将数据包发送给协调器,协调器查找它栈中的绑定
表,然后将数据发送给最终的目标设备。这个附加的特性叫做协调器绑定
。

3.3.3 广播传送(broadcast)
当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地
址模式设置为 。目标地址可以设置为下面广播地址的一种:
:8+-)-*+)?..$69999@@数据包将被传送到网络上
的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父
亲 节 点 直 到 查 询 到 它 , 或 者 消 息 超 时 :8)"-A)"+,) 在
<B<5< 中。
:8+-)-*+)?(+$6999@@ 数据包将被传送到网
络上的所有在空闲时打开接收的设备(+:*.,也就是说,除了睡眠中
的所有设备。
:8+-)-*+)?$6999@@数据包发送给所有的路
由器,包括协调器。
3.3.4 组寻址(Group Addressing)
当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址
模式设置为 <A2 并且 57 设置为组 。
在使用这个功能呢之前,必须在网络中定义组。参见 文档中的
2A2函数。
注意组可以用来关联间接寻址。再绑定表中找到的目标地址可能是是单点
传送或者是一个组地址。另外,广播发送可以看做是一个组寻址的特例。
下面的代码是一个设备怎样加入到一个 为 ' 的组当中:
aps_Group_t group;
// Assign yourself to group 1
group.ID = 0x0001;
group.name[0] = 0; // This could be a human readable string
aps_AddGroup( SAMPLEAPP_ENDPOINT, &group );
3.4 重要设备地址(Important Device Adresses)
应用程序可能需要知道它的设备地址和父亲地址。使用下面的函数获取设
备地址在 - 中定义:
."A-7@@返回本设备的 '% 位网络地址
."A6@@返回本设备的 %& 位扩展地址
使用下面的函数获取该设备的父亲设备的地址:
."A-7@@返回本设备的父亲设备的 '% 位网络
地址
."A6@@返回本设备的父亲设备的 %& 位扩展地