绑定是一种两个(或者多个)应用设备应用层之间信息流的控制机制。在ZigBee2006发布版本中,它被称为资源绑定,所有的设备都必须执行绑定机制
绑定允许应用程序发送一个数据包而不需要知道目标地址。APS层从它的绑定表中确定目标地址,然后在信息前端加上这个目的地址或组地址。
注意:在ZigBee的2004版本中,绑定表是保存在协调器(Coordinator当中)。现在所有的绑定记录都保存在发送信息的设备当中。
绑定就是在两个设备应用层上的逻辑链接。多重绑定能在一个设备上被创建,另外,一个绑定可能有多于一个目的设备(一个到多个绑定).
例如:在多开关控制灯的网络中,每个开关可以控制一个或更多的灯。在每一次开关灯时,一个绑定都被建立。这样就允许应用在没有目的地址情况下发送数据包。
一旦一个绑定在源设备被创建,应用就可以不需要指定目的地址(在调用函数zb_SendDataRequest()时,一个有效的目的地址—0xffff应该被用作目的地址)而发送数据了。这是因为协议栈查询目的地址在内部基于信息包的命令标志符绑定表格。
如果绑定能有多于一个目的地址,这样的话,这个协议栈将自动发送一个信息的复制到每一个指定的绑定目的地址的入口。
如果NV_RESTORE编译选项允许时绑定,则这个协议将保存绑定条目到非易失性的RAM中.这对设备意外复位(或电池需要充电)是很有用的。这个设备不需要用户设置,能重新自动在一次获得绑定。
注意:绑定只能在"补充的"设备间被创建。也就是说,当两个设备已经在他们的简单描述符结构中登记为一样的命令_ID,并且一个作为输入,另一个作为输出时,绑定才能成功。
绑定表格形式:
(as,es,cs)={(ad1,ed1|),(ad2|,ed2|),.........,(and|,edn)}
其中:
As为绑定源设备的地址
Es 为绑定源设备Ep的标识符
Cs 为绑定连接的簇标识符
Adi 为i 绑定分配的目的地址或目的组地址
Edi为i绑定分配的EP标识符
注意:只有当adi是一个设备地址时,才会有edi
建立一个绑定表格有三种方式:
(1)Zigbee Device Object Bind Request(ZDO绑定请求) ——通过一个命令告诉设备创建一个绑定记录。
(2)Zigbee Device Object End Device Bind Request(ZDO终端设备绑定请求) ——两个设备告诉协调器它们想要建立一个绑定表记录。协调器来协调并在两个设备中创建绑定表记录。
(3)Device Application(设备应用) ——设备应用程序能建立或管理一个绑定表
任何一个设备或应用能在网络中发送一个ZDO信息到另一个设备建立一个绑定记录。
1、ZDO绑定请求
任何一个设备都可以发送一个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。
2、ZDO终端设备绑定请求
这个机制是在指定的时间周期(timeout period)内,通过按下选定设备上的按钮或者类似的动作来绑定。协调器在指定的时间周期内,搜集终端设备的绑定请求信息,然后以配置ID(Profile ID)和群ID(Cluster ID)协议为基础,创建一个绑定表记录作为结果。默认的设备绑定时间周期(APS_DEFAULT_MAXBINDING_TIME)是16秒钟(在nwk_globals.h中定义)。但是将它添加到f8wConfig.cfg中,则可以更改。在给的例子程序中有一个终端设备绑定的例子(在每个设备上按下SW2按键)。
你应该注意到,所有的例程都有处理键盘事件的函数(例如:在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中】函数来处理这个请求。在SampleLight和SampleSwitch例子中,直接利用调用ZDP_EndDeviceBindReq()函数就实现点亮/关闭灯的功能。
当收到两个匹配的终端设备绑定请求,协调器在请求设备中启动创建源绑定记录的进程。假设在ZDO终端设备中发现了匹配的请求,协调器将执行下面的步骤:
①发送一个ZDO解除绑定请求给第一个设备。该设备进行绑定处理,所以首先解除绑定,移除一个已经存在的绑定条目
②等待ZDO解除绑定的响应,如果响应的状态是ZDP_NO_ENTRY,则发送一个ZDO绑定请求,在源设备中创建一个绑定记录。如果状态是ZDP_SUCCESS,则为第一个设备移除绑定。则继续前进到第一个设备的群ID。
③等待ZDO绑定响应,如果收到了,则继续前进到第一个设备的下一个群ID。
④当第一个设备完成后,用同样的方法处理第二个设备。
⑤ 当第二个设备也完成之后,发送ZDO 终端设备绑定请求消息到第一个和第二个设备。
3、设备应用绑定管理
在设备上其他进入绑定条目的方式是应用层管理绑定表格,即应用层将调用下列函数添加和移除绑定表格条目。
◆ bindAddEntry()——在绑定表中增加一个记录
◆bindRemoveEntry()——从绑定表中删除一个记录
◆bindRomoveClusterIdFromList()——从一个存在的绑定表记录中删除一个群ID
◆ bindAddClusterIdToList()——向一个已经存在的绑定记录中增加一个群ID
◆bindRemoveDev()——删除所有地址引用的记录
◆bindRemoveSrcDev()——删除所有源地址引用的记录
◆ bindUpdateAddr()——将记录更新为另一个地址
◆bindFindExisting()——查找一个绑定表记录
◆bindIsClusterIdInList()——在表记录中检查一个已经存在的群ID
◆ bindNumBoundTo()——拥有相同地址(源或者目的)的记录的个数
◆bindNumEntries()——表中记录的个数
◆ bindCapacity()——最多允许的记录个数
◆bindWriteNV()——在NV中更新表
4.配置源绑定(Configuring Source Binding)
为了在你的设备中使能源绑定在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的数量,绑定配置项目也影响地址管理器中的记录的个数。
到此,对绑定也有了一定的认识,下面会从Z-Stack中自带的例子程序中,分析绑定是如何在代码中实现的。