多个源节点向多个目标节点发数据

实现一下有多个源节点向多个目标节点发数据,(每个源节点判断离它最近的Sink节点,然后向它发数据)

总体思想:是通过数组给源节点和目标节点建立一个映射表,即对应的源节点指向对应的Sink节点。在数据包传输的过程中通过读取包中的源节点的ID,我这里是用源节点的ID得到目标节点的ID,当然也可以直接读取包中的目标节点的ID。进行包的传输。

 

在这里定义了2、3、761、252这四个节点为源节点。9、288、606、1、771为Sink节点。具体效果如下。当然你还可以增加节点。

 

具体的改动代码:wsn_global.h中

//目标节点数量

intGlobalSinkNum[1];

intGlobalSrcNum[1];

//目标节点地址和坐标

intGlobalSinkID[801];

intFinalGlobalSinkIDForSrcId[801];

intGlobalSinkIDForCalculateDistance[801];

int FinalNumID[801];

doubleGlobalSinkX[801];

doubleGlobalSinkY[801];

//源节点地址和坐标

intGlobalSrcID[801];

doubleGlobalSrcX[801];

doubleGlobalSrcY[801];

 

计算的核心代码:NotifyAppSendData中

这里是求出发包的源节点,距离它最近的目标节点的ID

TemSrcToSinkDistance=1410;

for(i=1 ;i<= GlobalSinkNum[0];i++)

      {

      q = sqrt((GlobalSrcX[MyID] -GlobalSinkX[GlobalSinkIDForCalculateDistance[i]])*(GlobalSrcX[MyID] -GlobalSinkX[GlobalSinkIDForCalculateDistance[i]]) +

      (GlobalSrcY[MyID] -GlobalSinkY[GlobalSinkIDForCalculateDistance[i]])*(GlobalSrcY[MyID] -GlobalSinkY[GlobalSinkIDForCalculateDistance[i]]));

if(q

      {

TemSrcToSinkDistance=q;

FinalGlobalSinkIDForSrcId[MyID]=GlobalSinkIDForCalculateDistance[i];

//FinalNumID[0]=i;

}

      }

NodeToSinkDistance= SrcToSinkDistance;

GPSR中从包中读取了源节点的ID,我在这里通过映射表求出了Sink节点的ID。当然直接从包中读取Sink节点的ID会显得更加简洁。

 

其它的改动与单节点多源节点的改动大同小异。在这里就不贴代码了。

你可能感兴趣的:(闲谈)