绑定是一种两个(或者多个)应用设备之间信息流的控制机制。在ZigBee2006发布版本中,它被称为资源绑定,所有的设备都必须执行绑定机制。
绑定允许应用程序发送一个数据包而不需要知道目标地址。APS层从它的绑定表中确定目标地址,然后将数据继续向目标应用或者目标组发送。
注意:在ZigBee的1.0版本中,绑定表是保存在协调器(Coordinator当中)。现在所有的绑定记录都保存在发送信息的设备当中。
有三种方法可以建立一个绑定表:
l Zigbee Device Object Bind Request——一个启动工具可以告诉设备创建一个绑定记录
l Zigbee Device Object End Device Bind Request——两个设备可以告诉协调器它们想要建立一个绑定表记录。协调器来协调并在两个设备中创建绑定表记录。
l Device Application——一个设备上的应用程序建立或者管理一个绑定表
任何一个设备都可以发送一个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。
这个机制是在指定的时间周期(timeout period)内,通过按下选定设备上的按钮或者类似的动作来绑定。协调器在指定的时间周期内,搜集终端设备的绑定请求信息,然后以配置ID(Profile ID)和群ID(Cluster ID)协议为基础,创建一个绑定表记录作为结果。默认的设备绑定时间周期(APS_DEFAULT_MAXBINDING_TIME)是16秒钟(在nwk_globals.h中定义)。但是将它添加到f8wConfig.cfg中,则可以更改。
在“用户指南”中的应用程序就是一个终端设备绑定的例子(在每个设备上按下RIGHT按键)。
你应该注意到,所有的例程都有处理关键事件的函数(例如:在TransmitApp.c中的TransmitApp_HandleKeys()函数)。这个函数调用ZDApp_SendEndDeviceBindReq()(在ZDApp.c中)。这个函数搜集所有终端节点的请求信息,然后调用ZDP_EndDeviceBindReq()函数将这些信息发送给协调器。
协调器调用函数ZDP_IncomingData()【ZDProfile.c中】函数接收这些信息,然后再调用ZDApp_ProcessEndDeviceBindReq ()【ZDObject.c中】函数分析这些信息,最后调用ZDApp_EndDeviceBindReqCB【ZDApp.c中】函数,这个函数再调用ZDO_MatchEndDeviceBind()【ZDObject.c中】函数来处理这个请求。
当收到两个匹配的终端设备绑定请求,协调器在请求设备中启动创建源绑定记录的进程。假设在ZDO终端设备中发现了匹配的请求,协调器将执行下面的步骤:
l 发送一个解除绑定请求给第一个设备。这个终端设备锁定进程,这样解除绑定被首先发送来去掉一个已经存在的绑定记录。
l 等待ZDO解除绑定的响应,如果响应的状态是ZDP_NO_ENTRY,则发送一个ZDO绑定请求在源设备中创建一个绑定记录。如果状态是ZDP_SUCCESS,则继续前进到第一个设备的群ID。
l 等待ZDO绑定响应,如果收到了,则继续前进到第一个设备的下一个群ID。
l 当地一个设备完成后,用同样的方法处理第二个设备。
l 当第二个设备也完成之后,发送ZDO 终端设备绑定请求消息给两个设备。
另一种进入设备绑定记录的方式是应用自己管理绑定表。这就意味着应用程序需要通过调用下面的绑定管理函数在本地进入并且删除绑定记录:
l bindAddEntry()——在绑定表中增加一个记录
l bindRemoveEntry()——从绑定表中删除一个记录
l bindRomoveClusterIdFromList()——从一个存在的绑定表记录中删除一个群ID
l bindAddClusterIdToList()——向一个已经存在的绑定记录中增加一个群ID
l bindRemoveDev()——删除所有地址引用的记录
l bindRemoveSrcDev()——删除所有源地址引用的记录
l bindUpdateAddr()——将记录更新为另一个地址
l bindFindExisting()——查找一个绑定表记录
l bindIsClusterIdInList()——在表记录中检查一个已经存在的群ID
l bindNumBoundTo()——拥有相同地址(源或者目的)的记录的个数
l bindNumEntries()——表中记录的个数
l bindCapacity()——最多允许的记录个数
l bindWriteNV()——在NV中更新表
为了在你的设备中使能源绑定在f8wConfig.cfg文件中包含REFLECTOR编译标志。同时在f8wConfig.cfg文件中查看配置项目NWK_MAX_BINDING_ENTRIES和MAX_BINDING_CLUSTER_IDS。NWK_MAX_BINDING_ENTRIES是限制绑定表中的记录的最大个数,MAX_BINDING_CLUSTER_IDS是每个绑定记录的群ID的最大个数。
绑定表在静态RAM中(未分配),因此绑定表中记录的个数,每条记录中群ID的个数都实际影响着使用RAM的数量。每一条绑定记录是8字节多(MAX_BINDING_CLUSTER_IDS * 2字节)。除了绑定表使用的静态RAM的数量,绑定配置项目也影响地址管理器中的记录的个数。