ZStack 开发指南Word格式文档下载.docx
《ZStack 开发指南Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ZStack 开发指南Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
![ZStack 开发指南Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/16/ae78a422-0042-4adc-8395-b1a4ee4d54fd/ae78a422-0042-4adc-8395-b1a4ee4d54fd1.gif)
由于ZigBee网络本身的分布特性,因此接下来整个网络的操作就不在依赖协调器是否存在。
2.1.2Router(路由器)
路由器的功能主要是:
允许其他设备加入网络,多跳路由和协助它自己的由电池供电的儿子终端设备的通讯。
通常,路由器希望是一直处于活动状态,因此它必须使用主电源供电。
但是当使用树群这种网络模式时,允许路由间隔一定的周期操作一次,这样就可以使用电池给其供电。
2.1.3End-Device(终端设备)
终端设备没有特定的维持网络结构的责任,它可以睡眠或者唤醒,因此它可以可以是一个电池供电设备。
通常,终端设备对存储空间(特别是RAM的需要)比较小。
注意:
在Z-Stack1.4.1中一个设备的类型通常在编译的时候通过编译选项(ZDO_COORDINATOR和RTR_NWK)确定。
所有的应用例子都提供独立的项目文件来编译每一种设备类型。
2.2栈配置(StackProfile)
栈参数的集合需要被配置为一定的值,连同这些值在一起被称之为栈配置。
ZigBee联盟定义了这些由栈配置组成的栈参数。
网络中的所有设备必须遵循同样的栈配置。
为了促进互用性这个目标,ZigBee联盟为ZigBee2006规范定义了栈配置。
所有遵循此栈配置的设备可以在其他开发商开发的遵循同样栈配置的网络中。
3.寻址(Addressing)
3.1地址类型(Addresstypes)
ZigBee设备有两种类型的地址。
一种是64位IEEE地址,即MAC地址,另一种是16位网络地址。
64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。
它通常由制造商或者被安装时设置。
这些地址由IEEE来维护和分配。
16为网络地址是当设备加入网络后分配的。
它在网络中是唯一的,用来在网络中鉴别设备和发送数据。
3.2网络地址分配(Networkaddressassignment)
ZigBee使用分布式寻址方案来分配网络地址。
这个方案保证在整个网络中所有分配的地址是唯一的。
这一点是必须的,因为这样才能保证一个特定的数据包能够发给它指定的设备,而不出现混乱。
同时,这个寻址算法本身的分布特性保证设备只能与他的父辈设备通讯来接受一个网络地址。
不需要整个网络范围内通讯的地址分配,这有助于网络的可测量性。
在每个路由加入网络之前,寻址方案需要知道和配置一些参数。
这些参数是MAX_DEPTH,MAX_ROUTERS和MAX_CHILDREN。
这些参数是栈配置的一部分,ZigBee2006协议栈已经规定了这些参数的值:
MAX_DEPTH=5,MAX_ROUTERS=6和MAX_CHILDREN=20。
MAX_DEPTH决定了网络的最大深度。
协调器(Coordinator)位于深度0,它的儿子位于深度1,他的儿子的的儿子位于深度2,以此类推。
MAX_DEPTH参数限制了网络在物理上的长度。
MAX_CHILDREN决定了一个路由(Router)或者一个协调器节点可以处理的儿子节点的最大个数。
MAX_ROUTER决定了一个路由(Router)或者一个协调器(Coordinator)节点可以处理的具有路由功能的儿子节点的最大个数。
这个参数是MAX_CHILDREN的一个子集,终端节点使用(MAX_CHILDREN–MAX_ROUTER)剩下的地址空间。
如果开发人员想改变这些值,则需要完成以下几个步骤:
首先,你要保证这些参数新的赋值要合法。
即,整个地址空间不能超过
216,这就限制了参数能够设置的最大值。
可以使用projects\ZStack\tools文件夹下的CSkip.xls文件来确认这些值是否合法。
当在表格中输入了这些数据后,如果你的数据不合法的话就会出现错误信息。
当选择了合法的数据后,开发人员还要保证不再使用标准的栈配置,取而代之的是网络自定义栈配置(例如:
在nwk_globals.h文件中将STACK_PROFILE_ID改为NETWORK_SPECIFIC)。
然后nwk_globals.h文件中的MAX_DEPTH参数将被设置为合适的值。
此外,还必须设置nwk_globals.c文件中的Cskipchldrn数组和CskipRtrs数组。
这些数组的值由MAX_CHILDREN和MAX_ROUTER构成。
3.3Z-Stack寻址(Addressinginz-stack)
为了向一个在ZigBee网络中的设备发送数据,应用程序通常使用AF_DataRequest()函数。
数据包将要发送给一个afAddrType_t(在ZComDef.h中定义)类型的目标设备。
typedefstruct
{
union
uint16shortAddr;
}addr;
afAddrMode_taddrMode;
byteendPoint;
}afAddrType_t;
注意,除了网路地址之外,还要指定地址模式参数。
目的地址模式可以设置为以下几个值:
typedefenum
afAddrNotPresent=AddrNotPresent,
afAddr16Bit=Addr16Bit,
afAddrGroup=AddrGroup,
afAddrBroadcast=AddrBroadcast
}afAddrMode_t;
因为在Zigbee中,数据包可以单点传送(unicast),多点传送(multicast)或者广播传送,所以必须有地址模式参数。
一个单点传送数据包只发送给一个设备,多点传送数据包则要传送给一组设备,而广播数据包则要发送给整个网络的所有节点。
这个将在下面详细解释。
3.3.1单点传送(Unicast)
Uicast是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。
将afAddrMode设置为Addr16Bit并且在数据包中携带目标设备地址。
3.3.2间接传送(Indirect)
当应用程序不知道数据包的目标设备在哪里的时候使用的模式。
将模式设置为AddrNotPresent并且目标地址没有指定。
取代它的是从发送设备的栈的绑定表中查找目标设备。
这种特点称之为源绑定。
当数据向下发送到达栈中,从绑定表中查找并且使用该目标地址。
这样,数据包将被处理成为一个标准的单点传送数据包。
如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。
上一个版本的ZigBee(ZigBee04),有一个选项可以讲绑定表保存在协调器(Coordinator)当中。
发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,然后将数据发送给最终的目标设备。
这个附加的特性叫做协调器绑定(CoordinatorBinding)。
3.3.3广播传送(broadcast)
当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。
地址模式设置为AddrBroadcast。
目标地址可以设置为下面广播地址的一种:
NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。
对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时(NWK_INDIRECT_MSG_TIMEOUT在f8wConifg.cfg中)。
NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。
NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包括协调器。
3.3.4组寻址(GroupAddressing)
当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。
地址模式设置为afAddrGroup并且addr.shortAddr设置为组ID。
在使用这个功能呢之前,必须在网络中定义组。
(参见Z-stackAPI文档中的aps_AddGroup()函数)。
注意组可以用来关联间接寻址。
再绑定表中找到的目标地址可能是是单点传送或者是一个组地址。
另外,广播发送可以看做是一个组寻址的特例。
下面的代码是一个设备怎样加入到一个ID为1的组当中:
aps_Group_tgroup;
//Assignyourselftogroup1
group.ID=0x0001;
group.name[0]=0;
//Thiscouldbeahumanreadablestring
aps_AddGroup(SAMPLEAPP_ENDPOINT,&
group);
3.4重要设备地址(ImportantDeviceAdresses)
应用程序可能需要知道它的设备地址和父亲地址。
使用下面的函数获取设备地址(在ZStackAPI中定义):
●NLME_GetShortAddr()——返回本设备的16位网络地址
●NLME_GetExtAddr()——返回本设备的64位扩展地址
使用下面的函数获取该设备的父亲设备的地址:
●NLME_GetCoordShortAddr()——返回本设备的父亲设备的16位网络地址
●NLME_GetCoordExtAddr()——返回本设备的父亲设备的64位扩展地址
4.绑定(Binding)
绑定是一种两个(或者多个)应用设备之间信息流的控制机制。
在ZigBee2006发布版本中,它被称为资源绑定,所有的设备都必须执行绑定机制。
绑定允许应用程序发送一个数据包而不需要知道目标地址。
APS层从它的绑定表中确定目标地址,然后将数据继续向目标应用或者目标组发送。
注意:
在ZigBee的1.0版本中,绑定表是保存在协调器(Coordinator当中)。
现在所有的绑定记录都保存在发送信息的设备当中。
4.1建立绑定表(BuildingaBindingTable)
有三种方法可以建立一个绑定表:
●ZigbeeDeviceObjectBindRequest——一个启动工具可以告诉设备创建一个绑定记录
●ZigbeeDeviceObjectEndDeviceBindRequest——两个设备可以告诉协调器它们想要建立一个绑定表记录。
协调器来协调并在两个设备中创建绑定表记录。
●DeviceApplication——一个设备上的应用程序建立或者管理一个绑定表
4.1.1ZigBeeDeviceObjectBindingRequest
任何一个设备都可以发送一个ZDO信息给网络中的另一个设备,用来建立绑定表。
称之为援助绑定,它可以为一个发送设备创建一个绑定记