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.

终端不能入网upate device remove device

终端用着用着就不掉线了,并且重置后也不能入网。

请问抓包这两条数据是怎么回事?什么情况导致这个发送的?怎么处理呢?

但测试加入别的协调器是正常的。

终端发出关联请求后如果有应答则父节点发送key,然后终端收到key后发送device announced 则入网成功

加不进去update device.zip
  • 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?

  • 你解决了吗??我也遇到这种情况

x 出现错误。请重试或与管理员联系。