实现一下有多个源节点向多个目标节点发数据,(每个源节点判断离它最近的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)
{
TemSrcToSinkDistance=q;
FinalGlobalSinkIDForSrcId[MyID]=GlobalSinkIDForCalculateDistance[i];
//FinalNumID[0]=i;
}
}
NodeToSinkDistance= SrcToSinkDistance;
GPSR中从包中读取了源节点的ID,我在这里通过映射表求出了Sink节点的ID。当然直接从包中读取Sink节点的ID会显得更加简洁。
其它的改动与单节点多源节点的改动大同小异。在这里就不贴代码了。