Как реализовать связь RSU с RSU в омнет ++ Veins?

Я пытаюсь реализовать связь RSU с RSU в венах. Для этого я добавил входной шлюз в модуль RSU (файл RSU.ned):

module RSU
{
    parameters:
        string applType; //type of the application layer
        string nicType = default("Nic80211p"); // type of network interface card
    gates:
        input veinsradioIn; // gate for sendDirect
        inout gate[]; // add in out gates to ensure communication between RSUs        
    submodules:
        appl: <applType> like org.car2x.veins.base.modules.IBaseApplLayer {
            parameters:
                @display("p=60,50");
        }

        nic: <nicType> like org.car2x.veins.modules.nic.INic80211p {
            parameters:
                @display("p=60,166");
        }

        mobility: BaseMobility {
            parameters:
                @display("p=130,172;i=block/cogwheel");
        }

    connections allowunconnected:
        nic.upperLayerOut --> appl.lowerLayerIn;
        nic.upperLayerIn <-- appl.lowerLayerOut;
        nic.upperControlOut --> appl.lowerControlIn;
        nic.upperControlIn <-- appl.lowerControlOut;

        veinsradioIn --> nic.radioIn;
}

Кроме того, в файле RSUExampleScenario.ned я добавил второй RSU и подключил два RSU:

network RSUExampleScenario extends Scenario
{
    types:
        channel myChannel extends ned.DelayChannel {
            delay = 100ms;
        };

    submodules:
        rsu[2]: RSU {                @display("i=veins/sign/yellowdiamond;is=vs;p=150,140;b=10,10,oval;r=1000");
        }            
    connections allowunconnected:
        rsu[0].gate++ <--> myChannel <--> rsu[1].gate++;
}

В файле TraciDemoRSU11p.cc я пытаюсь отправить такое сообщение:

int nb_gate = gateSize("gate");
int out_ = intuniform(0,nb_gate-1);    
cMessage *msg = dynamic_cast<cMessage*>(hmsg);
cMessage *copy = (cMessage *)msg->dup();
send(copy, "gate$o", out_);

При выполнении этого кода у меня возникает следующая ошибка: Нет такого затвора или вектора затвора: 'gate' - в модуле (TraCIDemoRSU11p) RSUExampleScenario.rsu [1] .appl (id = 16), at t = 26.019453568907s, событие # 452

Как я могу с этим справиться?


person Medani Khedidja    schedule 19.04.2019    source источник
comment
Ваш модуль rsu - это составной модуль, который содержит множество подмодулей. Применяется один подмодуль. Вы генерируете сообщение в приложении, но вы только добавили шлюз в rsu. Таким образом, сообщение об ошибке правильное. Может быть, вы хотите добавить еще один новый гейт в приложение и подключить его к новому гейт от rsu   -  person Christoph Sommer    schedule 21.04.2019
comment
Спасибо M. Christoph Sommer за ваш ответ. Фактически, я добавил входной шлюз как в модуль RSU, так и в подмодуль приложения для прямой отправки. Идея состоит в том, что при выполнении TraciDemoRSU11p за отправку сообщений отвечает модуль .rsu [] .appl. Поэтому мне нужно добавить соединение для прямой отправки сообщения из подмодуля приложения в его родительский RSU на стороне отправителя. Таким образом, получающий RSU может принять сообщение и отправить его непосредственно в подмодуль приложения для обработки. Это верно?   -  person Medani Khedidja    schedule 22.04.2019
comment
Я не совсем понимаю ваш последующий комментарий. Вы хотите сказать, что на ваш вопрос не ответили? У вас есть второй вопрос? Или вы хотите вместо этого задать другой вопрос?   -  person Christoph Sommer    schedule 22.04.2019
comment
Чтобы подтвердить, что то, что я сделал, правильно, я хочу знать точный процесс обмена сообщениями между двумя RSU. Потому что с моим реальным кодом ошибки нет, но и сообщения между RSU не обмениваются.   -  person Medani Khedidja    schedule 23.04.2019
comment
Итак, в модуле RSU (файл RSU.ned) у меня есть входной шлюз; Я добавил такие же ворота в подмодуль appl {gates: gate @directIn;}. Затем я добавил это соединение: gate ‹--› appl.gate. В сценарии RSUExampleScenario я соединил два RSU следующим образом: rsu [0] .g ‹--› rsu [1] .g; Теперь в TraciDemoRSU11p.cc я использовал sendDirect для передачи сообщения его родительскому объекту (sendDirect (msg, getParentModule (), gate $ o);). Я добавил файл RSU.cc, который содержит метод handleMessage для получения дохода sendDirect. На этом этапе я не могу наблюдать получение сообщения модулем RSU.   -  person Medani Khedidja    schedule 23.04.2019
comment
Кроме того, когда я вызываю метод handleMessage в TraciDemoRSU11p.cc, я обнаруживаю, что входящие сообщения от узлов принимаются на RSU через этот метод, а не через onWsm / onHello жил. Кроме того, нет сообщений, полученных от другого RSU?   -  person Medani Khedidja    schedule 23.04.2019
comment
Это похоже на другой вопрос. Здесь обсуждается ваш вопрос While executing this code, I have the following error: No such gate or gate vector: 'gate' [...] How can I deal with?.   -  person Christoph Sommer    schedule 23.04.2019
comment
Задача решена. Спасибо M. Christoph Sommer за оказанную помощь. Решение состоит в том, чтобы добавить входной шлюз (@directIn) для подмодуля appl, как вы сказали, и вызвать метод sendDirect для отправки сообщений. Кроме того, для получения этих сообщений вызывается метод handleMessage.   -  person Medani Khedidja    schedule 24.04.2019