注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

易拉罐的博客

心静自然凉

 
 
 

日志

 
 

转 ZigBee2007应用开发指导手册  

2015-11-03 14:14:50|  分类: 物联网 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

协议栈规范(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中定义:
转  ZigBee2007应用开发指导手册 - 易拉罐bb - 易拉罐的博客
 
拓扑结构
         ZigBee 网络支持星状、树状和网状三种网络拓扑结构,如下图所示,分别依次是星状网络,树(簇)状网络和网状网络。
转  ZigBee2007应用开发指导手册 - 易拉罐bb - 易拉罐的博客
 
         星状网络由一个PAN 协调器和多个终端设备组成,只存在PAN 协调器与终端的通讯,终端设备间的通讯都需通过PAN 协调器的转发。  
         树状网络由一个协调器和一个或多个星状结构连接而成,设备除了能与自己的父节点或子节点进行点对点直接通讯外,其他只能通过树状路由完成消息传输。 
        网状网络是树状网络基础上实现的,与树状网络不同的是,它允许网络中所有具有路由功能的节点直接互连,由路由器中的路由表实现消息的网状路由。该拓扑的优点是减少了消息延时,增强了可靠性,缺点是需要更多的存储空间开销。          在Z-Stack中网络拓扑结构定义如下:
转  ZigBee2007应用开发指导手册 - 易拉罐bb - 易拉罐的博客
 
信标与非信标模式
         ZigBee网络的工作模式可以分为信标(Beaeon)和非信标(Non-beaeon)两种模式。信标模式实现了网络中所有设备的同步工作和同步休眠,以达到最大限度的功耗节省,而非信标模式则只允许终端设备进行周期性休眠,协调器 和所有路由器 设备必须长期处于工作状态。
        信标模式下,协调器负责以一定的间隔时间(一般在15ms-4mins 之间)向网络广播信标帧,两个信标帧发送间隔之间有16 个相同的时槽,这些时槽分为网络休眠区和网络活动区两个部分,消息只能在网络活动区的各时槽内发送。
        非信标模式下,ZigBee 标准采用父节点为终端设备子节点缓存数据,终端设备主动向其父节点提取数据的机制,实现终端设备的周期性(周期可设臵)休眠。网络中所有父节点需为自己的终端设备子节点缓存数据帧,所有终端设备子节点的大多数时间都处于休眠模式,周期性的醒来与父节点握手以确认自己仍处于网络中,其从休眠模式转入数据传输模式一般只需要15ms。

地址
       ZigBee设备有两种类型的地址。一种是64位IEEE地址,即MAC地址,另一种是16位网络地址。
        64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由制造商或者被安装时设臵。这些地址由IEEE来维护和分配。  
        16位网络地址是当设备加入网络后分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。其中,协调器的网络地址为0x00 
转  ZigBee2007应用开发指导手册 - 易拉罐bb - 易拉罐的博客
 
网络地址分配
         ZigBee 2007使用分布式寻址方案来分配网络地址。这个方案保证在整个网络中所有分配的地址是唯一的。这一点是必须的,因为这样才能保证一个特定的数据包能够发给它指定的设备,而不出现混乱。同时,这个寻址算法本身的分布特性保证设备只能与他的父辈设备通讯来接受一个网络地址。不需要整个网络范围内通讯的地址分配,这有助于网络的可测量性。
         假设父设备可拥有的最大子设备数为Cm,其拥有的最大路由子设备数为 Rm,网络的最大深度为Lm,则父设备所能分配子区段地址数为:
若Rm=1,Cskip(d)= 1+Cm*(Lm-d-1);  
 若Rm不为1,则Cskip(d)=(1+Cm-Rm-Cm*( Rm)^(Lm-d-1))/(1-Rm).
        子节点为父设备的第n个子路由器的短地址分配:
Achild =Aparent +(n-1)*Cskip(d)+1,n=1 
 Achild =Aparen +(n-1)*Cskip(d),n>1 
       子节点为父设备的第n个子终端设备的短地址分配:
Achild  = Aparent + Rm*Cskip(d)+ n 
          ZigBee 2007 PRO 使用的随机地址分配机制,对新加入的节点使用随机地址分配,为保证网络内地址分配不重复,使用其余的随机地址再进行分配。当一个节点加入时,将接收到父节点的随机分配地址,然后产生“设备声明”(包含分配到的网络地址和IEEE地址)发送至网络中的其余节点。如果另一个节点有着同样的网络地址,则通过路由器广播“网络状态-地址冲突”至网络中的所有节点。所有发生网络地址冲突的节点更改自己的网络地址,然后再发起“设备声明”检测新的网络地址是否冲突。
          终端设备不会广播“地址冲突”,他们的父节点会帮助完成。如果一个终端设备发生了“地址冲突”,他们的父节点发送“重新加入”消息至终端设备,并要求他们更改网络地址。然后,终端设备再发起“设备声明”检测新的网络地址是否冲突。
         当接收到“设备声明”后,关联表和绑定表将被更新使用新的网咯地址,但是路由表不会被更新。
         在每个路由加入网络之前,寻址方案需要知道和配置一些参数。这些参数是MAX_DEPTH (最大网络深度)、MAX_ROUTERS(最多路由数)和MAX_CHILDREN(最多子节点数)。这些参数是栈配的一部分,ZigBee2007协议栈已经规定了这些参数的值:
转  ZigBee2007应用开发指导手册 - 易拉罐bb - 易拉罐的博客
          MAX_DEPTH决定了网络的最大深度。协调器(Coordinator)位于深度0,它的儿子位于深度1,他的儿子的的儿子位于深度2,以此类推。MAX_DEPTH参数限制了网络在物理上的长度。
          MAX_CHILDREN决定了一个路由(Router)或者一个协调器节点可以处理的儿子节点的最 大个数。 
          MAX_ROUTER决定了一个路由(Router)或者一个协调器(Coordinator)节点可以处理的具有 路由功能的儿子节点的最大个数。这个参数是MAX_CHILDREN的一个子集,终端节点使用(MAX_CHILDREN – MAX_ROUTER)剩下的地址空间。
          本章中ZigBee网络示意图所示的MAX_DEPTH=3,MAX_CHILDREN=5,MAX_ROUTER=2。
          如果开发人员想改变这些值,则需要完成以下几个步骤:    
首先,你要保证这些参数新的赋值要合法。即,整个地址空间不能超过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构成。
转  ZigBee2007应用开发指导手册 - 易拉罐bb - 易拉罐的博客

寻址 
        为了向一个在ZigBee网络中的设备发送数据,应用程序通常使用AF_DataRequest()函数。数据包将要发送给一个afAddrType_t(在ZComDef.h中定义)类型的目标设备。
转  ZigBee2007应用开发指导手册 - 易拉罐bb - 易拉罐的博客
 注意,除了网路地址之外,还要指定地址模式参数。目的地址模式可以设置为以下几个值:
转  ZigBee2007应用开发指导手册 - 易拉罐bb - 易拉罐的博客
           因为在Zigbee中,数据包可以单点传送(unicast),多点传送(multicast)或者广播传送,所以必须有地址模式参数。一个单点传送数据包只发送给一个设备,多点传送数据包则要传送给一组设备,而广播数据包则要发送给整个网络的所有节点。这个将在下面详细解释。
? 单点传送(Unicast) 
           Uicast是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。将afAddrMode设为Addr16Bit并且在数据包中携带目标设备地址。
? 间接传送(Indirect)  
        当应用程序不知道数据包的目标设备在哪里的时候使用的模式。将模式设为AddrNotPresent并且目标地址没有指定。取代它的是从发送设备的栈的绑定表中查找目标设备。这种特点称之为源绑定。  
        当数据向下发送到达栈中,从绑定表中查找并且使用该目标地址。这样,数据包将被处理成为一个标准的单点传送数据包。如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。  
         上一个版本的ZigBee(ZigBee2004),有一个选项可以将绑定表保存在协调器(Coordinator)当中。发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,然后将数据发送给最终的目标设备。这个附加的特性叫做协调器绑定(Coordinator Binding)。 
? 广播传送(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的组当中:
转  ZigBee2007应用开发指导手册 - 易拉罐bb - 易拉罐的博客
 
重要设备地址(Important Device Addresses) 
         应用程序可能需要知道它的设备地址和父亲地址。使用下面的函数获取设备地址(在ZStack API中定义):  NLME_GetShortAddr()——返回本设备的16位网络地址 
NLME_GetExtAddr()——  返回本设备的64位扩展地址  
         使用下面的函数获取该设备的父亲设备的地址:  
NLME_GetCoordShortAddr()——返回本设备的父亲设备的16位网络地址 
NLME_GetCoordExtAddr()——  返回本设备的父亲设备的64位扩展地址 









  评论这张
 
阅读(98)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017