设备类型
1.协调器 具备协调功能、路由功能
2.路由器 具备路由功能
3.终端设备 空
Note.一个网络当中,只有且必须有一个协调器,可以有多个路由器,也可以有多个终端设备
协调器负责启动整个网络。它也是网络的第一个设备。协调器选择一个信道(2.4G一共有16个信道)和一个网络
ID(也称之为 PAN ID,即 Personal Area Network ID:个人局域网ID号),随后启动整个网络。协调器也可以用来协
助建立网络中安全层和应用层的绑定(bindings)。协调器功能很强大。
注意,协调器的角色主要涉及网络的启动和配臵。一旦这些都完成后,协调器的工作就像
一个路由器(或者消失 go away)。由于 ZigBee 网络本身的分布特性,因此接下来整个网络的操
作就不在依赖协调器是否存在。
路由器的功能主要是:允许其他设备加入网络,多跳路由(信号中转和中继)和协助它自己的由电池供电的终
端设备的通讯。
通常,路由器希望是一直处于活动状态,因此它必须使用主电源供电。但是当使用树状网
络拓扑结构时,允许路由间隔一定的周期操作一次,这样就可以使用电池给其供电。
终端设备没有特定的维持网络结构的责任,它可以睡眠或者唤醒,因此它可以可以是一个
电池供电设备。通常,终端设备对存储空间(特别是 RAM 的需要)比较小。
协议栈规范( Stack Profile)
协议栈规范由 ZigBee 联盟定义指定。在同一个网络中的设备必须符合同一个协议栈规范
(同一个网络中所有设备的协议栈规范必须一致) 。
ZigBee 联盟为 ZigBee 协议栈 2007 定义了 2 个规范:ZigBee 和 ZigBee PRO。所有的设备只
要遵循该规范,即使在不同厂商买的不同设备同样可以形成网络。
如果应用开发者改变了规范, 那么他的产品将不能与遵循 ZigBee 联盟定义规范的产品组成
网络,也就是说该开发者开发的产品具有特殊性,我们称之为“关闭的网络” ,也就是说它的
设备只有在自己的产品中使用,不能与其他产品通信。更改后的规范可以称之为“特定网络”
规范。
协议栈规范的 ID 号可以通过查询设备发送的 beacon(信标) 帧获得。在设备加入网络之前,首先
需要确认协议栈规范的 ID。 “特定网络” 规范 ID 号为 0; ZigBee 协议栈规范的 ID 号为 1; ZigBee
PRO 协议栈规范的 ID 号为 2。协议栈规范的 ID(STACK_PROFILE_ID)在 nwk_globals.h 中
拓扑结构
ZigBee 网络支持星状、 树状和网状三种网络拓扑结构, 如下图所示, 分别依次是星状网络,
树(簇)状网络和网状网络
星状网络由一个 PAN 协调器和多个终端设备组成,只存在 PAN 协调器与终端的通讯,
终端设备间的通讯都需通过 PAN 协调器的转发。
树状网络由一个协调器和一个或多个星状结构连接而成,设备除了能与自己的父节点或子
节点进行点对点直接通讯外,其他只能通过树状路由完成消息传输。
网状网络是树状网络基础上实现的,与树状网络不同的是,它允许网络中所有具有路由功
能的节点直接互连,由路由器中的路由表实现消息的网状路由。该拓扑的优点是减少了消息延
时,增强了可靠性,缺点是需要更多的存储空间开销。
在 Z-Stack 中网络拓扑结构定义如下:
#define NWK_MODE_STAR 0 #define NWK_MODE_TREE 1 #define NWK_MODE_MESH 2
#if ( STACK_PROFILE_ID == ZIGBEEPRO_PROFILE ) #define NWK_MODE NWK_MODE_MESH #elif ( STACK_PROFILE_ID == HOME_CONTROLS ) #define NWK_MODE NWK_MODE_MESH #elif ( STACK_PROFILE_ID == GENERIC_STAR ) #define NWK_MODE NWK_MODE_STAR #elif ( STACK_PROFILE_ID == NETWORK_SPECIFIC ) #define NWK_MODE NWK_MODE_MESH #endif
信标与非信标模式
ZigBee 网络的工作模式可以分为信标(Beaeon)和非信标(Non-beaeon)两种模式。信标
模式实现了网络中所有设备的同步工作和同步休眠,以达到最大限度的功耗节省,而非信标模
式则只允许终端设备进行周期性休眠,协调器 和所有路由器 设备必须长期处于工作状态。
信标模式下,协调器负责以一定的间隔时间(一般在 15ms-4mins 之间)向网络广播信标
帧,两个信标帧发送间隔之间有 16 个相同的时槽,这些时槽分为网络休眠区和网络活动区两
个部分,消息只能在网络活动区的各时槽内发送。
非信标模式下, ZigBee 标准采用父节点为终端设备子节点缓存数据, 终端设备主动向其父
节点提取数据的机制,实现终端设备的周期性(周期可设臵)休眠。网络中所有父节点需为自
己的终端设备子节点缓存数据帧,所有终端设备子节点的大多数时间都处于休眠模式,周期性
的醒来与父节点握手以确认自己仍处于网络中,其从休眠模式转入数据传输模式一般只需要
15ms。(一般采用非信标模式)
地址
地址定义
ZigBee 设备有两种类型的地址。一种是 64 位 IEEE 地址(全球唯一,制造商生产时就分配好),即 MAC 地址,另一种是 16 位
网络地址(协调器在建立网络时,对其他设备进行网络地址分配)。
网络 地址 分配
ZigBee2006 和 ZigBee 2007 使用分布式寻址方案来分配网络地址。ZigBee 2007 PRO 使用的随机地址分配机制。
分布式寻址方案保证在整个网络中所有分配的地址是唯一的。这一点是必须的,因为这样才能保证一个特定的数据包能够发
给它指定的设备,而不出现混乱。同时,这个寻址算法本身的分布特性保证设备只能与他的父
辈设备通讯来接受一个网络地址。不需要整个网络范围内通讯的地址分配,这有助于网络的可
测量性。
ZigBee 2007 PRO 使用的随机地址分配机制,对新加入的节点使用随机地址分配,为保证
网络内地址分配不重复,使用其余的随机地址再进行分配。当一个节点加入时,将接收到父节
点的随机分配地址,然后产生“设备声明” (包含分配到的网络地址和 IEEE 地址)发送至网
络中的其余节点。如果另一个节点有着同样的网络地址,则通过路由器广播“网络状态-地址
冲突”至网络中的所有节点。所有发生网络地址冲突的节点更改自己的网络地址,然后再发起
“设备声明”检测新的网络地址是否冲突。
寻址
为了向一个在 ZigBee 网络中的设备发送数据,应用程序通常使用 AF_DataRequest()函数。
数据包将要发送给一个 afAddrType_t(在 ZComDef.h 中定义)类型的目标设备。
typedef struct { union//联合体 { uint16 shortAddr;//短地址 ZLongAddr_t extAddr;//长地址 } addr; afAddrMode_t addrMode;//地址类型 byte endPoint;//端点值 uint16 panId; // used for the INTER_PAN feature//个域网ID号 } afAddrType_t;
注意,除了网路地址之外,还要指定地址模式参数。目的地址模式可以设臵为以下几个值:
typedef enum { afAddrNotPresent = AddrNotPresent, afAddr16Bit = Addr16Bit,//16位短地址 afAddr64Bit = Addr64Bit,//64位长地址 afAddrGroup = AddrGroup,//组播地址 afAddrBroadcast = AddrBroadcast//广播地址 } afAddrMode_t;
因为在 Zigbee 中,数据包可以单点传送(unicast)(从一个设备发到另一个设备),多点传送(multicast)
(发到group里的所有成员)或者广播传送(发给所有的成员),所以
必须有地址模式参数。一个单点传送数据包只发送给一个设备,多点传送数据包则要传送给一
组设备,而广播数据包则要发送给整个网络的所有节点。这个将在下面详细解释。
单点传送(Unicast)
Uicast 是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。将
afAddrMode 设臵为 Addr16Bit 并且在数据包中携带目标设备地址。
间接传送(Indirect)
当应用程序不知道数据包的目标设备在哪里的时候使用的模式。将模式设臵为
AddrNotPresent并且目标地址没有指定。 取代它的是从发送设备的栈的绑定表中查找目标设备。
这种特点称之为源绑定。
当数据向下发送到达栈中,从绑定表中查找并且使用该目标地址。这样,数据包将被处理
成为一个标准的单点传送数据包。如果在绑定表中找到多个设备,则向每个设备都发送一个数
据包的拷贝。
广播传送(broadcast)
当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设臵为
AddrBroadcast。目标地址可以设臵为下面广播地址的一种:
NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设
备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或
者消息超时(NWK_INDIRECT_MSG_TIMEOUT 在 f8wConifg.cfg 中)。
NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所
有在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。
NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包
括协调器。
组寻址(Group Addressing)
当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设臵为
afAddrGroup 并且 addr.shortAddr 设臵为组 ID。
在使用这个功能呢之前,必须在网络中定义组。(参见 Z-stack API 文档中的 aps_AddGroup()函
数)。
注意组可以用来关联间接寻址。 再绑定表中找到的目标地址可能是是单点传送或者是一个组地
址。另外,广播发送可以看做是一个组寻址的特例。
下面的代码是一个设备怎样加入到一个 ID 为 1 的组当中:
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 );//SAMPLEAPP_ENDPOINT:端点号,&group :地址
重要设备地址 (Important Device Ad dr esses)
应用程序可能需要知道它的设备地址和父亲地址。 使用下面的函数获取设备地址(在 ZStack
API 中定义):
NLME_GetShortAddr()——返回本设备的 16 位网络地址
NLME_GetExtAddr()—— 返回本设备的 64 位扩展地址
使用下面的函数获取该设备的父亲设备的地址:
NLME_GetCoordShortAddr()——返回本设备的父亲设备的 16 位网络地址
NLME_GetCoordExtAddr()—— 返回本设备的父亲设备的 64 位扩展地址