yiffer的个人空间 https://blog.eetop.cn/edesign [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

转:ZigBee无线协议学习笔记(2)

已有 3785 次阅读| 2012-8-6 14:45 |个人分类:zigbee

1.      寻址

1.1.    地址类型

ZigBee设备有两种类型的地址。一种是64IEEE地址(物理),即MAC地址,另一种是16位网络地址。64位地址是全球唯一的地址,设备将在它的生命周期中一直拥有它,通常由制造商或者被安装时设置。这些地址由IEEE来维护和分配。16位网络地址是当设备加入网络后由协调器或路由器分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。

1.2.    网络地址分配

ZigBee使用分布式寻址方案来分配网络地址。这个方案保证在整个网络中所有分配的地址是唯一的。这一点是必须的,因为这样才能保证一个特定的数据包能够发给它指定的设备,而不出现混乱。同时,这个寻址算法本身的分布特性保证设备只能与他的父辈设备通讯来接受一个网络地址。不需要整个网络范围内通讯的地址分配,这有助于网络的可测量性。

在每个路由加入网络之前,寻址方案需要知道和配置一些参数。这些参数是MAX_DEPTHMAX_ROUTERSMAX_CHILDREN。这些参数是栈配置的一部分,ZigBee2006协议栈已经规定了这些参数的值:MAX_DEPTH = 5MAX_ROUTERS = 6MAX_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_CHILDRENMAX_ROUTER构成。

1.3.    Z-Stack寻址

为了向一个在ZigBee网络中的设备发送数据,应用程序通常使用AF_DataRequest()函数。数据包将要发送给一个afAddrType_t(ZComDef.h中定义)类型的目标设备。

typedef struct

{

union

{

uint16 shortAddr;

} addr;

afAddrMode_t addrMode;

byte endPoint;

} afAddrType_t;

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

typedef enum

{

afAddrNotPresent = AddrNotPresent,

afAddr16Bit = Addr16Bit,

afAddrGroup = AddrGroup,

afAddrBroadcast = AddrBroadcast

} afAddrMode_t;

因为在Zigbee中,数据包可以单点传送(unicast),多点传送(multicast)或者广播传送,所以必须有地址模式参数。一个单点传送数据包只发送给一个设备,多点传送数据包则要传送给一组设备,而广播数据包则要发送给整个网络的所有节点。这个将在下面详细解释。

单点传送

Uicast是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。将afAddrMode设置为Addr16Bit并且在数据包中携带目标设备地址。

1.3.1.      间接传送

当应用程序不知道数据包的目标设备在哪里的时候使用的模式。将模式设置为AddrNotPresent并且目标地址没有指定。取代它的是从发送设备的栈的绑定表中查找目标设备。这种特点称之为源绑定。

当数据向下发送到达栈中,从绑定表中查找并且使用该目标地址。这样,数据包将被处理成为一个标准的单点传送数据包。如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。

上一个版本的ZigBee(ZigBee04),有一个选项可以将绑定表保存在协调器(Coordinator)当中。发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,然后将数据发送给最终的目标设备。这个附加的特性叫做协调器绑定(Coordinator Binding)

1.3.2.      广播传送

当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设置为AddrBroadcast。目标地址可以设置为下面广播地址的一种:

NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时(NWK_INDIRECT_MSG_TIMEOUTf8wConifg.cfg)

NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。

NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包括协调器。

1.3.3.      组寻址

当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设置为afAddrGroup并且addr.shortAddr设置为组ID

在使用这个功能之前,必须在网络中定义组。(参见Z-stack API文档中的aps_AddGroup()函数)

注意组可以用来关联间接寻址。在绑定表中找到的目标地址可能是单点传送或者是一个组地址。另外,广播发送可以看做是一个组寻址的特例。

下面的代码是一个设备怎样加入到一个ID1的组当中:

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 );

1.4.    重要设备地址

应用程序可能需要知道它的设备地址和父亲地址。使用下面的函数获取设备地址(ZStack API中定义)

NLME_GetShortAddr()——返回本设备的16位网络地址

NLME_GetExtAddr()——  返回本设备的64位扩展地址

使用下面的函数获取该设备的父亲设备的地址:

NLME_GetCoordShortAddr()——返回本设备的父亲设备的16位网络地址

NLME_GetCoordExtAddr()——  返回本设备的父亲设备的64位扩展地址

2.      绑定

绑定是一种两个(或者多个)应用设备之间信息流的控制机制。在ZigBee2006发布版本中,它被称为资源绑定,所有的设备都必须执行绑定机制。

绑定允许应用程序发送一个数据包而不需要知道目标地址。APS层从它的绑定表中确定目标地址,然后将数据继续向目标应用或者目标组发送。

注意:在ZigBee1.0版本中,绑定表是保存在协调器(Coordinator当中)。现在所有的绑定记录都保存在发送信息的设备当中。

2.1.    建立绑定表

有三种方法可以建立一个绑定表:

Zigbee Device Object Bind Request——一个启动工具可以告诉设备创建一个绑定记录。

Zigbee Device Object End Device Bind Request——两个设备可以告诉协调器它们想要建立一个绑定表记录。协调器来协调并在两个设备中创建绑定表记录。

Device Application——一个设备上的应用程序建立或者管理一个绑定表。

2.1.1.      ZigBee设备对象请求绑定

任何一个设备都可以发送一个ZDO信息给网络中的另一个设备,用来建立绑定表。称之为援助绑定,它可以为一个发送设备创建一个绑定记录。

启动申请

一个应用程序可以通过ZDP_BindReq()函数(ZDProfile.h),并在绑定表中包含两个请求(地址和终点)以及想要的群ID。第一个参数(目标dstAddr)是绑定源的短地址即16位网络地址。确定已经在ZDConfig.h允许了这个功能ZDO_BIND_UNBIND_REQUEST

也可以使用ZDP_UnbindReq()用同样的参数取消绑定记录。

目标设备发回ZigBee Device Object Bind 或者Unbind Response信息,该信息是ZDO代码根据动作的状态,通过调用ZDApp_BindRsq()或者ZDApp_UnbindRsq()函数来分析和通知ZDApp.c的。

对于绑定响应,从协调器返回的状态将ZDP_SUCCESS,ZDP_TABLE_FULL或者ZDP_NOT_SUPPORTED

对于解除绑定响应,从协调器返回的状态ZDP_SUCCESS,ZDP_NO_ENTRY或者ZDP_NOT_SUPPORTED

转:http://blog.csdn.net/chexlong/article/details/6141316

续。。。。。。

 


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 3

    粉丝
  • 0

    好友
  • 19

    获赞
  • 69

    评论
  • 3705

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 02:49 , Processed in 0.015114 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部