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.

终端切换父节点,由协调器切换到路由时候,短地址为什么改变了?

协调器重启,终端的父节点切换为路由,结果终端的短地址发生变化了。是正常的吗?如何修改能使短地址不改变呢?最新协议栈。

抓包过程:

终端F1AD(最新协议栈)在98行协调器重启重新组网加入路由3F32,107行发出announce短地址变为BD01。在470行终端又切换父节点到协调器短地址变回F1AD。

但是终端A1CC(老协议栈)在协调器重启后在178行加入路由节点,短地址就没有变化。

请问新协议栈要如何修改,使用的是最新1.2.2a zha sw的例程

短地址因为切换协调器和路由而改变.zip
  • 来人看看抓包数据啊

  • 你是不是用的EZMODE?

  • 没有使能ezmode

  • 我看到最新协议栈ZDConfig_UpdateNodeDescriptor中不论是路由还是终端都初始化为     | CAPINFO_ALLOC_ADDR,这个位是1表示终端由父节点分配短地址,0表示终端字节保存短地址。

    终端短地址变化是路由导致还是终端自己导致的呢?老版本协议栈终端初始化没有置1.

  • 是这个原因导致问题的,你可以看98行的Rejoin Request里面的, Allocate Address是1,所以父设备才会重新分配地址。

    但是在新版本的协议栈,如果你的父设备也是新版本的,那就不会出现这个问题,因为在处理Rejoin Request的时候,就不会去关注关于Allocate Address这个位。

    这个位主要用于第一次Associate Request的使用的。

    你可以在Rejoin Request之前把这个bit去掉。

    1)_NIB.CapabilityFlags=_NIB.CapabilityFlags&0x7F

    2)NLME_ReJoinRequest,程序里面可以搜索在哪里调用

    3)_NIB.CapabilityFlags=_NIB.CapabilityFlags|0x80

  • VV 说:

    是这个原因导致问题的,你可以看98行的Rejoin Request里面的, Allocate Address是1,所以父设备才会重新分配地址。

    但是在新版本的协议栈,如果你的父设备也是新版本的,那就不会出现这个问题,因为在处理Rejoin Request的时候,就不会去关注关于Allocate Address这个位。

    这个位主要用于第一次Associate Request的使用的。

    你可以在Rejoin Request之前把这个bit去掉。

    1)_NIB.CapabilityFlags=_NIB.CapabilityFlags&0x7F

    2)NLME_ReJoinRequest,程序里面可以搜索在哪里调用

    3)_NIB.CapabilityFlags=_NIB.CapabilityFlags|0x80

    VV 你好,我这边所有设备用的都是Home1.2.2a出现过这个问题,追溯代码发现,

    1.在ZDapp.c文件1576行左右,ZDApp_ProcessNetworkJoin函数里有这样一段代码:

    if ( (NLME_GetShortAddr() != INVALID_NODE_ADDR) ||
    (_NIB.nwkDevAddress != INVALID_NODE_ADDR) )
    {
    uint16 addr = INVALID_NODE_ADDR;
    // Invalidate nwk addr so end device does not use in its data reqs.
    _NIB.nwkDevAddress = INVALID_NODE_ADDR;
    ZMacSetReq( ZMacShortAddress, (uint8 *)&addr );
    }

    此代码显示了 如果设备当年的短地址不是无效地址(0xfffe),那么就将其置为无效地址(0xfffe),这是为什么

    2.在ZDapp.c文件1215行左右,ZDApp_ProcessOSALMsg函数里有这样一段代码:

    // Before trying to do rejoin, check if the device has a valid short address
    // If not, generate a random short address for itself
    if ( _NIB.nwkDevAddress == INVALID_NODE_ADDR )
    {
    uint16 commNwkAddr;

    // Verify if the Network address has been commissioned by external tool
    if ( ( osal_nv_read( ZCD_NV_COMMISSIONED_NWK_ADDR, 0,
    sizeof(commNwkAddr),
    (void*)&commNwkAddr ) == ZSUCCESS ) &&
    ( commNwkAddr != INVALID_NODE_ADDR ) )
    {
    _NIB.nwkDevAddress = commNwkAddr;

    // clear Allocate address bit because device has a commissioned address
    _NIB.CapabilityFlags &= ~CAPINFO_ALLOC_ADDR;
    }
    else
    {
    _NIB.nwkDevAddress = osal_rand();
    }

    ZMacSetReq( ZMacShortAddress, (byte*)&_NIB.nwkDevAddress );
    }

    这个代码显示了 当设备当前地址为无效地址的时候,会重新生成一个短地址,并配置发送出去

    我现在猜想是不是这两段代码让设备短地址产生了变化,因为这两段代码涉及到设备入网啊重入之类的过程,甚是复杂,调用关系不明显,能解释一下为什么会有这两段代码以及他们之间的关系吗?

  • 第一处是路由节点才会执行的代码。

    第二处是rejoin模式执行的。也不明白是为了什么。既然是rejoin肯定是陪过网的设备了,没有陪过网的是join。既然陪过网的设备,什么情况会导致地址是无效的呢?如果无效地址则读取nv,如果读不到关联地址就随机生成一个,这样是不是地址就变化了呢?这样做的目的是为了解决一个已经入网的设备在重新入网出现问题的情况下依然能加入原来的网络而设计的吗?

  • d第98行也没有什么啊?

    全局只有一处使用NLME_ReJoinRequest,在case ZDO_NWK_DISC_CNF:里面。

    你是说在NLME_ReJoinRequest之前手动把 Allocate Address的位置0吗?