cc2430 zigbee模块的 SimpleApp 例子解读-2 程序分析

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

学习zigbee入门SimpleApp例子解读-2程序分析:灯开关灯实验:开关设备通过发送命令切换控制设备的状态,并通过指示灯的状态变化反应操作是否成功。在SimpleApp,SimpleController.c(灯管理器设备)按键处理函数zb_HandleKeys中,当SW1被按下,它将使设备作为协调器使用;期间按下SW2,它将是该设备作为路由器启动。1.网络形成:ZDO_StartDevice功能描述:在网络中启动设备,协调器、路由器、终端设备都可以用该函数启动,启动之后,设备根据自身的类型去建立或发现和加入网络。看看ZDO_StartDevice函数完整形式:voidZDO_StartDevice(bytelogicalType,devStartModes_tstartMode,bytebeaconOrder,bytesuperframeOrder){ZStatus_tret;ret=ZUnsupportedMode;#ifdefined(ZDO_COORDINATOR)//--条件编译语句,选择性的启动协调器if(logicalType==NODETYPE_COORDINATOR)//--逻辑类型,协调器{if(startMode==MODE_HARD)//--启动模式,硬件启动(软件启动无线龙注释暂不启动){devState=DEV_COORD_STARTING;//--协调器启动ret=NLME_NetworkFormationRequest(zgConfigPANID,zgDefaultChannelList,//--网路形成请求zgDefaultStartingScanDuration,beaconOrder,superframeOrder,false);}elseif(startMode==MODE_RESUME)//--恢复{//JuststartthecoordinatordevState=DEV_COORD_STARTING;ret=NLME_StartRouterRequest(beaconOrder,beaconOrder,false);//--路由启动请求}else{#ifdefined(LCD_SUPPORTED)//--液晶显示支持(--条件编译)//HalLcdWriteScreen(StartDeviceERR,MODEunknown);ClearScreen();Print8(HAL_LCD_LINE_1,10,StartDeviceERR,1);Print8(HAL_LCD_LINE_2,10,MODEunknown,1);#endif}}#endif//!ZDO_COORDINATOR#if!defined(ZDO_COORDINATOR)||defined(SOFT_START)//--不是协调器,软件启动if(logicalType==NODETYPE_ROUTER||logicalType==NODETYPE_DEVICE)//--逻辑类型,路由,终端设备{if((startMode==MODE_JOIN)||(startMode==MODE_REJOIN))//--启动模式,加入,再加入{devState=DEV_NWK_DISC;#ifdefined(MANAGED_SCAN)//--管理扫描ZDOManagedScan_Next();//--调用管理扫描ret=NLME_NetworkDiscoveryRequest(managedScanChannelMask,BEACON_ORDER_15_MSEC);//--网络发现请求#elseret=NLME_NetworkDiscoveryRequest(zgDefaultChannelList,zgDefaultStartingScanDuration);#endif}elseif(startMode==MODE_RESUME)//--恢复{if(logicalType==NODETYPE_ROUTER)//--路由{ZMacScanCnf_tscanCnf;//--扫描确认devState=DEV_NWK_ORPHAN;//--设备已经失去了其母节点的信息/*ifrouterandnvramisavailable,fakesuccessfulorphanscan*///--如果路由器和NVRAM可用,假成功的孤儿扫描scanCnf.hdr.Status=ZSUCCESS;scanCnf.ScanType=ZMAC_ORPHAN_SCAN;scanCnf.UnscannedChannels=0;scanCnf.ResultListSize=0;nwk_ScanJoiningOrphan(&scanCnf);ret=ZSuccess;}else//--终端节点{devState=DEV_NWK_ORPHAN;ret=NLME_OrphanJoinRequest(zgDefaultChannelList,//--再加入请求zgDefaultStartingScanDuration);}}else{#ifdefined(LCD_SUPPORTED)//HalLcdWriteScreen(StartDeviceERR,MODEunknown);Print8(HAL_LCD_LINE_1,10,StartDeviceERR,1);Print8(HAL_LCD_LINE_2,10,MODEunknown,1);#endif}}#endif//!ZDOCOORDINATOR||SOFT_STARTif(ret!=ZSuccess)osal_start_timerEx(ZDAppTaskID,ZDO_NETWORK_INIT,NWK_RETRY_DELAY);}2、绑定:zb_BindDevice----已知扩展地址的绑定(1.4.3-1.2.1把已知和未知的结合起来了,还结合了绑定移除)---未知设备扩展地址的绑定---移除绑定//--设备建立绑定和移除绑定信息相关voidzb_BindDevice(uint8create,//--是否创建绑定,ture为创建,false则解除uint16commandId,//--命令ID,基于某种命令的绑定uint8*pDestination)//--指向扩展地址的指针{zAddrType_tdestination;//--目的设备的类型uint8ret=ZB_ALREADY_IN_PROGRESS;//--if(create)//--是否创建绑定,ture为创建,false则解除{if(sapi_bindInProgress==0xffff)//--绑定地址为0xffff{if(pDestination)//--已知扩展地址的绑定,即*pDestination为非NULL{destination.addrMode=Addr64Bit;//--目的地址模式,长地址osal_cpyExtAddr(destination.addr.extAddr,pDestination);//--把扩展地址复制到extAddr中//--通过APSME_BindRequest创建绑定请求ret=APSME_BindRequest(sapi_epDesc.endPoint,commandId,&destination,sapi_epDesc.endPoint);if(ret==ZSuccess){//Findnwkaddr//--发现网络地址,得到被绑定设备的短地址ZDP_NwkAddrReq(pDestination,ZDP_ADDR_REQTYPE_SINGLE,0,0);osal_start_timerEx(ZDAppTaskID,ZDO_NWK_UPDATE_NV,250);}}else{ret=ZB_INVALID_PARAMETER;destination.addrMode=Addr16Bit;destination.addr.shortAddr=NWK_BROADCAST_SHORTADDR;if(ZDO_AnyClusterMatches(1,&commandId,sapi_epDesc.simpleDesc-AppNumOutClusters,sapi_epDesc.simpleDesc-pAppOutClusterList)){//Trytomatchwithadeviceintheallowbindmode--匹配一个允许绑定模式下的设备ret=ZDP_MatchDescReq(&destination,NWK_BROADCAST_SHORTADDR,sapi_epDesc.simpleDesc-AppProfId,1,&commandId,0,(cId_t*)NULL,0);}elseif(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){//Setatimertomakesurebindcompletes--设置一个时间,确保绑定完成。osal_start_timerEx(sapi_TaskID,ZB_BIND_TIMER,AIB_MaxBindingTime);sapi_bindInProgress=commandId;//--允许基于命令的绑定过程return;//dontsendcbackevent}}}SAPI_SendCback(SAPICB_BIND_CNF,ret,commandId);}//--endif(creat)else//--绑定移除{//RemovelocalbindingsforthecommandIdBindingEntry_t*pBind;//Loopthroughbindingsanremoveanythatmatchtheclusterwhile(pBind=bindFind(sapi_epDesc.simpleDesc-EndPoint,commandId,0)){bindRemoveEntry(pBind);//--完成从绑定表中移除绑定条目}osal_start_timerEx(ZDAppTaskID,ZDO_NWK_UPDATE_NV,250);}//--endelsereturn;}在上面调用了APS绑定函数APSME_BindRequest(),该函数如下原型:externZStatus_tAPSME_BindRequest(byteSrcEndpInt,uint16ClusterId,zAddrType_t*DstAddr,byteDstEndpInt);在两个设备之间建立绑定,通过调用函数APSME-BIND.confirm返回,如果绑定成功调用ZDP_NwkAddrReq()得到目的设备的16位短地址。afStatus_tZDP_NwkAddrReq(byte*IEEEAddress,//--被请求设备的IEEE地址byteReqType,//--想得到的响应类型byteStartIndex,byteSecurityEnable);ReqType//--想得到的响应类型,它的值可能有以下两者之一:ZDP_NWKADDR_REQTYPE_SINGLE:返回设备的短地址和扩展地址。ZDP_NWKADDR_REQTYPE_EXTENDED:返回设备的短地址和扩展地址和所有相关设备的短地址。调用这个函数可以产生一个根据已知遥远设备的IEEE地址,请求得到16

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功