我有10个终端,同时入网的时候,竟然会有随机两个设备的网络地址是一样的。请问该怎么办?为什么会这样?
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.
终端发送部分
/**********************************************************
* @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;
你自己去看抓包,原来也没有重复的情况,只是你的显示有问题。貌似看漏了,不好意思,你换到3.0.2试一下。