2016-02-22 1 views
0

Я хотел бы накопить какое-то доверительное значение (например, 'theta =', которое находится между 0,5 и 1) от всех соседних узлов, а затем отправить другим узлам накопленное сообщение и значение доверия. Также необходимо сделать файл журнала этих значений в формате .txt или cvs. структура может быть как:Отправьте структуру вместе с сообщением, скопируйте сообщение и отправьте его на соседний адрес в Veins

struct knownVehicle { 
       int id; 
       std::string vType; 
       double theta=0.5; 
       simtime_t lastSeenAt; 
         }; 

void TraCITestApp::onData(EWaveShortMessage* wsm) { 
findHost()->getDisplayString().updateWith("r=16,green"); 
annotations->scheduleErase(1, annotations->drawLine(wsm->getSenderPos(), mobility->getPositionAt(simTime()), "blue")); 
    if (mobility->getRoadId()[0] != ':') traciVehicle->changeRoute("-39539626", 9999); 
     if (sentMessage){ 

    //Added for Knownvehicle receiving 
      knownVehicle &recveh = wsm->getKnownVeh(); 
       double rectheta = recveh.theta; 
       // process other fields of recveh 
       delete &recveh; // remember to remove dynamically created object 

      // check if new warning 
     bool isNewWarning = true; 
     for (map<long,WaveShortMessages>::iterator i = receivedWarningMessageMap.begin(); i != receivedWarningMessageMap.end(); ++i) { 
      WaveShortMessage* msg = i->second[0]; 
      if (msg->getTreeId() == wsm->getTreeId()) 
       isNewWarning = false; 
     } 
     // add warning message to received messages storage 
      receivedWarningMessageMap[wsm->getTreeId()].push_back(wsm->dup()); 
      std::ofstream logFile; 
      logFile.open("log.txt", std::ios_base::app); // if exist it will be overwritten if added "std::ios_base::app" Appends 
      std::stringstream ss; 
      std::cout<<"MyID="<<getMyID()<<";"<< "Sender Id="<< wsm->getSenderAddress()<<endl; 
      std::cout << "Accumulated receivedWarningMessageMap="<<wsm->dup() << std::endl; 
      logFile <<"MyID="<<getMyID()<< "Sender Id="<< wsm->getSenderAddress()<<endl; 

      for (auto it = receivedWarningMessageMap.begin(); it != receivedWarningMessageMap.end(); ++it) { 
       ss << "id=" << static_cast<int>(it->first) << "; wsms Contents="; 
       for (auto it2 : it->second) { 
        ss << it2 << "; "; 
         } 
       } 
       ss << endl; 

std::cout<<"MyID="<<getMyID()<<";"<< "Sender Id="<< wsm->getSenderAddress()<<endl; 
      std::cout << "Accumulated receivedWarningMessageMap="<<wsm->dup() << std::endl; 
      logFile <<"MyID="<<getMyID()<< "Sender Id="<< wsm->getSenderAddress()<<endl; 
      logFile << "====Accumulated receivedWarningMessageMap (wsm->dup())=>"<<wsm->dup() <<"====\n"<< std::endl; 
      logFile << ss.str(); 
      logFile <<"======================\n" <<endl; 
     // logFile.close(); 


void TraCITestApp::sendMessage1(double theta) 
{ 
     sentMessage = true; 
t_channel channel = dataOnSch ? type_SCH : type_CCH; 
EWaveShortMessage* wsm = prepareWSM("data", dataLengthBits, channel, dataPriority, -1,2); 
knownVehicle * veh = new knownVehicle(); 
veh->theta = 0.5; 

// set other fields... 
WaveShortMessage * packet = new WaveShortMessage(); 

packet->setKnownVeh(*veh); // I got error here ... 

// and now packet is ready to send, using send() OMNeT++ method 
sendWSM(wsm); 
} 
+0

Существует не хватает информации здесь, чтобы ответить на этот вопрос. Просьба рассказать о целях этих ценностей доверия, о том, что такое эти сообщения и куда они идут. Возможно, небольшой пример ввода и вывода. – voltrevo

+0

Я новичок в stackoverflow и жалею, что недостаточно информации, а также для моего плохого английского ... – Zecar

+0

Вы хотите отправить всю структуру 'knownVehicle' или только значение theta' или другую структуру? И вторая проблема: * когда * узел должен отправить сообщение с накопленным значением? –

ответ

1

Чтобы отправить экземпляр knownVehicle с помощью WaveShortMessage сделать следующую модификацию WaveShortMessage.msg:

// file: /veins/src/veins/modules/messages/WaveShortMessage.msg 
cplusplus {{ 
#include "veins/base/utils/Coord.h" 
struct knownVehicle { 
    int id; 
    std::string vType; 
    double theta; 
    simtime_t lastSeenAt; 
}; 
}} 

class noncobject knownVehicle; 
class noncobject Coord; 

packet WaveShortMessage { 
//Version of the Wave Short Message 
int wsmVersion = 0; 
// ... 
knownVehicle knownVeh; 
} 

Если вы хотите отправить WaveShortMessage с knownVehicle объекта используйте следующий код:

// add include: 
// #include "WaveShortMessage_m.h" 

knownVehicle * veh = new knownVehicle(); 
veh->theta = 0.5; 
veh->id = 15; 
// set other fields... 
WaveShortMessage * packet = new WaveShortMessage(); 
packet->setKnownVeh(*veh); 
// and now packet is ready to send, using send() OMNeT++ method 

ПриемWaveShortMessage:

void TraCIDemo11p::onData(WaveShortMessage* wsm) { 
    knownVehicle & recveh = wsm->getKnownVeh(); 
    double rectheta = recveh.theta; 
    // process other fields of recveh 
    delete &recveh; // remember to remove dynamically created object 

    // existing code of this method 
    findHost()->getDisplayString().updateWith("r=16,green"); 
    // ... 
} 
+1

Вы можете ** добавить объявление 'struct knownVehicle ...' в 'WaveShortMessage.msg' - сразу после строки' #include 'вены/base/utils/Coord.h "и перед'}} '. –

+0

Я попытался выполнить согласно вашей инструкции, но у меня появилось сообщение об ошибке: MSGC: veins/modules/messages/WaveShortMessage.msg Вены/модули/сообщения/WaveShortMessage.msg: 35: Ошибка: неизвестный тип 'knownVehicle' для поля ' knownVeh 'в' WaveShortMessage '. Также для получения wavehortmessage я могу использовать тот же код в OnData: поскольку я не использую handleMessage. Спасибо. – Zecar

+1

Вы, наверное, забыли строку 'class noncobject knownVehicle'. Я ввел вашу структуру в файл 'WaveShortMessage.msg' в своем ответе. –

Смежные вопросы