开始学习ZIGBEE了,使用博客记录一下自己的学习过程!因为通过从网上看的一些资料加自己的做的一些项目的训练。所以这里总结的知识点是我认为比较重要的一些知识点。
知识点:频带通道、设备类型、Zigbee协议规范号、拓扑结构、信标与非信标模式、地址的定义(64位与16位)、寻址(发送数据用)、重要地址获取、ZigBee术语、绑定操作。
选择一个PANID和频道组建网络。ZDAPP_CONFIG_PAN_ID是PANID号,DEFAULT_CHANLIST是默认的频道列表。这两个参数好像是封装起来的它们都在f8wConfig.cfg文件中进行了配置。
频带通道
在2450MHz频带内定义了16个通道;在915MHz频带内定义了10个通道;在868MHz频带内定义了1个通道。
程序中定义声明为:
#defineMAX_CHANNELS_868MHZ 0x00000001
#defineMAX_CHANNELS_915MHZ 0x000007FE
#if !defined (MAX_CHANNELS_24GHZ )
#define MAX_CHANNELS_24GHZ 0x07FFF800
#endif
程序的定义,不同的通道用不同的bit来定义,868MHz的通道用bit0定义,915MHz的通道用bit1-bit10来定义,2.4GHz的通道用bit11-bit26来定义。
ZIGBEE简介
ZigBee协议栈建立在IEEE802.154的PHY层和MAC子层规范之上。它实现了网络层(networklayer,NWK)和应用层(applicationlayer,APL)。在应用层内提供了应用支持子层(applicationsupportsub—layer,APS)和ZigBee设备对象(ZigBeeDeviceObject,ZDO)。应用框架中则加入了用户自定义的应用对象
ZigBee的体系结构由称为层的各模块组成。每一层为其上层提供特定的服务:即由数据服务实体提供数据传输服务;管理实体提供所有的其他管理服务。每个服务实体通过相应的服务接入点(SAP)为其上层提供一个接口,每个服务接入点通过服务原语来完成所对应的功能。
ZigBee协议栈的核心部分在网络层。网络层主要实现节点加入或离开网络、接收或抛弃其他节点、路由查找及传送数据等功能。
应用层(APL)ZigBee应用层框架包括应用支持层(APS)、ZigBee设备对象(ZDO)和制造商所
应用支持层的功能包括:维持绑定表、在绑定的设备之间传送消息。ZigBee设备对象的功能包括:定义设备在网络中的角色(如ZigBee协调器和终端设备),发起和响应绑定请求,在网络设备之间建立安全机制。ZigBee设备对象还负责发现网络中的设备,并且决定向他们提供何种应用服务。ZigBee应用层除了提供一些必要函数以及为网络层提供合适的服务接口外,一个重要的功能是应用者可在这层定义自己的应用对象
设备类型
在ZigBee网络中存在三种逻辑设备类型:Coordinator(协调器),Router(路由器)和End-Device(终端设备)。ZigBee网络由一个Coordinator以及多个Router和多个End_Device组成
协调器负责启动整个网络。它也是网络的第一个设备。协调器选择一个信道和一个网络ID(也称之为PANID,即PersonalAreaNetworkID),随后启动整个网络。协调器也可以用来协助建立网络中安全层和应用层的绑定(bindings)。协调器的角色主要涉及网络的启动和配臵。一旦这些都完成后,协调器的工作就像一个路由器(或者消失goaway)。由于ZigBee网络本身的分布特性,因此接下来整个网络的操作就不在依赖协调器是否存在,因为ZigBee是分布式网络。
路由器的功能主要是:允许其他设备加入网络,多跳路由和协助它自己的由电池供电的终端设备的通讯。 通常,路由器希望是一直处于活动状态,因此它必须使用主电源供电。但是当使用树状网 络拓扑结构时,允许路由间隔一定的周期操作一次,这样就可以使用电池给其供电。
终端设备没有特定的维持网络结构的责任,它可以睡眠或者唤醒,因此它可以可以是一个电池供电设备。通常,终端设备对存储空间(特别是 RAM 的需要)比较小。
ZigBee协议规范号
ZigBee联盟为ZigBee协议栈2007定义了2个规范:ZigBee和ZigBeePRO。所有的设备只要遵循该规范,即使在不同厂商买的不同设备同样可以形成网络(同一个网络中所有设备的协议栈规范必须一致)。如果应用开发者改变了规范,那么他的产品将不能与遵循ZigBee联盟定义规范的产品组成网络,也就是说该开发者开发的产品具有特殊性,我们称之为“关闭的网络”,也就是说它的设备只有在自己的产品中使用,不能与其他产品通信。更改后的规范可以称之为“特定网络”规范。
协议栈规范的ID号可以通过查询设备发送的beacon帧获得。在设备加入网络之前,首先需要确认协议栈规范的ID。“特定网络”规范ID号为0;ZigBee协议栈规范的ID号为1;ZigBeePRO协议栈规范的ID号为2。
协议栈规范的ID(STACK_PROFILE_ID)在nwk_globals.h定义:
#define NETWORK_SPECIFIC0
#define HOME_CONTROLS1
#define ZIGBEEPRO_PROFILE2
#define GENERIC_STAR3
#define GENERIC_TREE4
#ifdefined (ZIGBEEPRO)
#define STACK_PROFILE_IDZIGBEEPRO_PROFILE
#else
#define STACK_PROFILE_IDHOME_CONTROLS
#endif
所以说一般情况是如果定义了ZIGBEEPRO则使用的规范为ZigBeePRO,否则使用ZigBee。如果我们想使用自己的网络,即特定网络,则可把上面的STACK_PROFILE_ID直接定义为NETWORK_SPECIFIC
拓扑结构
ZigBee网络支持星状、树状和网状三种网络拓扑结构,它们的介绍(优缺点)分别为
星状网络(star)由一个PAN协调器和多个终端设备组成,只存在PAN协调器与终端的通讯,终端设备间的通讯都需通过PAN协调器的转发。
树状网络(tree)由一个协调器和一个或多个星状结构连接而成,设备除了能与自己的父节点或子节点进行点对点直接通讯外,其他只能通过树状路由完成消息传输。
网状网络(mesh)是树状网络基础上实现的,与树状网络不同的是,它允许网络中所有具有路由功能的节点直接互连,由路由器中的路由表实现消息的网状路由。该拓扑的优点是减少了消息延时,增强了可靠性,缺点是需要更多的存储空间开销
关于网络结构的定义同样在nwk_globals.h中定义。默认的是是选择网状结构
信标与非信标模式
ZigBee网络的工作模式可以分为信标(Beacon)和非信标(Non-beacon)两种模式。信标模式实现了网络中所有设备的同步工作和同步休眠,以达到最大限度的功耗节省,而非信标模式则只允许终端设备进行周期性休眠,协调器和所有路由器设备必须长期处于工作状态
信标模式下,协调器负责以一定的间隔时间(一般在15ms-4mins之间)向网络广播信标帧,两个信标帧发送间隔之间有16个相同的时槽,这些时槽分为网络休眠区和网络活动区两个部分,消息只能在网络活动区的各时槽内发送。
非信标模式下,ZigBee标准采用父节点为终端设备子节点缓存数据,终端设备主动向其父节点提取数据的机制,实现终端设备的周期性(周期可设臵)休眠。网络中所有父节点需为自己的终端设备子节点缓存数据帧,所有终端设备子节点的大多数时间都处于休眠模式,周期性的醒来与父节点握手以确认自己仍处于网络中,其从休眠模式转入数据传输模式一般只需要15ms。所有节点竞争同一信道,使用CSMA/CA的信道接入技术,(就是节点在发送数据之前先监听信道,如果信道空闲则可以发送数据,否则就要进行随机的退避,即延迟一段随机时间,然后再进行监听,)信标与非信标是信标接入模式。TI的Zstack协议栈采用的就是非信标模式。(网上是这么说的我也不知道在哪里定义的,稍后我去翻一翻源代码看一下)
信道接入方式采用免冲突载波检测多址接入(CSMA-CA)机制;(这个不多说自己去查一下)
地址(16与64位地址)
ZigBee设备有两种类型的地址。一种是64位IEEE地址,即MAC地址,另一种是16位网络地址。
64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由制造商或者被安装时设臵。这些地址由IEEE来维护和分配。
16位网络地址是当设备加入网络后分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。其中,协调器的网络地址为0x0000.(所以16位地址是可变的)
网络地址的分配:
对于ZigBee2006和ZigBee2007使用分布式寻址方案来分配网络地址。这个寻址算法本身的分布特性保证设备只能与他的父辈设备通讯来接受一个网络地址。不需要整个网络范围内通讯的地址分配,这有助于网络的可 测量性。
ZigBee2007 PRO使用的随机地址分配机制,对新加入的节点使用随机地址分配,为保证网络内地址分配不重复,使用其余的随机地址再进行分配。当一个节点加入时,将接收到父节点的随机分配地址,然后产生“设备声明”(包含分配到的网络地址和 IEEE 地址)发送至网络中的其余节点。如果另一个节点有着同样的网络地址,则通过路由器广播“网络状态-地址 冲突”至网络中的所有节点。所有发生网络地址冲突的节点更改自己的网络地址,然后再发起 “设备声明”检测新的网络地址是否冲突。
终端设备不会广播“地址冲突”,他们的父节点会帮助完成。如果一个终端设备发生了“地 址冲突”,他们的父节点发送“重新加入”消息至终端设备,并要求他们更改网络地址。然后,终端设备再发起“设备声明”检测新的网络地址是否冲突。 当接收到“设备声明”后,关联表和绑定表将被更新使用新的网咯地址,但是路由表不会 被更新。
在每个路由加入网络之前,寻址方案需要知道和配臵一些参数。这些参数是MAX_DEPTH(最大网络深度)、MAX_ROUTERS(最多路由数)和MAX_CHILDREN(最多子节点数)。这些参数是栈配臵的一部分,它同样在nwk_globals.h中定义。
MAX_DEPTH决定了网络的最大深度。协调器(Coordinator)位于深度0,它的儿子位于深度1,他的儿子的的儿子位于深度2,以此类推。
MAX_DEPTH参数限制了网络在物理上的长度。MAX_CHILDREN决定了一个路由(Router)或者一个协调器节点可以处理的儿子节点的最大个数。
MAX_ROUTER决定了一个路由(Router)或者一个协调器(Coordinator)节点可以处理的具有路由功能的儿子节点的最大个数。这个参数是MAX_CHILDREN的一个子集,终端节点使用
如果开发人员想改变这些值,则需要完成以下几个步骤:首先,你要保证这些参数新的赋值要合法。即,整个地址空间不能超过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构成。
#if(STACK_PROFILE_ID==ZIGBEEPRO_PROFILE)
uint8CskipRtrs[1]={0};
uint8CskipChldrn[1]={0};
#elif(STACK_PROFILE_ID==HOME_CONTROLS)
uint8CskipRtrs[MAX_NODE_DEPTH+1]={6,6,6,6,6,0};
uint8CskipChldrn[MAX_NODE_DEPTH+1]={20,20,20,20,20,0};
#elif(STACK_PROFILE_ID==GENERIC_STAR)
uint8CskipRtrs[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};
uint8CskipChldrn[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};
#elif(STACK_PROFILE_ID==NETWORK_SPECIFIC)
uint8CskipRtrs[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};
uint8CskipChldrn[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};
#endif//STACK_PROFILE_ID
数组中最后一个数是0,因为在最深的地方,它已经没有子节点或路由了。
寻址发数据
ZigBee向网络中的设备发送数据,应用程序通常使用AF_DataRequest()函数。
AF_DataRequest(afAddrType_t*dstAddr,//全ZB目的地址,包含NWK地址与ENDPoint
endPointDesc_t*srcEP,//端点描述符
uint16cID,//簇ID
uint16len,//要发送数据的长度
uint8*buf,//要发送的数据(地址)
uint8*transID,//传输序列号
uint8options,//发送选项的有效标志位
uint8radius);//一般设置为AF_DEFAULT_RADIUS
我们主要看一下第一个参数。NWK地址(这里指的是16位的地址)ENDPoint(这是那个20)
typedefstruct
{
union
{
uint16shortAddr;
ZLongAddr_textAddr;
}addr;
afAddrMode_taddrMode;
byteendPoint;
uint16panId;//usedfortheINTER_PANfeature
}afAddrType_t;
其中包括16或64为地址,网络地址。
地址模式参数
typedefenum
{
afAddrNotPresent=AddrNotPresent,
afAddr16Bit=Addr16Bit,
afAddr64Bit=Addr64Bit,
afAddrGroup=AddrGroup,
afAddrBroadcast=AddrBroadcast
}afAddrMode_t;
它主要用来表征是单点传送(unicast),多点传送(multicast)还是广播传送
单点传送(Unicast)Uicast是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。将afAddrMode设臵为Addr16Bit并且在数据包中携带目标设备地址。
间接传送(Indirect)当应用程序不知道数据包的目标设备在哪里的时候使用的模式。将模式设臵为AddrNotPresent并且目标地址没有指定。取代它的是从发送设备的栈的绑定表中查找目标设备。这种特点称之为源绑定。(这种方式一般用于绑定的情况下)当数据向下发送到达栈中,从绑定表中查找并且使用该目标地址。这样,数据包将被处理成为一个标准的单点传送数据包。如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。上一个版本的ZigBee(ZigBee2004),有一个选项可以讲绑定表保存在协调器(Coordinator)当中。发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,然后将数据发送给最终的目标设备。这个附加的特性叫做协调器绑定(CoordinatorBinding)。
广播传送(broadcast)当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设臵为AddrBroadcast。目标地址可以设臵为下面广播地址的一种:
NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时(NWK_INDIRECT_MSG_TIMEOUT在f8wConifg.cfg中)。
NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。
NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包括协调器。
组寻址(GroupAddressing)当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设臵为afAddrGroup并且addr.shortAddr设臵为组ID。
aps_Group_tgroup;
group.ID=0x0001;
group.name[0]=0;//Thiscouldbeahumanreadablestring,比如说“Group1”
aps_AddGroup(SAMPLEAPP_ENDPOINT,&group);
其中的aps_Group_t中只包含ID与name两个参数
获取重要地址
NLME_GetShortAddr()——返回本设备的16位网络地址
NLME_GetExtAddr()——返回本设备的64位扩展地址
NLME_GetCoordShortAddr()——返回本设备的父亲设备的16位网络地址NLME_GetCoordExtAddr()——返回本设备的父亲设备的64位扩展地址
NLME_IsAddressBroadcast()此函数根据设备能力来评估提供的地址是否是一个有效的广播地址。
NLME_SetBroadCastFilter()此函数根据设备能力设置掩码,用于处理有效的广播地址
参考资料:
1、Zigbee无i安传感器网络设计与实现
2、CC2530-datasheet
3、锋硕电子资料