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.

cc2530 zigbee网络换了协调器后无法通信

请教大家一个问题。我组好的一个zigbee网络,一个协调器和10个路由,可以正常通信。现在我把这个协调器断电,把另一个协调器上电,然后把路由一个个的清除网络,让他们重新入网。这些路由会加入这个新的协调器里面,并且会给协调器发一条入网后的指令。但是协调器只能控制以他为父节点加入网的路由,不能控制通过路由入网的节点,是什么原因?协调器给路由发数据用的是MAC地址

  • 你节点也需要擦除网络信息,重新入网,你原来的节点还在原来的网络中无法加入新的网络。
  • 我的节点已经擦除了网络信息,并且已经加入了新的网络里,只是协调器现在只能控制以他为父节点的路由
  • 请上传抓包文件
  • 现在只能控制图里圈出的两个
  • 能否上伝完整抓包档
  • 抓包文件已上传,请大神帮忙看下什么问题,谢谢
  • 你其他设备没有入网成功,你这个抓包文件不完整吧。
  • 这个抓包文件是我控制不能通信的路由节点抓的数据。其他设备应该已经入网成功了。我在程序里面做的处理是当路由节点入网后会给协调器发一个信息,信息里面包含这个路由的MAC地址。现在我给路由设备上电后,路由会给协调器发这个信息,协调器也收到了,但是协调器给路由发数据路由收不到(使用MAC地址通信),路由给协调器发数据是短地址的方式。
  • 可以看一下这个抓包文件,第75包是这个路由上电入网后给协调器发送的数据,协调器收到后会给路由回一包数据,抓包却看不到回的这包数据,不知道是不是协调器找不到这个路由的网络地址。我协调器给路由发数据前会先调用:ZDP_NwkAddrReq(DestMac, ZDP_ADDR_REQTYPE_SINGLE, 0, 0 );//让MAC地址对应的模块把自己网络短地址回复给我     ,然后30ms后再发数据,按理说不应该找不到网络地址抓包数据1.psd

  • 可能之前描述的可能不太清楚,我把问题再描述一遍:用的协议栈是2.5.1,协调器给路由发数据用的是MAC地址的方式,路由给协调器发数据用短地址方式。现在是一个协调器,10个路由分布在公司,建好了一个网络,可以正常通信。我现在把这个协调器断电,然后换另一个协调器,然后把路由原来的网络信息清除掉,10个路由会加入这个新的协调器网络里面。正常情况下,路由入网后会给协调器发一包数据,协调器收到后会回一包数据。目前协调器可以收到10个路由入网发送的这包数据,串口可以打印这包数据,抓包也可以看到这包数据,并且路由的网络ID也变成了新的网络的ID,可以证明路由设备确实加入了新的网络。但是协调器给部分路由回复的数据抓包看不到,协调器也无法和部分路由通信(只有两个路由可以通信,这两个路由都是已协调器为父节点的,其它路由都是通过路由加入的新网络)。如果把不能通信的路由拔掉放在协调器旁边,重新入网,就可以正常通信了。不知道是什么原因,请大神帮忙分析下

  • 可能之前描述的可能不太清楚,我把问题再描述一遍:用的协议栈是2.5.1,协调器给路由发数据用的是MAC地址的方式,路由给协调器发数据用短地址方式。现在是一个协调器,10个路由分布在公司,建好了一个网络,可以正常通信。我现在把这个协调器断电,然后换另一个协调器,然后把路由原来的网络信息清除掉,10个路由会加入这个新的协调器网络里面。正常情况下,路由入网后会给协调器发一包数据,协调器收到后会回一包数据。目前协调器可以收到10个路由入网发送的这包数据,串口可以打印这包数据,抓包也可以看到这包数据,并且路由的网络ID也变成了新的网络的ID,可以证明路由设备确实加入了新的网络。但是协调器给部分路由回复的数据抓包看不到,协调器也无法和部分路由通信(只有两个路由可以通信,这两个路由都是已协调器为父节点的,其它路由都是通过路由加入的新网络)。如果把不能通信的路由拔掉放在协调器旁边,重新入网,就可以正常通信了。不知道是什么原因,请大神帮忙分析下

  • 抓包檔裡面只看到路由一直在廣播 network address request (這個應該要用單播)還有在route request找協調器,你抓包檔裡面是那個路由沒辦法通信嗎?

  • 你可以去debug 或者输出af datarequest的 返回值。
    你尝试用下面的code去清除NV:
    /Set the device as factory new
    zgWriteStartupOptions(ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_CONFIG_STATE | ZCD_STARTOPT_DEFAULT_NETWORK_STATE);
    然后重启。
  • 原本的程序里面已经加了gWriteStartupOptions(ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_CONFIG_STATE | ZCD_STARTOPT_DEFAULT_NETWORK_STATE);,也有重启,af datarequest的 返回值是0x00
  • 你發送是用單播還是廣播?
  • 有点奇怪了,你试试用SmartRF Flash Programmer擦除,重新烧录正常吗?或者你改成单播的16bit的地址试试。
  • 0x916C是网络ID,不是路由设备。那个抓包文件是协调器给一个无法通信的路由发数据的文件。协调器给路由发数据用的是MAC地址方式,发送数据之前会先调用ZDP_NwkAddrReq(DestMac, ZDP_ADDR_REQTYPE_SINGLE, 0, 0 );//让MAC地址对应的模块把自己网络短地址回复给我    ,30ms之后才真正的发数据,所以可以看到广播信息。抓包文件里面看不到协调器真正发的数据,我猜测是不是协调器找不到这个路由的网络地址,所以数据没有发出去。用的是单播,图片是协调器给路由发数据的部分程序

  • 你在看你的抓包文件中一直在发NWK address request ,没有response,所以我让你用单播16bit短地址去试一下,你可以通过绑定或者announce去拿到地址。

  • extern uint16 NLME_GetShortAddr( void );
  • 沒看到你抓包裡面有nwk address response應該你的程序就不會去發送吧,你要不要調試一下你的程序看看
  • 你好,按照我对zigbee地址管理的理解,如果路由和协调器通信过以后,协调器在底层应该会建立短地址和MAC地址的一个映射表,这样的话可以通过MAC找到短地址,然后通信。现在路由上电后会给协调器发一包数据,协调器也收到了,是不是可以认为协调器在底层已经建立好了这个地址映射?并且我在发数据之前也调用了ZDP_NwkAddrReq(DestMac, ZDP_ADDR_REQTYPE_SINGLE, 0, 0 );来获得要通信路由的短地址。现在更换网络后只有通过路由入网的设备不能通信,我有几个问题不太明白:1.不知道路由有没有类似于协调器这样的地址管理,会不会是换了网络后路由保存的他下面节点地址信息混掉了,所以导致不能通信;2.有没有那个函数或者什么方法,可以清除协调器和路由下面节点的所有信息的,这样就不会导致地址信息混掉了。我想先用这种方法测试下,因为用短地址的方式通信对于现在的程序改动有点大,并且实际应用中父节点换了或者换了协调器短地址会变,所以可能还是要用MAC地址的方式通信。是在不行的话在用短地址试下
  • 这个地址是ZC分配的

    你可以使用下面的函数去更新地址
    /*********************************************************************
    * @fn ZDO_UpdateAddrManager
    *
    * @brief Update the Address Manager.
    *
    * @param nwkAddr - network address
    * @param extAddr - extended address
    *
    * @return none
    */
    void ZDO_UpdateAddrManager( uint16 nwkAddr, uint8 *extAddr )
    {
    AddrMgrEntry_t addrEntry;

    // Update the address manager
    addrEntry.user = ADDRMGR_USER_DEFAULT;
    addrEntry.nwkAddr = nwkAddr;
    AddrMgrExtAddrSet( addrEntry.extAddr, extAddr );
    AddrMgrEntryUpdate( &addrEntry );
    }

    你可以通过下面的去获取IEEE或者短地址一样的,
    * This function will return a pointer to the device's IEEE 64 bit address
    *
    * This function resides in nwk_util.c.
    */
    extern byte *NLME_GetExtAddr( void );

    /*
    * This function will return this device's 16 bit short address
    *
    * This function resides in nwk_util.c.
    */
    extern uint16 NLME_GetShortAddr( void );
  • 你好,我现在已经定位到了问题原因,但不知道怎么解决,我发现不能通信的路由他的短地址已经变了,但我用MAC地址通信的时候他还是用原来那个短地址去通信,所以就通信不上了。请问这个怎么解决
  • 照理來說短地址不應該改變,你測試的時候有使能NV_RESTORE嗎?
  • 我更多的是用bind,或者match获取地址,你路由地址变了很正常因为你已经重新加入看一个新的地址,你要用新的地址。NLME_GetShortAddr你先用这个获取新的短地址发送试一下。
  • Yk, 他擦除了NV,然后重新入网的,后来没有获取到新的短地址,用之前的发的。
  • 擦除了NV重新入网就必須获取到新的短地址才能正確发送信息
  • NLME_GetShortAddr这个我是知道的,但这个是获得自己的短地址,但是对于协调器来说是不是还不知道这个路由的短地址呢?还是说只要路由自己重新获得了自己的短地址,协调器也会知道了?
  • 你可以用device announce获取,在一个设备入网时候会发出device announce.
  • 这样改了,还是不行,路由每个3分钟会给协调器发心跳包,现在协调器可以收到心跳包,但协调器发的数据路由还是收不到
  • 协调器发数据到路由有用對的短地址嗎?
  • 准确说是协调器没有把数据发出来,附件是抓包文件,第11到第27是可以正常时抓的数据,第30包开始时无法通信的时候抓的数据,大神可以帮忙看下是哪里不一样吗抓包文件2.zip

  • 抓包文件第31行有看到0xBE94回覆nwk address response,你的協調器是用短地址0xBE94發送封包嗎?

  • 不是的,我使用长地址21 FD 0C 17 00 4B 12 00发送的,它对应的短地址就是0xBE94
  • 第11到第27行也沒有看到你有用长地址21 FD 0C 17 00 4B 12 00发送的封包啊,你有用长地址21 FD 0C 17 00 4B 12 00发送成功過嗎?
  • 我这个是给两个路由发的数据,11到27是给路由9A C6 64 18 00 4B 12 00发的,这个发成功了,下一包是给21 FD 0C 17 00 4B 12 00,这个没成功
  • 你好,Alvin Chen,今天我又把zigbee节点组网的流程重新走了一遍,发现协调器无法和路由通信的现象不是更换协调器造成的。我现在的测试流程是这样的:

                  测试1、我把协调器和3个路由都擦除重新烧程序,把协调器上电,然后依次给3个路由上电,其中路由0x0af8和0x1280直接以协调器为父节点入网的,另一个路由0x11de是以路由0x1280为父节点入网的。现在现象依然是3个路由都可以给协调器发数据,协调器给路由0x1280通信不成功,抓包现象还是nwk address  request 没应答。协调器给路由是MAC地址的方式通信的,路由给协调器是短地址。路由 有获得自己的短地址,程序如下:

    if ( (SampleApp_NwkState == DEV_ZB_COORD) || (SampleApp_NwkState == DEV_ROUTER)  || (SampleApp_NwkState == DEV_END_DEVICE) )

                   {  

                      NwkAddr=NLME_GetCoordShortAddr();   //获得自己的短地址

                   }    抓包数据3.zip

    协调器给路由发数据的时候有通过路由的MAC地址去获取短地址,程序如下:

      memcpy(SampleApp_DstAddr.addr.extAddr,DestMac,8); //把MAC地址给到发送函数的形参里

                     LED2 = 0;

                     ZDP_NwkAddrReq(DestMac, ZDP_ADDR_REQTYPE_SINGLE, 0, 0 );//让MAC地址对应的模块把自己网络短地址回复给我                        

                     osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_MY_EVT1 , 30 );  //30ms后启动发送事件      

                 测试2、我让3个路由都已协调器为父节点入网成功后,再把路由的网络清除,然后让他们重新入网,这个时候有两个路由是以协调器为父节点入网,一个以路由为父节点入网,结果是协调器就可以和3个路由都通信了。

               根据这两个测试,是不是说明用MAC地址通信的时候,如果节点是通过路由入的网,协调器就无法和其通信呢?请问有什么方法解决呢?还有device announce.是设备入网后自己发出的吧,不需要我来处理?附件是测试1里3个路由入网过程以及协调器给路由0x11de发数据的抓包结果,抓包来看还是和昨天一样的。非常感谢你的帮助。

  • if ( (SampleApp_NwkState == DEV_ZB_COORD) || (SampleApp_NwkState == DEV_ROUTER) || (SampleApp_NwkState == DEV_END_DEVICE) )

    {

    NwkAddr=NLME_GetCoordShortAddr(); //获得自己的短地址
    /*********************************/
    修改为NwkAddr NLME_GetShortAddr

    }
    你现在这个是获取父节点的地址啊。

    3个路由都已协调器为父节点入网成功后,再把路由的网络清除,然后让他们重新入网,这个时候有两个路由是以协调器为父节点入网,一个以路由为父节点入网,结果是协调器就可以和3个路由都通信了。
    这种情况你清除路由的就相当于新的三个路由重新入网。


    device announce可以用户可以获取知道入网的设备的信息,

    我一般建议用短地址去通信或者bind的方式。
  • Alvin Chen 说:
    你节点也需要擦除网络信息,重新入网,你原来的节点还在原来的网络中无法加入新的网络。

    Alvin Chen 说:
    你节点也需要擦除网络信息,重新入网,你原来的节点还在原来的网络中无法加入新的网络。

    Alvin Chen 说:
    你节点也需要擦除网络信息,重新入网,你原来的节点还在原来的网络中无法加入新的网络。

  • 协调器选择最近的路由进行通信
  • 路由信息加入后,协调器要选择最佳路径进行信息传送
  • 节点也需要擦除网络信息,重新入网,你原来的节点还在原来的网络中无法加入新的网络。
x 出现错误。请重试或与管理员联系。