




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
通过SimpleApp例程理解绑定的流程(二)2010-12-04 11:16:46分类:嵌入式 在上一篇文章中主要描述了第一种已知扩展地址的绑定,这一篇是未知扩展地址的绑定,这种方式会稍微复杂一点。2.未知扩展地址的绑定 该绑定方式下,在发送请求之前,先要让被绑定的目的设备处于允许绑定模式。可以调用函数zb_AllowBind()进入该模式,在一定的周期内该函数可以使设备处于允许绑定的状态。通过调用zb_BindDevice()函数实现两个设备的真正绑定。下面是其源代码;void zb_AllowBind ( uint8 timeout ) osal_stop_timerEx(sapi_TaskID, ZB_ALLOW_BIND_TIMER); if ( timeout = 0 ) afSetMatch(sapi_epDesc.simpleDesc-EndPoint, FALSE); else afSetMatch(sapi_epDesc.simpleDesc-EndPoint, TRUE);/设置允许设备响应ZDO的描述符匹配请求 if ( timeout != 0xFF ) if ( timeout 64 ) timeout = 64; /匹配允许后,设置了一个定义器,定义的时间是timeout*1000,定时时间一到,就会触发sapi_TaskID任务中的ZB_ALLOW_BIND_TIMER事件,在SAPI_ProcessEvent()函数中,对其进行处理,这个不是强制事件类型的子集,是用户定义的#define ZB_ALLOW_BIND_TIMER 0x4000 /0x0001 osal_start_timerEx(sapi_TaskID, ZB_ALLOW_BIND_TIMER, timeout*1000); return;参数timeout是进行绑定模式持续的时间,单位是秒,如果设置timeout=0xFF,则设备在任何时候都可以允许绑定,如果设置timeout=0x00,设备将禁止绑定。其中,这个timeout的有效值在1到65之间,如果大于64也处于绑定模式,时间默认的还是64.调用该函数使调适给定的时间内进入允许绑定模式。一个在允许绑定模式下同等的设备调用函数zb_BindDevice()能与之建立绑定,目的地址为空。也就是源设备也处于允许绑定的模式,在里面调用函数afSetMatch(),使之允许响应ZDO的匹配描述符请求。 在目的设备处于允许绑定的模式的时间内,源设备可以调用函数zb_BindDevice()发起绑定请求。设置允许反应的标志uint8 afSetMatch( uint8 ep, uint8 action ) epList_t *epSearch; / Look for the endpoint寻找EP epSearch = afFindEndPointDescList( ep ); if ( epSearch ) if ( action ) epSearch-flags |= eEP_AllowMatch; else epSearch-flags &= (0xff eEP_AllowMatch); return ( TRUE ); else return ( FALSE );static epList_t *afFindEndPointDescList( byte EndPoint ) epList_t *epSearch; / Start at the beginning epSearch = epList;/ Look through the list until the end遍历链表 while ( epSearch ) / Is there a match?找到匹配的 if ( epSearch-epDesc-endPoint = EndPoint ) return ( epSearch ); else epSearch = epSearch-nextDesc;/ Next entry return ( (epList_t *)NULL ); 调用函数zb_BindDevice()发起绑定请求的实现代码在上面也已经一起分析过了,为了完整也放在下面。else/未知扩展地址的绑定*pDestination为NULL ret = ZB_INVALID_PARAMETER; destination.addrMode = Addr16Bit;/设置16位短地址 destination.addr.shortAddr = NWK_BROADCAST_SHORTADDR;/广播模式/比较输出簇commandId是否和本终端输出簇列表中有匹配项,成功匹配返回TRUE if(ZDO_AnyClusterMatches(1,&commandId,sapi_epDesc.simpleDesc-AppNumOutClusters, sapi_epDesc.simpleDesc-pAppOutClusterList ) ) / Try to match with a device in the allow bind mode匹配一个在允许绑定模式下的设备 ret = ZDP_MatchDescReq( &destination, NWK_BROADCAST_SHORTADDR, sapi_epDesc.simpleDesc-AppProfId, 1, &commandId, 0, (cId_t *)NULL, 0 ); /如果commandId是输入簇,则查找本地输入簇列表中是否有匹配项 else if( ZDO_AnyClusterMatches(1,&commandId, sapi_epDesc.simpleDesc-AppNumInClusters, sapi_epDesc.simpleDesc-pAppInClusterList ) ) /匹配一个在允许绑定模式的设备 ret = ZDP_MatchDescReq( &destination, NWK_BROADCAST_SHORTADDR, sapi_epDesc.simpleDesc-AppProfId, 0, (cId_t *)NULL, 1, &commandId, 0 ); if ( ret = ZB_SUCCESS)/如果匹配成功 / Set a timer to make sure bind completes设置一个时间,确保绑定完成 osal_start_timerEx(sapi_TaskID, ZB_BIND_TIMER, AIB_MaxBindingTime); sapi_bindInProgress = commandId;/允许基于命令的绑定过程 return;/ dont send cback event SAPI_SendCback( SAPICB_BIND_CNF, ret, commandId ); 在这其中调用了函数ZDP_MatchDescReq(),将建立和发送一个匹配描述符(Match Description)请求,用这个函数在一个应用中的输入/输出簇列表中搜索匹配某条件的设备/应用。afStatus_t ZDP_MatchDescReq( zAddrType_t *dstAddr, uint16 nwkAddr, uint16 ProfileID, byte NumInClusters, cId_t *InClusterList, byte NumOutClusters, cId_t *OutClusterList, byte SecurityEnable )其中:dstArr:目的地址nwkAddr:已知的16位网络地址ProfileID:应用模式(Applications Profile)ID,为簇ID作为参考NumInClusters:输入簇ID的队列NumOutClusters:在输出簇列表中簇ID的数量OutClusterList:输出簇列表中簇ID的数量OutClusterLIst:输出簇ID的队列SecuritySuite:信息安全类型返回:无查找到一个匹配描述符后,调用AF_DataRequest()函数发送。该绑定的响应处理在SAPI_ProcessEvent()函数中。这个应该是源设备的响应。,该事件属于SYS_EVENT_MSG强制事件的子事件。case ZDO_CB_MSG: SAPI_ProcessZDOMsgs( (zdoIncomingMsg_t *)pMsg ); break; 下面是SAPI_ProcessZDOMsgs()函数,在SAPI_Init()函数中注册了以下两个ZDO信息/ ZDO_RegisterForZDOMsg( sapi_TaskID, NWK_addr_rsp );/ ZDO_RegisterForZDOMsg( sapi_TaskID, Match_Desc_rsp );void SAPI_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg ) switch ( inMsg-clusterID ) case Match_Desc_rsp: zAddrType_t dstAddr; ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg ); if ( sapi_bindInProgress != 0xffff ) / Create a binding table entry创建绑定表的实体 dstAddr.addrMode = Addr16Bit; dstAddr.addr.shortAddr = pRsp-nwkAddr; /调用和上次一样的函数,实现绑定 if ( APSME_BindRequest( sapi_epDesc.simpleDesc-EndPoint, sapi_bindInProgress, &dstAddr, pRsp-epList0 ) = ZSuccess ) /zb_BindDevice()中开启了一个定时器,osal_start_timerEx(sapi_TaskID, ZB_BIND_TIMER, AIB_MaxBindingTime);用于接收Match_Desc_rsp事件计时/如果接收到,则停止这个定时器;如果溢出,则触发相应任务事件 osal_stop_timerEx(sapi_TaskID, ZB_BIND_TIMER); osal_start_timerEx( ZDAppTaskID, ZDO_NWK_UPDATE_NV, 250 ); sapi_bindInProgress = 0xffff; / Find IEEE addr查找IEEE地址 ZDP_IEEEAddrReq( pRsp-nwkAddr, ZDP_ADDR_REQTYPE_SINGLE, 0, 0 ); / Send bind confirm callback to application向应用程序发送绑定确认消息 zb_BindConfirm( sapi_bi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 时间的认识课件
- 秩序岗位服务培训
- 时间和方向课件
- 时间与管理课件讲解
- 2025版电梯维保与应急物资储备服务合同范本
- 二零二五年度市政道路建设项目招投标合同范本
- 二零二五年度矿产资源中介服务合同范例
- 2025版高钙石建筑材料原料购销合作框架协议
- 二零二五年度建筑工程设备租赁及保养合同
- 二零二五年度医疗设备生产与销售及售后服务合同
- 学堂在线 高职实综合英语 章节测试答案
- TSG-T7001-2023电梯监督检验和定期检验规则宣贯解读
- JB T 6527-2006组合冷库用隔热夹芯板
- 千方百剂操作流程
- 油品计量工(高级技师)技能操作理论考试总题库-上(单选题-下部分)
- DB32T 1553-2017 高速公路工程工程量清单计价规范
- 组织知识清单
- GB-T 1040.2-2022 塑料 拉伸性能的测定 第2部分:模塑和挤塑塑料的试验条件
- 城镇燃气安全管理专业知识
- 一页纸的劳动合同范本(5篇)
- 免疫缺陷病PPT精品课件
评论
0/150
提交评论