zigbee协议栈学习(二)

时间:2021-06-29 00:03:46
协议栈规范的 ID号可以通过查询设备发送的 beacon 帧获得。在设备加入网络之前,首先
需要确认协议栈规范的 ID。“特定网络”规范 ID号为0; ZigBee协议栈规范的 ID号为1; ZigBee
RO 协议栈规范的 ID 号为 2。协议栈规范的 ID(STACK_PROFILE_ID)在 nwk_globals.h 中


// Controls the operational mode of network
#define NWK_MODE_STAR         0
#define NWK_MODE_TREE         1
#define NWK_MODE_MESH         2


// Controls various stack parameter settings  id
#define NETWORK_SPECIFIC      0
#define HOME_CONTROLS         1
#define ZIGBEEPRO_PROFILE     2
#define GENERIC_STAR          3
#define GENERIC_TREE          4


地址定义:
ZigBee 设备有两种类型的地址。一种是 64 位 IEEE 地址,即 MAC 地址,另一种是 16 位网络地址。 
16 位网络地址是当设备加入网络后分配的。它在网络中是唯一的,用来在网络中鉴别设备
和发送数据。其中,协调器的网络地址为 0x00 
#define NWK_PAN_COORD_ADDR 0x0000 
地址的的分配:ZigBee 2007 PRO  使用的随机地址分配机制,对新加入的节点使用随机地址分配
当一个节点加入时,将接收到父节点的随机分配地址,然后产生“设备声明”(包含分配到的网络地
址和 IEEE 地址)发送至网络中的其余节点。“设备声明”检测新的网络地址是否冲突。


在每个路由加入网络之前,寻址方案需要知道和配臵一些参数。这些参数是 MAX_DEPTH
最大网络深度) 、MAX_ROUTERS(最多路由数)和 MAX_CHILDREN(最多子节点数) 。
这些参数是栈配臵的一部分,ZigBee2007 协议栈已经规定了这些参数的值:


MAX_DEPTH 决定了网络的最大深度。协调器(Coordinator)位于深度 0,它的儿子位于深
度1,他的儿子的的儿子位于深度 2,以此类推。MAX_DEPTH 参数限制了网络在物理上的长度。    


MAX_CHILDREN 决定了一个路由(Router)或者一个协调器节点可以处理的儿子节点的最大个数。 


MAX_ROUTER 决定了一个路由(Router)或者一个协调器(Coordinator)节点可以处理的具有
路由功能的儿子节点的最大个数。这个参数是 MAX_CHILDREN 的一个子集,终端节点使用
(MAX_CHILDREN – MAX_ROUTER)剩下的地址空间。 


还必须设臵 nwk_globals.c 文件中的 Cskipchldrn 数组和 CskipRtrs 数组这些数组的
值由MAX_CHILDREN 和MAX_ROUTER 构成


为了向一个在 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 
} afAddrType_t; 


注意,除了网路地址之外,还要指定地址模式参数。目的地址模式可以设臵为以下几个值:
typedef enum 

   afAddrNotPresent = AddrNotPresent, 
   afAddr16Bit            = Addr16Bit, 
   afAddr64Bit            = Addr64Bit, 
   afAddrGroup            = AddrGroup, 
   afAddrBroadcast    = AddrBroadcast 
} afAddrMode_t; 


发送方式有数据包可以单点传送(unicast),多点传送(multicast)或者广播传送
一单点传送(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)——数据包发送给所有的路由器,包
括协调器。