This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
SDK:simplelink_cc13x2_26x2_sdk_5_10_00_48
使用Zstackapi_pauseResumeDeviceReq暂停网络时间过长时,再进行恢复网络操作导致设备无法恢复网络,调试发现可以触发ZDO_beaconNotifyIndCB,间隔很久之后才会触发ZDO_NetworkDiscoveryConfirmCB
抓包发现也是先发送becaon req,也接收到了becaon rsp,但是rejoin req间隔了很久才出现
ZED节点上,例程将按键指向事件改为自定义的暂停恢复事件,设置zstack_pauseResumeDeviceReq.pause = true;调用Zstackapi_pauseResumeDeviceReq进行暂停网络,间隔13分钟左右,然后设置zstack_pauseResumeDeviceReq.pause = false;调用Zstackapi_pauseResumeDeviceReq进行恢复网络,此时会延迟18分钟左右ZDO才能接收到ZDO_NWK_DISC_CNF进行后续的rejoin,感觉是在zstack线程阻塞住了。
if(appServiceTaskEvents & GENERICAPP_NETWORK_PAUSE_EVT) { zstack_pauseResumeDeviceReq_t zstack_pauseResumeDeviceReq = { 0 }; zstack_pauseResumeDeviceReq.pause = true; Zstackapi_pauseResumeDeviceReq(appServiceTaskId, &zstack_pauseResumeDeviceReq); appServiceTaskEvents &= ~GENERICAPP_NETWORK_PAUSE_EVT; } if(appServiceTaskEvents & GENERICAPP_NETWORK_RESUME_EVT) { zstack_pauseResumeDeviceReq_t zstack_pauseResumeDeviceReq = { 0 }; zstack_pauseResumeDeviceReq.pause = false; Zstackapi_pauseResumeDeviceReq(appServiceTaskId, &zstack_pauseResumeDeviceReq); appServiceTaskEvents &= ~GENERICAPP_NETWORK_RESUME_EVT; }
我在LaunchPad开发板上确实复现了您所说的现象,但具体原因的分析需要产品线协助。我已将此问题反馈至英文E2E论坛:
有结果后会第一时间在此进行更新,您也可以直接在英文帖子中补充讨论,谢谢。
Best regards,
Shuyang
我的账户无法在英文论坛参与讨论,但是这个API在DMM_OAD项目中被DMMPolicy_registerAppCbs使用,使用这个API暂停时的确会关闭pollrate轮询,此时进入休眠模式,在恢复时如果出现故障,会在使用无线电进行beaconReq后阻塞zstackTask,导致设备无法进入休眠模式,跟Ryan Brown1所说的故障相同
我在开发板上用断点调试,在发出beacon request之后到发送Rejoin request这一段时间程序可以单步走的,您说zstackTask被阻塞住了,是有发现程序具体卡在某一个语句中吗?如果有这个线索,会帮助我们进一步定位问题所在。
Best regards,
Shuyang
也许不是阻塞,但是故障发生之后将无法向macTask发送指令,无法进入ZMacEventLoop触发MAC_SCAN_TASK_EVT,这导致无法进行rejoin操作;即使是手动触发Zstackapi_DevNwkDiscReq这类API也不行,由于这些在ROM中,我无法进一步进行调试。
现在我尝试在ZDApp_ResumeNwk中添加ZMacReset(FALSE),似乎可以解决这一故障,但是不清楚这具体重置了什么。
void ZDApp_ResumeNwk() { APSME_HoldDataRequests(0); // Enable APS data request again if ( 0 != ZG_BUILD_COORDINATOR_TYPE || 0 != ZG_BUILD_RTR_TYPE ) { NLME_SetLinkStatusTimer(); byte val = TRUE; ZMacSetReq(ZMacRxOnIdle, &val); ZDApp_SetParentAnnceTimer(); } else if ( ZG_DEVICE_ENDDEVICE_TYPE ) { ++ ZMacReset(FALSE); //This will set the poll rate as it was before. nwk_SetCurrentPollRateType( POLL_RATE_DISABLED, FALSE ); //this will prepare the device to perform rejoin and will send the notification to the app that the parent is lost. bdb_parentLost(); } }
我和产品线的应用工程师讨论了这个问题,目前怀疑是在bdb_parentLost函数中调用的ZMacSetReq会导致出现问题,产品线正在进一步调查此问题,并会在后续SDK当中进行改进,谢谢。
Best regards,
Shuyang