终端不能入网upate device remove device
终端用着用着就不掉线了,并且重置后也不能入网。
请问抓包这两条数据是怎么回事?什么情况导致这个发送的?怎么处理呢?
但测试加入别的协调器是正常的。
终端发出关联请求后如果有应答则父节点发送key,然后终端收到key后发送device announced 则入网成功
1186行1363行都有不能入网的抓包。
ZDApp_ProcessSecMsg函数中
ZDO_UPDATE_DEVICE_IND:
中ZDSecMgrDeviceJoin函数中只用当ZDSecMgrDeviceValidate返回失败,只有当ZDSecMgrPermitJoiningEnabled ==FALSE的时候才会更新失败。
但是搜索ZDSecMgrPermitJoiningEnabled 只有超时的时候才会FALSE,那么问题在那里呢?
那么当upate device的时候,什么情况下协调器会remove device呢?
ZDO_REMOVE_DEVICE_IND:
@VV 求助啊
应该是路由设备的permit join打开了,但是协调器的permit join没有打开或者已经timeout了。
你说的确实是一种可能性。但是前面有允许组网的广播60s,后面有停止入网的广播0.协调器不应该没有开启啊,或者开启失败了,超时的函数也没有看到,这2个原因在代码上都查不到啊。该怎么处理呢?
我调试了一下,发生这个问题的情况只有一个ZDSecMgrPermitJoiningEnabled=flase。协调器初始化为true。从来没有把ZDSecMgrPermitJoiningEnabled=flase的地方。
只有当入网时间结束会进入回调函数ZDSecMgrPermitJoiningTimeout中判断if ( ZDSecMgrPermitJoiningTimed == TRUE )。但实际上ZDSecMgrPermitJoiningTimed 和ZDSecMgrPermitJoiningEnabled两个标志位的修改只有在ZDSecMgrPermitJoining函数中根据入网时间duration修改的。但ZDSecMgrPermitJoining函数在协调器中是不会执行的,ZDSecMgrPermitJoining函数只有收到广播Management Permit Joining时候执行,正常只有路由节点执行这个过程。
但是协调器发出入网广播的时候,如果路由节点很多,有时候协调器会重复收到允许入网,则协调器会执行上述路由节点执行的
#if defined ( ZDO_MGMT_PERMIT_JOIN_RESPONSE ) && ( ZG_BUILD_RTR_TYPE )
{ Mgmt_Permit_Join_req, ZDO_ProcessMgmtPermitJoinReq },
中的ZDSecMgrPermitJoining函数对ZDSecMgrPermitJoiningEnabled,ZDSecMgrPermitJoiningTimed 两个标志修修改,当入网时间结束时候都修改成flase了。但协调器只有初始化时候才会把ZDSecMgrPermitJoiningEnabled=ture。
所以修改版本是,修改协调器发出入网广播的同时把ZDSecMgrPermitJoiningEnabled=ture。
不知道上面分析的是否正确
#define ZDO_ProcessMgmtPermitJoinTimeout NLME_PermitJoiningTimeout
能不能是你退网时,没有清空nv?
你解决了吗?我也遇到这种情况