首页 理论教育 Z-Stack绑定流程详解

Z-Stack绑定流程详解

时间:2023-06-29 理论教育 版权反馈
【摘要】:对匹配簇列表中已经绑定的簇解除绑定,或对没有绑定的簇进行绑定,需要用到核心函数ZDMatchSendState。下面以绑定过程分析状态转换过程。在匹配簇成功后,将进入ZDMATCH_REASON_START状态,调用ZDMatchSendState函数将发送一次解除绑定请求给端点1,端点1接收到解除绑定请求后,将执行解除绑定。对于绑定成功的情况,协调器会收到Bing_rsp的反馈消息,同样会调用ZDMatchSendState函数进行处理,对绑定成功的处理是解除绑定端点1的下一个簇,如果端点1的

Z-Stack绑定流程详解

1.源节点发起绑定请求

通过按键发送绑定请求,调用函数为ZDP_EndDeviceBindReq,该函数的申明如下:

dstAddr:协调器地址,由协调器协助进行绑定。

LocalCoordinator:需要绑定的节点网络地址(本节点地址)。

endPoint:需要绑定的端点号。

ProfileID:协议ID。

NumInClusters:输入簇个数。

InClusterList:输入簇列表。

NumOutClusters:输出簇个数。

OutClusterList:输出簇列表。

目标地址就是协助完成绑定的节点地址,通常使用协调器协助绑定。簇数量和簇列表是最重要的信息,作为绑定的重要依据。因为在绑定前需要进行簇ID匹配,即参与绑定的两个节点需要输出簇和输入簇互补,匹配过程就在源节点的输出簇列表中找目标节点中寻相应的输入簇,在目标节点的输出簇列表中寻找源节点输入簇。

该函数的调用了无线发送函数,将请求消息发送至协调器,委托协调器完成绑定服务。

2.协调器处理绑定请求

在ZDO层,初始化函数(ZDApp_Init)最后调用ZDApp_RegisterCBs函数注册一些ZDO层响应的回调命令,其中就包括了End_Device_Bind_req,这就是协调器响应远程节点的绑定请求,在ZDO的事件轮询函数中对该命令进行了处理:

ZDO_ParseEndDeviceBindReq函数将系统消息转换成ZDEndDeviceBind_t类型,然后调用ZDO_MatchEndDeviceBind来处理绑定请求。

该函数会被调用两次,分别响应参与绑定的两个节点的绑定请求,参与绑定的节点必须在规定的时限内先向协调器发送绑定请求,默认的终端设备绑定超时时间(APS_DEFAULT_MAXBINDING_TIME)为16 000 ms(定义在ZGlobals.h中),但是可以修改。

绑定过程中,两个节点的信息保存到一个ZDMatchEndDeviceBind 类型的全局指针matchED中,第一次接收到绑定请求时,matchED为空指针,经过第一次调用后,matchED将会在堆区分配空间,并将第一个发送请求的节点信息(ZDEndDeviceBind_t结构)保存到matchED的ed1域当中。

第二次调用该函数时,matchED不再是指针,因此进入else代码,同样将第二个请求绑定的节点信息保存到matchED的ed2元素当中,然后开始进行匹配输入输出簇,其匹配部分代码如下:

以上为节点1输出簇与节点2的输入簇进行比较,将相同的簇个数返回保存到matchED的ed1numMatched元素,并将相同的簇保存到ZDOBuildBuf当中。对节点2的输出簇与节点1的输入簇也进行相同的比较,如果两次比较中找到了相同的簇,则为两个节点建立绑定服务:

3.建立绑定实体/解除绑定实体

参与绑定的两个实体如果有簇匹配,接下来的工作就是将匹配的簇ID进行绑定或者解除绑定。对匹配簇列表中已经绑定的簇解除绑定,或对没有绑定的簇进行绑定,需要用到核心函数ZDMatchSendState。(www.xing528.com)

该函数采用了状态机原理实现,通过传递不同的状态,配合事件响应,驱使协调器完成以上绑定、解绑过程。

具体的ZDMatchSendState函数可以响应的状态有以下4种:

(1)ZDMATCH_REASON_TIMEOUT为超时状态,若绑定失败,则将响应状态设置为超时:

然后将绑定状态发送参与绑定的两个节点:

(2)ZDMATCH_REASON_START状态是在匹配成功之后、第一次调用ZDMatchSendState函数时进入的状态。对于该状态需要将匹配的最大的描述符解除绑定。

首先将发送标识设置为解除绑定状态:

(3)ZDMATCH_REASON_UNBIND_RSP为解除绑定响应状态。对其有两种不同处理途径:对于解除绑定成功的情况,会依次遍历端点1和端点2的匹配簇表,依次从大到小解除绑定。对于解除绑定失败的情况,说明该簇并没有绑定;将执行绑定请求。

解除绑定成功,继续设置发送标识为解除绑定:

处理下一个簇ID(先处理ed1,ed1全部处理完再处理ed2):

同样最后向该簇ID对应的节点发送解除绑定请求。

对于解除绑定失败的情况,将发送标识设置为绑定:

然后发送绑定请求:

(4)处理ZDMATCH_REASON_BIND_RSP状态。

如果前一次绑定成功,则设置发送标识为ZDMATCH_SENDING_UNBIND,即接下来的操作为解除绑定;如果前一次绑定失败,则将响应状态设置为接收到的终端在进行绑定时,失败返回的状态,并发送响应给两个参与绑定的节点,结束本次绑定工程。其相关代码如下:

前面提到ZDMatchSendState函数在不同状态下进行不同的工作,那状态是怎样传递到该函数的呢?这就要依靠进行绑定的节点的反馈信息。下面以绑定过程分析状态转换过程。

首先做以下申明,第一个发送绑定请求的节点称为端点1,第二个称为端点2。在匹配簇成功后,将进入ZDMATCH_REASON_START状态,调用ZDMatchSendState函数将发送一次解除绑定请求给端点1,端点1接收到解除绑定请求后,将执行解除绑定。因为初始情况没有进行过绑定,故解除绑定会失败,并将失败信号发送给协调器。其相关代码如下:

协调器处理端点1的反馈信息:

在此又调用了ZDMatchSendState函数,并且构成了一个循环,但是每次调用该函数时进入的状态不同,这次调用ZDMatchSendState函数进入的状态为ZDMATCH_REASON_UNBIND_RSP,并且是一个解除绑定失败的响应,此时应该发送绑定请求给端点1。正常情况端点1会绑定成功,并发送绑定成功的反馈给协调器。其相关代码如下:

绑定表的建立就发生在APSME_BindRequest函数当中,该函数是应用支持子层提供的管理函数,并不是开源函数。

对于绑定成功的情况,协调器会收到Bing_rsp的反馈消息,同样会调用ZDMatchSendState函数进行处理,对绑定成功的处理是解除绑定端点1的下一个簇,如果端点1的簇都完成了解除绑定,则接着解除绑定端点2的簇。依次循环,完成所有匹配的簇中没有绑定的簇绑定。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈