⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gear.cc

📁 基于Oment++的无线传感器网络仿真
💻 CC
📖 第 1 页 / 共 3 页
字号:
		check =  atr.compareAttribute(x);	x2=atr.getVal();	atr= Attribute::find_key_from(Attribute::LATITUDE_L, &newVecAttr);	if(check)			check =  atr.compareAttribute(y);	y1=atr.getVal();	atr= Attribute::find_key_from(Attribute::LATITUDE_R, &newVecAttr);	if(check)		check =  atr.compareAttribute(y);	y2=atr.getVal();	//printf("isInRegion returns %d MyNodeId==%d\n", check, MyNodeId);    return check;}bool Gear::isAlreadyRecv(QueryPacket* Msg,int nodeid){		cPar param=Msg->par("VisitedNodeList");    	cArray* VisitedNodes=(cArray*)param.objectValue();	if (nodeid==-1)	{	 sprintf(s,"%d",MyNodeId);	// printf("SUSPECT\n ");	}	else	 sprintf(s,"%d",nodeid);	 int i_index = VisitedNodes->find(s);	//printf(" isAlreadyRecv nodeid %s index =%d  \n",s,i_index);	 if(i_index==-1)	 {	 	return 0;	 }	 else	 	return 1;}void Gear::UpdateLearnedCost(cMessage* MSg){		QueryPacket* Msg;	Msg=(QueryPacket*)MSg;	Header *hdr=&Msg->getHdr();	unsigned int nodeid=hdr->srcNodeId;	int RegionX=Msg->getRegionX();	int RegionY=Msg->getRegionY();	int RegionRadius=Msg->getRadius();	double cost=Msg->par("cost").doubleValue();	sprintf(s,"%d,%d,%d",RegionX,RegionY,RegionRadius);	Region* reg=(Region*)RegionList->get(s);	cArray* myRegionCost=reg->getRegionCost();	Cost* UpdatedCost=new Cost(nodeid,cost);	sprintf(s,"%d",nodeid);			myRegionCost->takeOwnership(false);	int index=myRegionCost->find(s);	if(index!=-1)	{		myRegionCost->remove(index);		myRegionCost->addAt(index,UpdatedCost);	}        int isLearned=Msg->par("isFromLearnedCost");	if (((int)cost)==99999 && isLearned!=1)	{	 cPar param=Msg->par("VisitedNodeList");	 cArray* VisitedNodes=(cArray*)param.objectValue();	 sprintf(s,"%d",nodeid);	 int pos=VisitedNodes->find(s);	 sprintf(s,"%d",MyNodeId);	 if(VisitedNodes->find(s)==pos-1)	 { 		//printf("ARE we RESENDING----YES at MyNodeId==%d\n", MyNodeId);		ResendQuery(RegionX,RegionY,RegionRadius,Msg);	 }	}}void Gear::ResendQuery(int RegionX,int RegionY,int RegionRadius,QueryPacket* Msg){	Msg->setKind(QUERY);	 Header *hdr=&Msg->getHdr();	 hdr->ttl=MAX_HOP;	//printf("IN RESEND\n");		processQuery(RegionX,RegionY,RegionRadius,Msg,true);}void Gear::processQuery(int RegionX,int RegionY,int RegionRadius,QueryPacket* Msg,bool chkFlag){		cArray* RegionCost;		Header *hdr=&Msg->getHdr();	unsigned int nodeid=hdr->srcNodeId;	int x=hdr->srcLoc.x;	int y=hdr->srcLoc.y;	if(hdr->ttl<=0)	{			delete Msg;		return;	}	sprintf(s,"%d,%d,%d",RegionX,RegionY,RegionRadius);	Location *loc=new Location(RegionX,RegionY);	Region* reg;	int index=RegionList->find(s);	//printf(" simTime () %f REGIOn is %s index =%d \n",simTime(),s,index);	if (index!=-1)	{		reg=(Region*)RegionList->get(index);		if ((simTime()- reg->getLastUpdateTime())>region_threshold)	  	PopulateCostsToNeighbhors(reg,Msg);		int index1=RegionList->find(s);		reg=(Region*)RegionList->get(index1);		RegionCost= reg->getRegionCost();        for(int i=0;i<RegionCost->items();i++)		{		   Cost * c=(Cost*)RegionCost->get(i);		   //printf(" COST %d, %f \n",c->getNodeId(),c->getNodecost());			}		if (!chkFlag)		{		 cArray* srcNodeList=reg->getSrcNodeList();		 IdWrapper *idw=new IdWrapper(nodeid);		 srcNodeList->takeOwnership(false);		 srcNodeList->set(idw);		}			}				else	{	    reg=new Region(loc,RegionRadius);	    PopulateCostsToNeighbhors(reg,Msg);	    cArray* srcNodeList=reg->getSrcNodeList();	    IdWrapper *idw=new IdWrapper(nodeid);	    srcNodeList->takeOwnership(false);	    srcNodeList->set(idw);	    RegionCost= reg->getRegionCost();	    for(int i=0;i<RegionCost->items();i++)	    {	      Cost * c=(Cost*)RegionCost->get(i);		  //printf(" The Cost of NodeId %d to region is %f\n",c->getNodeId(),c->getNodecost());			    }	}	 		cArray* NodeCostForRegion2=(cArray*)reg->getRegionCost();	//unsigned int nextHopId=88888888;	unsigned int nextHopId;	cArray* qList = reg->getQueryList();	//if(Msg->getExp()||index==-1||(index!=-1&&!checkIfAnyQueryAlive(qList)))	nextHopId=getNextHopNode(RegionCost,nodeid, Msg,chkFlag);	cPar* qIdPar = &Msg->par("QueryId");	char qId[50];	strcpy(qId, qIdPar->stringValue());	if(chkFlag)	printf ( " GEAR Query nexthopId is %d for MynodeId %d \n",nextHopId,MyNodeId); 	if(nextHopId!=99999)	{		if ((flag==0||flag==2)&&(!chkFlag))  /* flag==0  Message from bottom Layer  flag==2 isSelfMessage  */		{			//generateQueryAck(qId,nodeid,RegionX,RegionY,RegionRadius);		}		if(fileWrite)		{			char a[100];			if(Msg->getExp())			sprintf(a, "%f EXP- The Query Src = %d NextHopId = %d fileName %s \n", simTime(), Msg->getIQuerySrc(), nextHopId,fileName);			else			sprintf(a, "%.15f The Query Src = %d NextHopId = %d\n", simTime(), Msg->getIQuerySrc(), nextHopId);			FILE * abc;			abc = fopen(fileName, "ab");			fputs(a, abc);			fclose(abc);		}		//if((nextHopId!=88888888)||(Msg->getExp()&&(!checkIfAnyQueryAlive(qList))))		generateContinuedQueryMessage(Msg,nextHopId);		QueryObject* qryObject=new QueryObject(qId);		qryObject->setSrcId(nodeid);		qryObject->setFinalSrc(Msg->getIQuerySrc());		if(Msg->getExp())			qryObject->setIsAlive(true);		reg->addToQueryList(qryObject);	   // cArray* qList = reg->getQueryList();		delete Msg;	}	else	{		cArray* srcNodeList=reg->getSrcNodeList();	//	generateLearnedCostMessage(Msg, srcNodeList,99999,false);		//printf("DROP THE QUERY packet GOOD MORNING by NodeId %d from sourceId  %d and previous %d \n",MyNodeId,Msg->getIQuerySrc(),nodeid);		if(fileWrite)		{			char a[100];			sprintf(a, "DROP QUERY PKT by NodeId  %d sourceId %d previous  = %d\n",MyNodeId, Msg->getIQuerySrc(), nextHopId);			FILE * abc;			abc = fopen(fileName, "ab");			fputs(a, abc);			fclose(abc);		}		delete Msg;	}}void Gear::generateContinuedQueryMessage(QueryPacket* Msg,unsigned int nextHopId){	 QueryPacket *msg=(QueryPacket*)Msg->dup();	 unsigned int NodeId=((CoOrdinatorBase *) pCoOrdinator)->getNodeId();	 Header *hdr=&msg->getHdr();	 hdr->ttl-=1;	 hdr->srcNodeId=NodeId;	 hdr->NextHopDestId=nextHopId;	 int delayTime= INTEREST_FORWARD_DELAY + (int) ((INTEREST_FORWARD_JITTER * (rand() * 1.0 / RAND_MAX) - (INTEREST_FORWARD_JITTER / 2)));	 delay= delayTime / 1000.0;	 sendDown(msg,delay);}void Gear::generateQueryAck(char* queryId,unsigned int nodeid,int RegionX,int RegionY,int radius){			if(nodeid!=MyNodeId)	{	//printf(" QUERYACK to nodeid %d from MyNodeId = %d",nodeid,MyNodeId);	QueryPacket *msg=new QueryPacket("query_reply",QUERY_REPLY);	Header *hdr=&msg->getHdr();	hdr->ttl=1;	hdr->srcNodeId=((CoOrdinatorBase *) pCoOrdinator)->getNodeId();				hdr->NextHopDestId=nodeid;	hdr->OriginSrc=par("originsrc");	msg->setRegionX(RegionX);	msg->setRegionY(RegionY);	msg->setRadius(radius);	msg->addPar("QueryId");	msg->par("QueryId")=queryId;	sendDown(msg);		}}void Gear::PopulateCostsToNeighbhors(Region* reg, QueryPacket* Msg){	Location* loc=reg->getRegionLocation();	int RegionX = loc->x;	int RegionY = loc->y;	if((neigh_list->items()==0)||((simTime()-NeighUpdatedTime)>threshold))	{		cMessage *reply=generateBeaconMessage();		sendDown(reply);		scheduleAt(simTime()+WAIT_NEIGHBOR_UPDATE,Msg);		//printf(" populateCostToNe %d \n",MyNodeId);		return;	}	Heuristics*	h=new Heuristics();	Cost *EstimatedCost;	double maxEnergy = h->EnergyMaxValue(neigh_list);	double minEnergy = h->EnergyMinValue(neigh_list);	double maxDis = h->DisMaxValue(neigh_list, RegionX, RegionY);	double minDis = h->DisMinValue(neigh_list, RegionX, RegionY);	for(int i=0;i<neigh_list->items();i++)	{		NeighbhorInfo * neigh=(NeighbhorInfo*)neigh_list->get(i);		EstimatedCost=h->EstimateCost(neigh, loc, maxEnergy, minEnergy, maxDis, minDis);		h->LearnedCostEntry(reg,EstimatedCost);		simtime_t now = simTime();		reg->setLastUpdatedTime(now);	}	delete h;	cArray* RegionCost= reg->getRegionCost();	reg->setDataUpdateTime(0.0);    reg->setExploratoryTime(0.0);	RegionList->takeOwnership(false);	RegionList->set(reg);	}void Gear::getLearnedCost(QueryPacket* Msg){ 	Header *hdr=&Msg->getHdr();	hdr->ttl=1;	int SelectedNodeId=hdr->srcNodeId;	int RegionX=Msg->getRegionX();	int RegionY=Msg->getRegionY();	int RegionRadius=Msg->getRadius();	Location *loc=new Location(RegionX,RegionY);	char s1[50];	sprintf(s,"%d,%d,%d",RegionX,RegionY,RegionRadius);	Region* reg;	int	RegionObjectIndex=RegionList->find(s);	if(RegionObjectIndex!=-1)	{		reg=(Region*)RegionList->get(RegionObjectIndex);		cArray* SrcNodeList=reg->getSrcNodeList();		cArray* NeighCostArray=reg->getRegionCost();		char s[10];		sprintf(s,"%d",SelectedNodeId);		Cost* LearnedCostObject=(Cost*)NeighCostArray->get(s);		double LearnedCost=LearnedCostObject->getNodecost();		addDestToQueryObject(Msg,reg);			sprintf(s, "%i",MyNodeId);		sprintf(s1, "%i",SelectedNodeId);		int x =((CoOrdinatorBase*) pCoOrdinator)->getX();		int y =((CoOrdinatorBase*) pCoOrdinator)->getY();		Heuristics* h1 = new Heuristics();		double gap = h1->Distance(x, y, ((Location*)(((NeighbhorInfo*)neigh_list->get(s1))->getLocation(SelectedNodeId)))->x, ((Location*)(((NeighbhorInfo*)neigh_list->get(s1))->getLocation(SelectedNodeId)))->y); 		double LearnedCostForCurrentNode=LearnedCost+gap;		delete h1;	//	generateLearnedCostMessage( Msg,SrcNodeList,LearnedCostForCurrentNode,true);	 }	delete Msg;	}void Gear::addDestToQueryObject(QueryPacket* Msg,Region* reg){	cPar* qIdPar = &Msg->par("QueryId");	char qid[50];	strcpy(qid, qIdPar->stringValue());	Header *hdr=&Msg->getHdr();	int destId=hdr->srcNodeId;	cArray* qryList=reg->getQueryList();	QueryObject* qryObject=(QueryObject*)qryList->get(qid);	qryObject->setDestId(destId);}void Gear::generateLearnedCostMessage(QueryPacket* Msg, cArray* SrcNodeList,double LearnedCostForCurrentNode, bool fromLearned){		QueryPacket* Msg1;	Header *hdr=&Msg->getHdr();	hdr->ttl=1;	hdr->srcNodeId=((CoOrdinatorBase *) pCoOrdinator)->getNodeId();	hdr->OriginSrc=par("originsrc");//-1;	Msg->addPar("cost");	Msg->par("cost")=LearnedCostForCurrentNode;	Msg->setKind(UPDATE_LEARNED_COST);	for(int i=0;i<SrcNodeList->items();i++)	{					IdWrapper* id=(IdWrapper*)SrcNodeList->get(i);		int nodeid=id->getNodeId();		hdr->NextHopDestId=nodeid;		if(nodeid==MyNodeId)		continue;				if(!fromLearned)		{			  if(fileWrite)		  {		   FILE * abc;		   sprintf(fileName, "500/%s%d.txt", filea, ((QueryPacket*)Msg)->getIQuerySrc());		   abc = fopen(fileName, "ab");		   char a[100];		   sprintf(a, "SrcNode of NodeId === %d is = %d\n", MyNodeId,nodeid);		   fputs(a, abc);		   fclose(abc);		  }							  Msg->addPar("isFromLearnedCost");		  Msg->par("isFromLearnedCost")=0;		}		else		  {		  	Msg->addPar("isFromLearnedCost");		  	Msg->par("isFromLearnedCost")=1;		  }		//printf(" LEARNEDCOST MSG from %d to %d \n", MyNodeId,nodeid);		 		Msg1=(QueryPacket*)Msg->dup();		sendDown(Msg1); //    NOT SURE WHETHER IT WILL WORK	}}unsigned int Gear::getNextHopNode(cArray *regCost,unsigned int NodeId,QueryPacket* Msg,bool chkFlag){	cArray* NodeCostForRegion=regCost;	cPar param=Msg->par("VisitedNodeList");	cArray* VisitedNodes=(cArray*)param.objectValue();	if(NodeCostForRegion==NULL)		Cost* NodeRegionCost;	int CurrId;	int minCostNodeId=99999;	if((NodeCostForRegion->items()!=0))	{		double leastcost=99999;		for(int i=0;i<NodeCostForRegion->items();i++)		{			Cost* NodeRegionCost=(Cost*)NodeCostForRegion->get(i);//Return the Cost object Cost(nodeId,nodeCost)			double cost=NodeRegionCost->getNodecost();			CurrId=NodeRegionCost->getNodeId();			char s[10];			int i_index=-1;			sprintf(s,"%d",CurrId);			i_index = VisitedNodes->find(s);			int xx =((CoOrdinatorBase*)pCoOrdinator)->getX();			int yy =((CoOrdinatorBase*)pCoOrdinator)->getY();			Heuristics* h = new Heuristics();			double myCost =h->Distance(xx, yy, Msg->getRegionX(), Msg->getRegionY());			delete h;  				if((MyNodeId != CurrId)&&(i_index==-1))			{				if(cost<leastcost&&cost<myCost)				{					leastcost=cost;					minCostNodeId=CurrId;				}			}		}		if((minCostNodeId!=99999)&&(!chkFlag))		{			IdWrapper* idw=new IdWrapper(MyNodeId);			VisitedNodes->takeOwnership(false);			VisitedNodes->add(idw);		}		//printf("For the query from %d, the cost is %f for node %d, mynodeid==%d", Msg->getIQuerySrc(), leastcost, minCostNodeId, MyNodeId);		return minCostNodeId;	}	else	{		return 99999;	}}void Gear::updateNeighborList(BeaconReplyPkt* Msg){	Header *hdr=&Msg->getHdr();	int nodeid=hdr->srcNodeId;	int x=hdr->srcLoc.x;	int y=hdr->srcLoc.y;	Location* Loc=new Location(x,y);	double eng=Msg->getEnergy();	//printf("At MyNodeId==%d nodeid==%d added to NEIGHBORLIST \n", MyNodeId, nodeid);	NeighbhorInfo* neighor =new NeighbhorInfo(nodeid,Loc,eng);	neigh_list->set(neighor);	NeighUpdatedTime=simTime();	 	 			   }cMessage * Gear:: generateBeaconMessage(){	//printf("GENERATING BEACON MSG %d \n",MyNodeId);		unsigned int NodeId=((CoOrdinatorBase *) pCoOrdinator)->getNodeId();	BeaconPkt *beaconPkt=new BeaconPkt("beacon",BEACON);	Header *hdr=&beaconPkt->getHdr();	hdr->ttl=1;	hdr->srcNodeId=NodeId;	hdr->NextHopDestId=999999;	hdr->OriginSrc=par("originsrc");//-1;	return beaconPkt;}cMessage * Gear::generateReplyBeaconMessage(int DestId){	unsigned int NodeId=((CoOrdinatorBase *) pCoOrdinator)->getNodeId();	double d_Energy = ((CoOrdinatorBase *) pCoOrdinator)->GetEnergySpent();	BeaconReplyPkt *beaconReplyPkt=new BeaconReplyPkt("beaconReply",BEACON_REPLY);    Header *hdr=&beaconReplyPkt->getHdr();	hdr->ttl=1;	hdr->srcNodeId=NodeId;	hdr->srcLoc.x=((CoOrdinatorBase *) pCoOrdinator)->getX();	hdr->srcLoc.y=((CoOrdinatorBase *) pCoOrdinator)->getY();	hdr->NextHopDestId=DestId;	hdr->OriginSrc=par("originsrc");//-1;	beaconReplyPkt->setEnergy(d_Energy);	return beaconReplyPkt;}void Gear::sendDown(cMessage *msg){		send(msg,"toBottomLayer");}void Gear::sendUp(cMessage *msg){		send(msg,"toTopLayer");}void Gear::sendDown(cMessage *msg, double delay){	//sendDelayed(msg,delay,"toBottomLayer");		send(msg,"toBottomLayer");}void Gear::finish(){			//printf("First SeqNo= %d MyNodeId %d \n",firstSeqNo,MyNodeId);//	int RegionNo=(int)parentModule()->parentModule()->par("RegionNo");//	int packetsNotGot=(firstSeqNo-1)*RegionNo;//	printf("%d,%d,%d\n",MyNodeId,(seqNo*RegionNo)-(packetsNotGot),dataCount);	//printf("seqNo %d Total packets generated =%d RegionNo = %d\n",seqNo,(seqNo*RegionNo)-(packetsNotGot),RegionNo);		//printf("Data Delivered to %d is %d\n",MyNodeId,dataCount);	//printf(" %f Data generated total %d MyNodeID %d \n\n",simTime(),dataGeneratedTotal,MyNodeId);	//printf("BeaconPkt made = %d deleted = %d \n", BeaconPkt::countBeaconPkt, BeaconPkt::countDestBecPkt);	//printf("BeaconReplyPkt made = %d deleted = %d \n", BeaconReplyPkt::countBeaconReply, BeaconReplyPkt::countDestBecReply);	//printf("QueryPacket made = %d deleted = %d \n", QueryPacket::countQueryPkt, QueryPacket::countDestQueryPkt);	//printf("GearPacket made = %d deleted = %d \n", GearPacket::countGearPkt, GearPacket::countDestGearPkt);	//printf("DataMsg made = %d deleted = %d \n", DataMsg::countDataPkt, DataMsg::countDestDataPkt);	//printf("\n");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -