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

📄 802_11_mac.cc

📁 基于Oment++的无线传感器网络仿真
💻 CC
📖 第 1 页 / 共 3 页
字号:
	CTSMACHeader.SourceMACAddress      = ((CoOrdinatorBase*)pCoOrdinator)->getNodeId();		s802_11_MAC_Header RTSMACHeader    = ((c802_11_Packet*)msg)->getHdr();	CTSMACHeader.DestinationMACAddress = RTSMACHeader.SourceMACAddress; 	CTSMACHeader.timeForTransfer       = (0.000740 + 2*getPropagationDelay()); //0.2); //0.3 ) ; //RTSMACHeader.timeForTransfer - m_SIFS;	(*ppCTSMsg)->setHdr(CTSMACHeader);	AddPosInfo(*ppCTSMsg);	return true;}bool MAC_802_11::Create_RTS_Message(cMessage *msg, c802_11_Packet **ppRTSMsg){	*ppRTSMsg = new c802_11_Packet("RTS MESSAGE", RTS_TYPE);	s802_11_MAC_Header MACHeader;	MACHeader.SourceMACAddress  = ((CoOrdinatorBase*)pCoOrdinator)->getNodeId();	Header &NetHeader = ((GearPacket*)msg)->getHdr();	char string[255];/*	sprintf(string," RTS_DEST FROM  MACHeader.SourceMACAddress %d FOR destination %d \n", MACHeader.SourceMACAddress,NetHeader.NextHopDestId);	recordScalar(" WHYYYYYYYYYYYYYYYYYYYY", string );*/	MACHeader.DestinationMACAddress = NetHeader.NextHopDestId;	(*ppRTSMsg)->addPar("QuerySrc");	(*ppRTSMsg)->par("QuerySrc")= originMsgSrc ;	// One for DATA and one for acknowledgement	//MACHeader.timeForTransfer = msg->length() / m_BitRate + 3 * m_SIFS + msg->length()/m_BitRate; 	int numOfFragments = msg->length()/m_FragmentLength + 1;//	MACHeader.timeForTransfer = ( 0.000670 + 0.1 );  //(numOfFragments * m_FragmentLength)/m_BitRate + (*ppRTSMsg)->length()/m_BitRate + (*ppRTSMsg)->length()/m_BitRate + (1 + numOfFragments) * m_SIFS + (numOfFragments * m_FragmentLength)/m_BitRate; 	MACHeader.timeForTransfer = ( 0.001054 + getPropagationDelay()); //0.1 );  //(numOfFragments * m_FragmentLength)/m_BitRate + (*ppRTSMsg)->length()/m_BitRate + (*ppRTSMsg)->length()/m_BitRate + (1 + numOfFragments) * m_SIFS + (numOfFragments * m_FragmentLength)/m_BitRate; //printf(" TIMETOTRANSFER %f \n",MACHeader.timeForTransfer);		(*ppRTSMsg)->setHdr(MACHeader);		//printf("RTS_TOIMEFPRTRANSFER numOfFragments %d,m_FragmentLength %d,(*ppRTSMsg)->length()= %d m_SIFS %f m_BitRate = %d  \n",numOfFragments,m_FragmentLength,(*ppRTSMsg)->length(),m_SIFS,m_BitRate);	AddPosInfo(*ppRTSMsg);	return true;}bool MAC_802_11:: Create_BRDCAST_Message( cMessage *msg, c802_11_Packet **ppBRDCASTMsg){	*ppBRDCASTMsg = new c802_11_Packet("BRDCAST MESSAGE", BTS_TYPE);	s802_11_MAC_Header BMACHeader;        BMACHeader.SourceMACAddress  = ((CoOrdinatorBase*)pCoOrdinator)->getNodeId();        Header &NetHeader = ((GearPacket*)msg)->getHdr();      /*  char str2[255];                                                                                                 sprintf(str2, " BRDCAST MESSAGE by NODE = %d  ",BMACHeader.SourceMACAddress );        recordScalar(" ..............", str2);        */                                                                                                 //Header &hdr = ((BeaconPkt*)msg)->getHdr();                                                                                                         BMACHeader.DestinationMACAddress = NetHeader.NextHopDestId;                                                                                                         msg->setName("Netw_Pkt");        (*ppBRDCASTMsg)->takeOwnership(false);        (*ppBRDCASTMsg)->addObject(msg); // Adding the n/w packet as an object to the MAC message        //printf(" IN THE BRD CAST");                                                                                                         BMACHeader.timeForTransfer = 0;	(*ppBRDCASTMsg)->setHdr(BMACHeader);                                                                                                         AddPosInfo(*ppBRDCASTMsg);                                                                                                         return true;                                                                                                                                                                                    }bool MAC_802_11::AddPosInfo(c802_11_Packet *pMACMsg){	cPar &parXPos       = pMACMsg->addPar("xPos");	cPar &parYPos       = pMACMsg->addPar("yPos");	cPar &parRadioPower = pMACMsg->addPar("RadioPower");	return true;}void MAC_802_11::handleSelfMessage(cMessage *msg){ 	char strMessageName[255] = "MAC_802_11:handleSelfMessage";	char strMessage[255];		switch(msg->kind())	{		case NAVTIMER:		{			m_NAVTimer = 0;			if( m_pMsgDIFSTimer->isScheduled() )			cancelEvent(m_pMsgDIFSTimer);						scheduleAt(simTime() + m_DIFS, m_pMsgDIFSTimer);			// if there is data to be sent then only call ChackWChannelStateAndTransmit			/*recordScalar("-----------------", "----------------------------------------------------------------------");			sprintf(strMessage, "NAVTimer expired for Node %d, current time is %f.", ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), simTime());			recordScalar(strMessageName, strMessage);			recordScalar("-----------------", "----------------------------------------------------------------------");			*/			//CheckWChannelStateAndTransmit();			break;		}		case DIFS_TIMER:		{ 			//nrecordScalar("-----------------", "----------------------------------------------------------------------");			if  (m_NAVTimer == 0) 			{								/*sprintf(strMessage, "DIFS Timer expired for Node %d, current time is %f. MsgQLength = %d", ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), simTime(),m_QueueOfMessages.length());			recordScalar(strMessageName, strMessage);*/							if ( !m_QueueOfMessages.empty()  ) 				{														if(Bflag == 0) //!( m_pMsgBOffTimer->isScheduled()) )					{					int iBOffNum=intuniform(1,cw);					double iBOffTime = iBOffNum * m_SlotTime;									//	printf(" Time = %f ,iBOffNum= %d , iBOffTime = %f for nodeId %d  cw = %d \n",simTime(), iBOffNum,iBOffTime,((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), cw); 						tstamp_BOffTimer =simTime() + iBOffTime;					if( m_pMsgBOffTimer->isScheduled() )                                	cancelEvent(m_pMsgBOffTimer);					scheduleAt( tstamp_BOffTimer , m_pMsgBOffTimer);					}						else					{												if( m_pMsgBOffTimer->isScheduled() )                                			cancelEvent(m_pMsgBOffTimer);						if(tstamp_BOffTimer < simTime() ) tstamp_BOffTimer = simTime() + remainingBOffTime ;						//printf("time = %f, scheduling remainig back off time = %f for node id = %d\n", simTime(),remainingBOffTime, ((CoOrdinatorBase*)pCoOrdinator)->getNodeId() ); 						scheduleAt(simTime()+remainingBOffTime,m_pMsgBOffTimer);					}				}				}			else			{				if( m_pMsgNAVTimer->isScheduled() )				cancelEvent(m_pMsgNAVTimer);							// implies nav timer not zero				scheduleAt( simTime() + m_NAVTimer, m_pMsgNAVTimer); 				}			break;		}						case BACK_OFF:		{					//printf(" time = %f, back off expired for node id = %d, remaining boff time = %f, tstamp_BOffTimer = %f bflag = %d\n", simTime(), ((CoOrdinatorBase*)pCoOrdinator)->getNodeId() , remainingBOffTime, tstamp_BOffTimer, Bflag ); 			Bflag =0;			/*recordScalar("-----------------", "----------------------------------------------------------------------");			sprintf(strMessage, "BACK OFF expired for Node %d, current time is %f., iBofftime = %d", ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(), simTime(), iBOffTime);			recordScalar(strMessageName, strMessage);*/				if(m_NAVTimer == 0) CheckWChannelStateAndTransmit() ;		else		{// IF NAV TIMER IS NOT ZERO, then some other node got the channel				}							break;			}	case RTS_EXPIRED:		{			RtsExpiredCount++;				cMessage *msgExp = (cMessage*)m_QueueOfMessages.tail();			if(fWrite)			{				if ( ((int)msgExp->par("QuerySrc")) >0  && ((int)msgExp->par("QuerySrc")) < no_of_nodes )				{				FILE *nw_pkt;				sprintf(fName,"mac/%s%d.txt", fileb,(int)msgExp->par("QuerySrc") );//((CoOrdinatorBase*)pCoOrdinator)->getNodeId());				nw_pkt = fopen(fName,"ab");				char a[255];				sprintf(a, " %f RTS_EXPIRED  for  %d when sending to %d and msg kind = %d ssrc = %d\n", simTime(),  ((c802_11_Packet*)msgExp)->getHdr().SourceMACAddress, ((c802_11_Packet*)msgExp)->getHdr().DestinationMACAddress, msgExp->kind(),ssrc+1 );						fputs(a,nw_pkt);				fclose(nw_pkt);				}			}			ssrc+=1;			if ( ssrc > shortRetryLimit )			{							if(fWrite)			{				if ( ((int)msgExp->par("QuerySrc")) >0  && ((int)msgExp->par("QuerySrc")) < no_of_nodes )				{				FILE *nw_pkt;				sprintf(fName,"mac/%s%d.txt", fileb,(int)msgExp->par("QuerySrc") );//((CoOrdinatorBase*)pCoOrdinator)->getNodeId());				nw_pkt = fopen(fName,"ab");				char a[255];				sprintf(a, " %f DROP PACKET by  %d when sending to %d and msg kind = %d \n", simTime(),  ((c802_11_Packet*)msgExp)->getHdr().SourceMACAddress, ((c802_11_Packet*)msgExp)->getHdr().DestinationMACAddress, msgExp->kind() );						fputs(a,nw_pkt);				fclose(nw_pkt);				}			}				m_QueueOfMessages.pop();				m_QueueOfMessages.pop();				                        	cMessage *pNExpMsg = (cMessage*) m_QueueOfFragments.tail();				cMessage *pExpNtwMsg =(cMessage*)pNExpMsg->getObject("Netw_Pkt");							printf("POPPED %d ssrc %d shortRetryLimit %d , msg kind = %d\n",MyNodeId,ssrc,shortRetryLimit, pExpNtwMsg->kind());				m_QueueOfFragments.pop();				resetCW();								ssrc=0;				}			else						incContentionWindow();		m_NAVTimer =0;	// Exponential BackOff Algorithm		Bflag = 0;		if(!m_pMsgDIFSTimer -> isScheduled() ) scheduleAt(simTime(),m_pMsgDIFSTimer );				//if( !m_pMsgBOffTimer->isScheduled() ) scheduleAt(simTime() + ( 0.000680 + 0.000300 + 0.1 ) , m_pMsgBOffTimer);						/*sprintf(strMessage, "RTS_EXPIRED for Node %d, current time: %f", ((CoOrdinatorBase*)pCoOrdinator)->getNodeId(),  simTime());						recordScalar(strMessageName, strMessage);*/			break;		}			case COLLISION_TIMER:                {                        if(  m_QueueOfCollisionMsgs.length() >= 2 )                        { 			cMessage *collMsg1 = (cMessage*)m_QueueOfCollisionMsgs.pop();			int originMsgSrc1 = collMsg1->par("QuerySrc");			cMessage *collMsg2 = (cMessage*)m_QueueOfCollisionMsgs.pop();			int originMsgSrc2 = collMsg2->par("QuerySrc");			if(fWrite)			{				if (originMsgSrc1>=0 && originMsgSrc2>=0)				{				FILE *nw_pkt;				sprintf(fName,"mac/%s%d.txt", fileb,originMsgSrc1);				sprintf(fName,"mac/%s%d.txt",fileb,originMsgSrc2);				nw_pkt = fopen(fName,"ab");				char a[255];				sprintf(a, " %f COLLISION has occured between nodes %d and %d with the query src = %d and %d   My node id = %d \n", simTime(), ((c802_11_Packet*)collMsg1)->getHdr().SourceMACAddress,((c802_11_Packet*)collMsg2)->getHdr().SourceMACAddress,  originMsgSrc1, originMsgSrc2,((CoOrdinatorBase*)pCoOrdinator)->getNodeId());				fputs(a,nw_pkt);				fclose(nw_pkt);				}			}	      // then collision occured                                m_QueueOfCollisionMsgs.clear();// don't send back anything                        	 char str2[255];                                /*sprintf(str2, " COLLISION HAS OCCURED FOR NODE  %d \n current time=%f and src nodes are %d and %d" ,  (     (CoOrdinatorBase*)pCoOrdinator) -> getNodeId(),simTime(),((c802_11_Packet*)collMsg1)->getHdr().SourceMACAddress,((c802_11_Packet*)collMsg2)->getHdr().SourceMACAddress);			recordScalar(" COLLISION", str2  );*/                        }                        else                        {                                                                                                                                                                                             cMessage *dupMsg = (cMessage *)m_QueueOfCollisionMsgs.pop();                                /*char str4[255];                                                                                                                                                                                             /*sprintf(str4, " COLLISION HAS NOT OCCURED for node %d Current Time = %f" , ((CoOrdinatorBase*)pCoOrdinator) -> getNodeId(), simTime() );                                recordScalar( " NO COLLISION ", str4);*/                                                                                                                                                                                             HandleMessageFromBottomLayer(  (cMessage*) dupMsg);                        }                                                                                                                                                                                                                                                                                                                                          break;                                                                                                                                                                             }			}}int MAC_802_11::CheckWChannelStateAndTransmit(void)  // This is executed only when it wants to send RTS and in case NAVTIMER{	// Do NOT Tranmit RTS if this node has already sent an RTS and	// is inbetween the data transmission.//	printf(" NAVTIMER CheckWChannel %d \n", m_NAVTimer);	if ( 0 > m_NAVTimer ||  m_QueueOfMessages.empty() )		return 0;			if (m_pMsgRTSExpired->isScheduled()) {  		cancelEvent(m_pMsgRTSExpired);	}		cMessage *msg = (cMessage*)m_QueueOfMessages.tail();	cMessage *msgNew = (cMessage*)msg->dup();	if(msg->kind()==BTS_TYPE)	m_QueueOfMessages.pop();			/*if(m_pMsgNAVTimer->isScheduled() )	cancelEvent(m_pMsgNAVTimer);	scheduleAt(simTime() + m_NAVTimer, m_pMsgNAVTimer );	*/	char strMsgHeader[255] = "CheckWChanAndTransmit";	char strMsg[255];	/*sprintf(strMsg, "Sending message of type %d from %d to %d, Current time: %f", msgNew->kind(), ((c802_11_Packet*)msgNew)->getHdr().SourceMACAddress,((c802_11_Packet*)msgNew)->getHdr().DestinationMACAddress, simTime());	recordScalar("CHECKWChanAndTransmit" , strMsg);	recordScalar("-----------------", "----------------------------------------------------------------------");*/	if(msg->kind()!=BTS_TYPE)	{		m_New_NAVTimer = ((c802_11_Packet*)msg)->getHdr().timeForTransfer+ 0.000364 +  getPropagationDelay(); //0.1;	changeNAVTimer();	if(fWrite)	{	//printf("%f (int)msg->par(QuerySrc)= %d msg->type=%d MyNodeId = %d to %d \n",simTime(),(int)msg->par("QuerySrc"),msg->kind(),((CoOrdinatorBase*)pCoOrdinator)->getNodeId(),((c802_11_Packet*)msgNew)->getHdr().DestinationMACAddress );		if ( ((int)msg->par("QuerySrc")) >=0  && ((int)msg->par("QuerySrc")) < no_of_nodes )		{			FILE *nw_pkt;			//printf(" CHKWC The QuerySrc = %d msg-kind = %d \n",(int)msg->par("QuerySrc"),msg->kind());			sprintf(fName,"mac/%s%d.txt", fileb,(int)msg->par("QuerySrc") );//((CoOrdinatorBase*)pCoOrdinator)->getNodeId());			nw_pkt = fopen(fName,"ab");			char a[255];			sprintf(a, "\n %f Sending RTS  from %d to %d m_NAVTimer =%f NAVTIMER = %f\n", simTime(),  ((c802_11_Packet*)msgNew)->getHdr().SourceMACAddress, ((c802_11_Packet*)msgNew)->getHdr().DestinationMACAddress,m_NAVTimer,simTime()+m_NAVTimer);					fputs(a,nw_pkt);			fclose(nw_pkt);		}	}			scheduleAt(simTime() + (2*getPropagationDelay()+0.000680), m_pMsgRTSExpired);	 }	sendDelayed(msgNew,0.000354,"toBottomLayer");//	printf("%f msg sent MAC \n",simTime());		return 1;}double MAC_802_11::getPropagationDelay(){	cModule *RadioMod=pNode->submodule("Radio");	double distance=RadioMod->par("RadioRadius");	double propagationDelay=distance/SPEED_OF_LIGHT;	return propagationDelay;}void MAC_802_11::finish(){	//printf(" The number of Retries for NodeId %d is  %d  \n",MyNodeId,RtsExpiredCount);}

⌨️ 快捷键说明

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