z-stack 3.0.0和z-stack 3.0.1的End Device的bdb模式存在bug
时间:10-02
整理:3721RD
点击:
bug 1.
函数bdb_joinProcess中,NLME_JoinRequest返回SUCCESS时的处理代码
if(status == ZSuccess) { // The receiver is on, turn network layer polling off. if ( ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE ) { // for an End Device with NO Child Table Management process or for a Router if ( ( ZG_DEVICE_RTR_TYPE ) || ( (ZG_DEVICE_ENDDEVICE_TYPE) && ( zgChildAgingEnable == FALSE ) ) ) { NLME_SetPollRate( 0 ); NLME_SetQueuedPollRate( 0 ); NLME_SetResponseRate( 0 ); } } else { if ( (ZG_SECURE_ENABLED) && (devStartMode == MODE_JOIN) ) { ZDApp_SavedPollRate = zgPollRate; NLME_SetPollRate( zgRejoinPollRate ); } } }
挪动至ZDApp.c下的函数ZDO_JoinConfirmCB中,即在该函数的(status==ZSUCCESS)的处理中加入下列处理代码
if( devState == DEV_NWK_JOINING ) { if ( ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE ) { // for an End Device with NO Child Table Management process or for a Router if ( ( ZG_DEVICE_RTR_TYPE ) || ( (ZG_DEVICE_ENDDEVICE_TYPE) && ( zgChildAgingEnable == FALSE ) ) ) { NLME_SetPollRate( 0 ); NLME_SetQueuedPollRate( 0 ); NLME_SetResponseRate( 0 ); } } else { if ( (ZG_SECURE_ENABLED) && (devStartMode == MODE_JOIN) ) { ZDApp_SavedPollRate = zgPollRate; NLME_SetPollRate( zgRejoinPollRate ); } } }
修改原理:EndDevice在Associate的时候,会自带一条Data Request命令来接收Associate Response。EndDevice在调用NLME_JoinRequest函数时会发起Associate Request请求,并在macPib.responseWaitTime(默认值32,时间=32*15.36ms = 491.52ms)后自动产生一个Data Request。如果此时再调用NLME_SetPollRate来设置Data Request,会产生冲突。如果协调器支持白名单验证,在Associate Response时回复拒绝加入命令,End Device会误触发ZDO_SyncIndicationCB函数。
bug2:函数bdb_rejoinNwk不必打开RX。对于EndDevice来说,rejoin命令发出后会自动发出Data Request。以下代码可以屏蔽
uint8 tmp = true; ZMacSetReq( ZMacRxOnIdle, &tmp );
不能算是bug,
1,不会有影响,因为在Associate Request以后的Data Request是直接发送的。
2,这个时间是非常短的,如果对功耗扣的非常细的话,可以这么优化。
谢谢!
这个经验不错,MARK一下。