现象描述:
z-stack 3.0,ZigBee网络中分别有一ZED(CC2652R)一协调器ZC,ZED作为开关(samplesw),等其两者互相组网成功后人为断开ZC电源,ZED代码里有处理丢失父节点的流程,Zstackapi_bdbZedAttemptRecoverNwkReq(),若连续发送三次beacon(间隔一秒)无反应后就不再发送请求rejoin的beacon(原先例子的流程是会一直发,这里因为开关是用钮扣电池的,为了节能,就让其发送有限次),ZC断电一二十分钟后,再重新上电,触摸ZED开关,抓包工具没有任何beacon发送,重新弹出钮扣电池再看还是没有任何beacon发出,疑似ZED“睡死”。
注:ZED工程配置了RFD_RCVC_ALWAYS_ON为FALSE,NV_RESTORE;
请教问题:
上述现象中,ZED是真的进入“睡死”模式了吗,这里面的流程是什么,这其中有什么深层次的触发“睡眠”机制吗,怎样避免这种“睡死”呢(除了像原始例子代码那样一直发请求beacon或者RFD_RCVC_ALWAYS_ON = TRUE)?
注:更新了最新的SDK,情况还是一样,不知道是否与电源管理这块有关,还望TI工程师及专家们能够于百忙之中稍予解决,谢谢啦!
Mike&Hu:
补充:如果每间隔15秒发送rejoin beacon情况也是一样,而10秒到14秒间隔发送频率一二十分钟内则可以恢复正常。
YiKai Chen:
再重新上电,触摸ZED开关你有調用Zstackapi_bdbZedAttemptRecoverNwkReq嗎?
Mike&Hu:
回复 YiKai Chen:
调用了,在zclSampleSw_process_loop->appServiceTaskEvents & SAMPLEAPP_CAP_TOUCH_KEY_PRESS_VET事件调用接口里面调用了
if(bdbAttributes.bdbCommissioningMode & BDB_COMMISSIONING_MODE_PARENT_LOST) { /*parent lost*/ //attempt to rejoin again after a fixed delay Timer_setTimeout( EndDeviceRejoinClkHandle, SAMPLEAPP_END_DEVICE_REJOIN_DELAY ); //该定时器会间接调用Zstackapi_bdbZedAttemptRecoverNwkReq Timer_start(&EndDeviceRejoinClkStruct); return; }
YiKai Chen:
回复 Mike&Hu:
你調試你的程序看看触摸ZED开关時,你ZED有進入BDB_COMMISSIONING_MODE_PARENT_LOST這個case嗎?
Mike&Hu:
回复 YiKai Chen:
ZC断电时间长了之后(如一小时),触摸ZED开关LED不亮(case中添加了点亮LED的操作),这说明应该是没有进入,也就无法调用那个Zstackapi_bdbZedAttemptRecoverNwkReq接口来恢复网络了。所以当前的问题就是为什么parent lost时间长了会进入不了事件处理,是不是某种机制引起了深度睡眠?
Mike&Hu:
回复 YiKai Chen:
重新上电ZC,触摸开关,抓包工具上没有任何beacon发出,几分钟都没反应
YiKai Chen:
回复 Mike&Hu:
以zed_sw為例,照理來說zclSampleSw_ProcessCommissioningStatus的case BDB_COMMISSIONING_PARENT_LOST:會一直被觸發,你自己的例程有嘛?
Mike&Hu:
回复 YiKai Chen:
嗯,如果一切正常的话,case BDB_COMMISSIONING_PARENT_LOST会一直被触发,这case下面对应的操作是先连续发送(每个一秒)三次请求rejoin的beacon,触发调用Zstackapi_bdbZedAttemptRecoverNwkReq,
Timer_setTimeout( EndDeviceRejoinClkHandle, SAMPLEAPP_END_DEVICE_REJOIN_DELAY );
Timer_start(&EndDeviceRejoinClkStruct);
为了节能起见,超过三次之后就不调用Zstackapi_bdbZedAttemptRecoverNwkReq了,触摸开关对应的响应里面有调用Zstackapi_bdbZedAttemptRecoverNwkReq,之前的逻辑是进入这个case后会一直调用Zstackapi_bdbZedAttemptRecoverNwkReq,直到网络恢复成功,但是这样能耗较大,钮扣电池用不了多长时间。现在ZC断电时间久了,触摸ZED开关没反应,也就调用不了Zstackapi_bdbZedAttemptRecoverNwkReq了。
YiKai Chen:
回复 Mike&Hu:
那你應該先查為什麼触摸ZED开关没反应
Mike&Hu:
回复 YiKai Chen:
嗯,这个问题我也一直在排查,除了硬件上的因素外,Z-stack 3.0.1 对sw这块没有什么类似“深度睡眠”机制吗?如长时间不发送beacon + 长时间收不到回复这种条件下,ZigBee会进行什么样的后续动作呢?