Я работаю над фреймворком Veins, внутри OMNET ++. Я разрабатываю своего рода контролируемое наводнение в автомобильной сети. Я пытаюсь заставить автомобили отправлять данные только через 6 секунд (это значение можно изменить), поэтому я создал расписание при инициализации каждого транспортного средства (на TraCIDemo11p.cc), например:
if(sendData){ scheduleAt(simTime()+par("dataInterval").doubleValue(),sendDataEvt);}
На TraCIDemo11p.h я создал карту для буфера:
//Creating a map to represent the vehicle's message buffer
typedef map<string, WaveShortMessage*> MyMapContextMessageBuffer;
typedef pair<string, WaveShortMessage*> MyPairContextMessageBuffer;
MyMapContextMessageBuffer contextLocalMessageBuffer;
Поэтому с помощью функции onCata TraCIDemo11p.cc (WaveShortMessage * wsm) я делаю копию полученного сообщения, обновляю количество полученных сообщений, добавляю сообщение в буфер транспортного средства и распечатываю содержимое буфера, чтобы проверить, вставил ли я его. правильно:
//duplicating the message, so this vehicle has his own copy of the message
WaveShortMessage* wsmdup = wsm->dup();
//number of received messages
receivedMsgs++;
//add the msg in the vehicle buffer, the GlobalMessageIdentification is the id of the message
contextLocalMessageBuffer.insert(MyPairContextMessageBuffer(wsmdup->getGlobalMessageIdentificaton(),wsmdup));
//accessing something in the ->second on the buffer, it works in this function
cout<<"Sender "<< contextLocalMessageBuffer.begin()->second->getSender()<<endl;
Затем в назначенное время вызывается SEND_DATA_EVT (handleSelfMsg) для отправки данных, но я получаю сообщение об ошибке, когда пытаюсь получить доступ к contextLocalMessageBuffer.begin () — секунда (или она-> секунда).
//handleSelfMsg(cMessage* msg)
case SEND_DATA_EVT
//if the vehicle has received a msg before
if(receivedMsgs != 0){
//and the buffer isn't empty, the function is able to verify if the buffer isnt empty
if(!contextLocalMessageBuffer.empty()){//if i try to access the begin->first it works
cout<<"GlobalMessageID "<<contextLocalMessageBuffer.begin()->first<<" ";
//but if I try to access the begin->second->getSource(), it doesn't works in this function (i get an Error 139), but works inside of onData
cout<<findHost()->getFullName()<<" messageID "<<contextLocalMessageBuffer.begin()->first<<" "<<contextLocalMessageBuffer.begin()->second->getSource()<<endl;
//if I remove those couts the iterator and the for works but the send doesn't (Error 139), because it is trying to access the it->second
map<string, WaveShortMessage*>::iterator it;
for(it = contextLocalMessageBuffer.begin(); it != contextLocalMessageBuffer.end(); it++){
send(it->second)
}
}
}
//create a new schedule to send data after a new interval
scheduleAt(simTime() + par("dataInterval").doubleValue(), sendDataEvt);
Итак, подведем итог, моя проблема в том, что я могу работать с моей картой (contextLocalMessagebuffer) внутри onData, но не могу получить к ней доступ должным образом в HandleSelfMsg, оба в одном и том же коде (TraCIDemo11p.cc). Obs: я попытался создать функцию, которая возвращает значение буфера, но функция не смогла получить доступ к буферу тоже.
Спасибо!
Задача ещё не решена.
Других решений пока нет …