我有10个终端,同时入网的时候,竟然会有随机两个设备的网络地址是一样的。请问该怎么办?为什么会这样?
Alvin Chen:
请附上抓包文件。
user4711142:
回复 Alvin Chen:
网络地址分配.psd
当终端设别入网后,发送自定以的消息给协调器,协调器串口打印,如下:E10和E1、E9和E2的网络地址相同。
YiKai Chen:
你協議棧板本?
user4711142:
回复 YiKai Chen:
2.5.1a
Alvin Chen:
回复 user4711142:
你的短地址分别为:
0x3713
0x7974
0xB024
0x7975
0xFC4E
0x7972
0x172C
0x7970
0x4035
0x7971
0x35F9
0x31C3
0x55B2
0x796F
0x05D1
没有发现重复
user4711142:
回复 Alvin Chen:
每个终端设别入网发送自己的网络地址和IEEE地址给协调器,协调器进行串口显示。首先IEEE地址没错,证明存储是一一对应的,网络地址有重复,这是为什么讷?而且串口显示的地址都是0x79XX 。
YiKai Chen:
回复 user4711142:
协调器进行串口显示的程序碼可以貼上來看看嘛?
user4711142:
回复 YiKai Chen:
终端发送部分/*********************************************************** @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;
Alvin Chen:
回复 user4711142:
估计是你串口打印有问题。
user4711142:
回复 Alvin Chen:
关闭NV_RESTORE后,网络地址分配正常