上一节看到,协调器向终端节点发送匹配描述符响应,由于终端节点在sapi注册了匹配描述符响应事件,因此,我们可以sapi层看到对此事件的处理:在sapi层找到:
UINT16 SAPI_ProcessEvent( byte task_id, UINT16 events )
{
osal_event_hdr_t *pMsg;
afIncomingMSGPacket_t *pMSGpkt;
afDataConfirm_t *pDataConfirm;
if ( events & SYS_EVENT_MSG)
{
pMsg =(osal_event_hdr_t *) osal_msg_receive( task_id );
while ( pMsg)
{
switch ( pMsg->event )
{
case ZDO_CB_MSG:
SAPI_ProcessZDOMsgs( (zdoIncomingMsg_t *)pMsg);//sapi层处理ZDO消息的函数
break;
进入SAPI_ProcessZDOMsgs函数中找到:
void SAPI_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )
{
switch ( inMsg->clusterID )
{
caseNWK_addr_rsp:
{
// Send find device callback to application
ZDO_NwkIEEEAddrResp_t *pNwkAddrRsp = ZDO_ParseAddrRsp( inMsg);
SAPI_FindDeviceConfirm( ZB_IEEE_SEARCH,(uint8*)&pNwkAddrRsp->nwkAddr,pNwkAddrRsp->extAddr );
}
break;
caseMatch_Desc_rsp: //以下是对匹配描述符响应事件的处理
{
zAddrType_t dstAddr;
ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
if ( sapi_bindInProgress != 0xffff )
{
// 创建一个绑定表
dstAddr.addrMode = Addr16Bit;
dstAddr.addr.shortAddr = pRsp->nwkAddr;
if ( APSME_BindRequest(sapi_epDesc.simpleDesc->EndPoint,
sapi_bindInProgress, &dstAddr,pRsp->epList[0] ) == ZSuccess )
{
osal_stop_timerEx(sapi_TaskID, ZB_BIND_TIMER);
osal_start_timerEx( ZDAppTaskID, ZDO_NWK_UPDATE_NV, 250 );
// 寻找IEEE长地址
ZDP_IEEEAddrReq( pRsp->nwkAddr,ZDP_ADDR_REQTYPE_SINGLE, 0, 0 );
#if defined ( MT_SAPI_CB_FUNC )
zb_MTCallbackBindConfirm( sapi_bindInProgress, ZB_SUCCESS );
#endif
// 向应用层发送绑定确认
#if ( SAPI_CB_FUNC )
zb_BindConfirm( sapi_bindInProgress, ZB_SUCCESS );
#endif
sapi_bindInProgress = 0xffff;
}
}
}
break;
}
}
到此为止,终端节点入网以及绑定操作已经完成。。