2017-04-03 217 views
0

我已經開發了一個場景,首先車輛發送自己的消息,並在接收到自己的消息時向車輛局發送消息。只發送一次消息,而不是定期發送消息

自我訊息碼寫在initialize()方法中。但在模擬過程中,車輛每秒都會將消息發送給RSU。

我希望郵件只發送一次。我該怎麼辦? 我附上了我的TraciDemo11p.cc類的handleSelfmessage方法。

if(msg->isSelfMessage()==true) 
    { 
     cModule *tmpMobility = getParentModule()->getSubmodule("veinsmobility"); 
     mobility = dynamic_cast<Veins::TraCIMobility*>(tmpMobility); 
     ASSERT(mobility); 
     t_channel channel = dataOnSch ? type_SCH : type_CCH; 
     WaveShortMessage* wsm = prepareWSM("data", dataLengthBits, channel, dataPriority, -1,2); 

     wsm->setSenderAddress(myAddress); 
     wsm->setRecipientAddress(1001); 
     sendMessage(wsm->getWsmData()); 
    } 
+1

也包含'initialize()'函數的代碼 – user4786271

+0

你究竟把這個代碼放在哪裏?它是否在[TraCIDemo11p.cc]的'handleSelfMsg'中(https://github.com/sommer/veins/blob/veins-4.5/src/veins/modules/application/traci/TraCIDemo11p.cc)? –

回答

2

你的方法似乎是正確的,但顯然你在實現中有一些問題。

或者,你可以創建一個新的消息,並將其發送給自己

myOneTimeMsg = new cMessage("OneTimeMsg"); 
scheduleAt(simTime()+1.0, myOneTimeMsg); // this will send the message at t=currentTime+1.0 seconds 

然後你可以如下處理該消息:

if(msg->isSelfMessage()==true){ 
    if (msg == myOneTimeMsg) { 
     // do what you need next... 
1

修訂@ user4786271的答案:

的​​3210方法顯然是針對這個模塊接收到的每個自身消息執行的 - 可能還有非WSM。因此,如果您只是在那裏添加了給定的代碼,它將爲每個這些自我消息發送一個WSM。因此,只檢查自我消息類型是不夠的。您需要創建一個新的消息類型並檢查該類型,如@ user4786271所示。