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

📄 simple.cpp

📁 simulation routing in wsn
💻 CPP
字号:

#include "simple.h"
#include "cProbeMsg_m.h"
Define_Module( recei );
double nblock[100],totalreq[100];
bool test[100];
int wgtable[50][100][10];
void recei::activity()
{    
    for(;;)
    {
		packet *msg=(packet *)receive();	
		ev << "Received from:" << msg->getSnode() << endl;
		int dur=msg->getPdelay();
        send(msg,"rout");	
    }
}
Define_Module( proce );

void proce::activity()
{	
	int nodeid=par("nodeID");
    for(;;)
    {
		packet *msg=(packet *)receive();	
		int dur=msg->getPdelay();
		if (nodeid==msg->getDnode()) delete msg;				
		else 
		{	send( msg, "pout");			
		};
    }
}
Define_Module( gene );

void gene::activity()
{
    int nodeid=par("nodeID");		
	int numnode=par("num_node");
	cPar& IaTime = par("interArrivalTime" );
	cPar& duration = par("holdTime" );
    for(;;)
    {	            
	totalreq[nodeid]++;
	
	char msgname[70];      

    ev << "Generating " << msgname << endl;
	int desnode=(int)intuniform(0,numnode-1,nodeid);
	int timeout=poisson(10, 0);
	//simtime_t duration=(simtime_t)timeout;
	//duration=strToSimtime("60s");
	//t duration=timeout;
	while (desnode==nodeid)	
	{
		desnode=(int)intuniform(0,numnode-1,0);
	};
	sprintf( msgname, "From-%d to -%d",nodeid, desnode);
    packet *msg=new packet(msgname);
	msg->setSnode(nodeid);
	msg->setDnode(desnode);	
	msg->setPdelay(duration);
	msg->setTimestamp();
    send( msg, "gout");    	
	wait(IaTime);
	
	};
}
Define_Module(trans);
void trans::initialize()
{
    int nodeid= parentModule()->par("nodeID");
	int numnode=par("num_node");
	int nwavelength=par("nwavelength");
	test[nodeid]=true;
	for (int i=0;i<numnode;i++)
		for (int j=0;j<nwavelength;j++)
		{
			wgtable[nodeid][i][j]=1; //available
		};
	//Reset all 
	for (i=0;i<numnode;i++)
	{
		nblock[i]=0;
		totalreq[i]=0;
	};
    //
    // Brute force approach -- every node does topology discovery on its own,
    // and finds routes to all other nodes independently, at the beginning
    // of the simulation. This could be improved: (1) central routing database,
    // (2) on-demand route calculation
    //
    cTopology *topo = new cTopology("topo");

    topo->extractByModuleType(parentModule()->className(), NULL);
    ev << "cTopology found: " << topo->nodes() << " nodes\n";

    cTopology::Node *thisNode = topo->nodeFor(parentModule());

    // find and store next hops
    for (i=0; i<topo->nodes(); i++)
    {
        if (topo->node(i)==thisNode) continue; // skip ourselves
        topo->unweightedSingleShortestPathsTo(topo->node(i));

        if (thisNode->paths()==0) continue; // not connected

        cGate *parentModuleGate = thisNode->path(0)->localGate();
        /*int gateId = parentModuleGate->fromGate()->id();
		char *full=(char*)parentModuleGate->fullName();
		if nodeid<10  int gateId=atoi(&full[5]);	
		    else int gateId=atoi(&full[5]);			        
		*/
		int gateId=thisNode->path(0)->remoteNode()->module()->par("nodeID");
		int address = topo->node(i)->module()->par("nodeID");
		

        rtable[address] = gateId;
        ev << "  towards address " << address << " gateId is " << gateId << endl;
    }
    delete topo;
}
void trans::activity()
{
    int nodeid=par("nodeID");	
	int gate1,num;	
	int myAddress = nodeid;
	double timerec[100][10];
	int numnode=par("num_node");
	int nwavelength=par("nwavelength");
	int Isconvert=par("convert"); // indicate the node whether has WC or not
	/*sTopoLinkOut *path=NULL;
    cTopology *topo = new cTopology("topo");
    topo->extractByModuleType(parentModule()->className(), NULL);
    ev << "cTopology found: " << topo->nodes() << " nodes\n";
	ev << "Parentmodule:" << parentModule()->className() << " \n";
	int dur=0;
	cTopology::Node *thisNode = topo->nodeFor(parentModule());		
	for(;;)
    {
			
		packet *msg=(packet *)receive();			
				
		int desnode=msg->getDnode()-1; 
		
		ev << "This node:" << topo->node(nodeid-1)->module()->par("nodeID") << " \n";
		
		topo->unweightedSingleShortestPathsTo(topo->node(desnode));			
	
		

		if (thisNode->paths()==0) 
		{
			delete msg;
			nblock=nblock+1;			
			ev<< "number of packets have been block:"<<nblock<<"\n";
			continue; // not connected 
		}		
        		
		cGate *parentModuleGate = thisNode->path(0)->localGate();
		int gateId = parentModuleGate->toGate()->id();		
		int address = topo->node(desnode)->module()->par("nodeID");				
		ev << "Target node:" << address << " \n";		
		
		char *full=(char*)parentModuleGate->fullName();
		gateId=atoi(&full[5]);		
			
			ev << "GateId:" <<gateId<<"\n";						
			send(msg,"tout",gateId);		
			ev<<"simstamp:"<<msg->timestamp()<<"\n";
			if (dur<=simTime()-timerec) 
			{
				dur=msg->getPdelay();
				timerec=simTime();
				if (path!=NULL) path->enable();
				path = thisNode->path(0);
				path->disable();
			};			
			*/
			packet *pk;
			int destAddr,i,j;	
			bool found;
			int dur;
	for (;;)
	{			
			pk=(packet *)receive();	
			int Cwavelength=pk->kind();
		 destAddr = pk->getDnode();
		if (destAddr == myAddress)
		{
			ev << "local delivery of packet " << pk->name() << endl;
			send(pk,"localOut");
			continue;
			
		}		
		RoutingTable::iterator it = rtable.find(destAddr);
		if (it==rtable.end())
		{
			ev << "address " << destAddr << " unreachable, discarding packet "<< endl;
			delete pk;			
			nblock[nodeid]=nblock[nodeid]+1;			
			ev<< "number of packets of node "<<nodeid<<" have been block:"<<nblock[nodeid]<<"\n";			
			continue;
		}		
		int outGate = (*it).second;
		ev << "forwarding packet " << " on gate id=" << outGate << endl;					

		//release wavelengths when it was no longer used
		for (i=0;i<numnode;i++)
		{
			for (j=0;j<nwavelength;j++)
				{
					if ((timerec[i][j]<=simTime())&&(wgtable[nodeid][i][j]==0)) 
					{wgtable[nodeid][i][j]=1; //available
						ev<<"Wavelength:"<<j<<" at gate "<<i<<" of node "<<nodeid<<"  is available!"<<endl;						
						
					};
				};		
		};
		dur=pk->getPdelay();		
		found=false; //variety indicate a wavelength not used
	if (Isconvert==0) 
	{
			if (wgtable[nodeid][outGate][Cwavelength]==1)
			{
				wgtable[nodeid][outGate][Cwavelength]=0;
					timerec[outGate][Cwavelength]=simTime()+dur;
					found=true;
					j=Cwavelength;
					ev<<"Wavelength:"<<j<<" at gate "<<outGate<<" of node "<<nodeid<<"  is used"<<endl;						
					
				};
	}
	else
    {
		for (j=0;j<nwavelength;j++)
		{ 
			if (wgtable[nodeid][outGate][j]==1) 
				{				
					wgtable[nodeid][outGate][j]=0;
					timerec[outGate][j]=simTime()+dur;
					found=true;
					ev<<"Wavelength:"<<j<<" at gate "<<outGate<<" of node "<<nodeid<<"  is used"<<endl;						
					break;
			};
		};
	};
		if (found==false) {
			delete pk;			
			nblock[nodeid]=nblock[nodeid]+1;			
			ev<< "number of packets have been blocked:"<<nblock[nodeid]<<"\n";			
			continue;}						
		
		pk->setKind(j);
		send(pk,"tout", outGate);		
		
    }
}
void trans::finish()
{
	int nodeid=par("nodeID");	
	int numnode=par("num_node");
	int nwavelength=par("nwavelength");
	double total=0,block=0;
	ev<< "----------------The report of node "<<nodeid<<" ------------------ \n"; 
	ev<< "number of packets have been blocked:"<< nblock[nodeid]<<"\n";
	ev<< "Total of packets:"<<totalreq[nodeid]<<"\n";
	ev<< "Blocking Rate="<<nblock[nodeid]/totalreq[nodeid]<< "\n";
	recordScalar("----------------The report of node ",nodeid); 
	recordScalar("Number of requirements = ",totalreq[nodeid]); 
	recordScalar("Number of blocked requirements= ",nblock[nodeid]); 
	recordScalar("Blocking Rate=",nblock[nodeid]/totalreq[nodeid]); 
	if (nodeid==numnode-1) 
	{ for (int i=0;i<numnode;i++)
		{	total=total+totalreq[i];
			block=block+nblock[i];
		};
		recordScalar("--------------------","The final report of all nodes---------------- "); 
		recordScalar("Total number of requirements = ",total); 
		recordScalar("Total number of blocked requirements= ",block); 
		recordScalar("Mean blocking Rate=",block/total); 
		//The final report of all nodes
			ev<< "****************The report of all nodes **************************\n"; 
			ev<< "Number of packets have been blocked:"<< block<<"\n";
			ev<< "Total of packets:"<<total<<"\n";
			ev<< "Blocking Rate="<<block/total<< "\n";

	};
	   	


};

⌨️ 快捷键说明

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