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.

网络地址重复的问题

我有10个终端,同时入网的时候,竟然会有随机两个设备的网络地址是一样的。请问该怎么办?为什么会这样?

  • 请附上抓包文件。
  • 网络地址分配.psd

    当终端设别入网后,发送自定以的消息给协调器,协调器串口打印,如下:E10和E1、E9和E2的网络地址相同。

  • 你協議棧板本?

  • 你的短地址分别为:
    0x3713
    0x7974
    0xB024
    0x7975
    0xFC4E
    0x7972
    0x172C
    0x7970
    0x4035
    0x7971
    0x35F9
    0x31C3
    0x55B2
    0x796F
    0x05D1
    没有发现重复
  • 每个终端设别入网发送自己的网络地址和IEEE地址给协调器,协调器进行串口显示。首先IEEE地址没错,证明存储是一一对应的,网络地址有重复,这是为什么讷?而且串口显示的地址都是0x79XX 。
  • 协调器进行串口显示的程序碼可以貼上來看看嘛?
  • 终端发送部分
    /**********************************************************
    * @brief 发送本节点的网络地址到协调器
    * @para  uint8 DeviceType 设备类型:1:终端  2:路由器
    **********************************************************/
    #if !defined(ZDO_COORDINATOR)
    void MyApp_SendShortaddrToCoor(uint8 DeviceType)
    {
    //  uint8 Info_temp[40]={0};             //用来串口显示的数组
      uint8 buf[20]={0};          //存放要发送的信息
      uint16 addr=0;              //保存本节点网络地址
      uint16 parentsAddr = 0;     //保存父节点网络地址
     
      buf[0]=DeviceType;
      switch(DeviceType)         //根据逻辑类型,ID号
      {
      case MYAPP_DEV_END:
        buf[1]=EndDeviceID;
        break;
      case MYAPP_DEV_ROU:
        buf[1]=RouDeviceID;
        break;
      default:
        buf[1]=0;
        break;
      }
      addr = NLME_GetShortAddr();               //获取本节点网络地址
      parentsAddr = NLME_GetCoordShortAddr();   //获取本节的父节点网络地址
    //  sprintf((char*)Info_temp,"parent:%d  local:%d\r\n",parentsAddr,addr);
    //  HalUARTWrite(0, Info_temp,strlen((char const*)Info_temp)); //显示
     
      buf[2]= HI_UINT16(addr);                  //本节点网络地址高八位
      buf[3]= LO_UINT16(addr);                  //本节点网络地址低八位
      buf[4]= HI_UINT16(parentsAddr);           //父节点网络地址高八位
      buf[5]= LO_UINT16(parentsAddr);           //父节点网络地址低八位
      osal_memcpy(&buf[6],NLME_GetExtAddr(),8); //本设备的存储IEEE地址
     
     
      //设置发送目的地址
      MyApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
      MyApp_DstAddr.addr.shortAddr = 0x00;
      MyApp_DstAddr.endPoint = MYAPP_ENDPOINT;
      HalUARTWrite(0,buf,14);
      //发送出去
      if(AF_DataRequest(&MyApp_DstAddr,           //目的地址
                        &MyApp_epDesc,            //设备描述符
                        MYAPP_SENDADDR_CLUSTERID, //簇ID
                        14,                       //长度
                        buf,                      //要发送的数组
                        &MyApp_TransID,           //传输序列号
                        AF_ACK_REQUEST,                        //发送选项
                        AF_DEFAULT_RADIUS)==afStatus_SUCCESS)
      {
        //成功;
      }
      else
      {
      }
    }
    #endif

    协调器串口显示部分:

      case MYAPP_SENDADDR_CLUSTERID:                    //协调器接收到终端AF发来的网络地址和设备Id号,并将其显示在串口上。
          switch(databuf[0])                            //判断设备类型
          {
          case MYAPP_DEV_END:                           //终端,将数据保存在终端结构体
            MyEndDev[(databuf[1]-1)].Type = 'E';
            MyEndDev[(databuf[1]-1)].ID = databuf[1];
            MyEndDev[(databuf[1]-1)].shortaddr = BUILD_UINT16(databuf[3],databuf[2]);
            MyEndDev[(databuf[1]-1)].ParentsShortAddr = BUILD_UINT16(databuf[5],databuf[4]);
            osal_memcpy(MyEndDev[(databuf[1]-1)].IeeeAddr,&databuf[6],8);     //保存MAC地址
            
            ChangeHexToChar(My_MAC_addr,MyEndDev[(databuf[1]-1)].IeeeAddr,8);       //将MAC地址转换成字符型式
            sprintf((char*)Info_temp,"Type:%c  ID:%3d  ShortAddr:%5d  parents:%5d  IEEE:%s\r\n",MyEndDev[(databuf[1]-1)].Type,MyEndDev[(databuf[1]-1)].ID,MyEndDev[(databuf[1]-1)].shortaddr,MyEndDev[(databuf[1]-1)].ParentsShortAddr,My_MAC_addr);
            HalUARTWrite(0,Info_temp,strlen((char const*)Info_temp));        
            break;
            
          case MYAPP_DEV_ROU:                           //路由器,将数据保存在路由结构体
            MyRouDev[(databuf[1]-1)].Type = 'C';
            MyRouDev[(databuf[1]-1)].ID = databuf[1];
            MyRouDev[(databuf[1]-1)].shortaddr = BUILD_UINT16(databuf[3],databuf[2]);
            MyRouDev[(databuf[1]-1)].ParentsShortAddr = BUILD_UINT16(databuf[5],databuf[4]);
            osal_memcpy(MyRouDev[(databuf[1]-1)].IeeeAddr,&databuf[6],8);     //保存MAC地址
            
            ChangeHexToChar(My_MAC_addr,MyRouDev[(databuf[1]-1)].IeeeAddr,8);       //将MAC地址转换成字符型式
            sprintf((char*)Info_temp,"Type:%c  ID:%3d  ShortAddr:%5d  parents:%5d  IEEE:%s\r\n",MyRouDev[(databuf[1]-1)].Type,MyRouDev[(databuf[1]-1)].ID,MyRouDev[(databuf[1]-1)].shortaddr,MyRouDev[(databuf[1]-1)].ParentsShortAddr,My_MAC_addr);
            HalUARTWrite(0,Info_temp,strlen((char const*)Info_temp));
            break;
            
          default:
            break;
          }  
        break;

  • 估计是你串口打印有问题。
  • 关闭NV_RESTORE后,网络地址分配正常

  • 这是为什么?
  • 你自己去看抓包,原来也没有重复的情况,只是你的显示有问题。貌似看漏了,不好意思,你换到3.0.2试一下。

  • 在你sniffer log #233 #297確實看到short address重複了,但是你用的協議棧2.5.1a有點舊了,我印象中好像是有遇過這個問題,後來我都升級到最新的協議棧好像就沒看到這個問題了,建議你用新協議棧試試