Вены: handleLowerMsg (cMessage * msg) не активируется - PullRequest
0 голосов
/ 31 января 2020

Я должен построить немного другой набор сообщений. Таким образом, мне пришлось отойти от DemoBaseAppLayer и использовать непосредственно BaseApplLayer. Мои файлы ned почти нормальны, как предоставлено Vienes. Я должен построить App Ned, Подержанный автомобиль и Сценарий из Viens. Я подписываюсь на BaseMobility :: mobilityStateChangedSignal. Такие методы, как handlePositionUpdate и handleSelfMessage, работают нормально. Они отлично работают. Они создают сообщение и отправляют его.

Однако handleLowerMessage не активируется ни разу. Что я мог упустить? Ваши мысли будут оценены.

Минимальный код Reproducibale

`
#ifndef BSMAPP_H_
#define BSMAPP_H_

#include <map>
#include "veins/modules/world/annotations/AnnotationManager.h"
#include "veins/base/modules/BaseApplLayer.h"
#include "veins/modules/utility/Consts80211p.h"
#include "veins/modules/messages/BaseFrame1609_4_m.h"
#include "veins/base/connectionManager/ChannelAccess.h"#include"veins/modules/mac/ieee80211p/DemoBaseApplLayerToMac1609_4Interface.h"
#include "veins/modules/mobility/traci/TraCIMobility.h"
#include "veins/modules/mobility/traci/TraCICommandInterface.h"
namespace veins {

using veins::AnnotationManager;
using veins::AnnotationManagerAccess;
using veins::TraCICommandInterface;
using veins::TraCIMobility;
using veins::TraCIMobilityAccess;
//using namespace Veins;

class BSMApp: public BaseApplLayer {

public:

    BSMApp();
    virtual ~BSMApp() override;

    void initialize(int stage) override;
    void finish() override;
    void receiveSignal(cComponent* source, simsignal_t signalID, cObject* obj,
            cObject* details) override;
    enum BaseApplMessageKinds {
        SEND_BEACON_EVT,
        //SEND_WSA_EVT
    };
protected:
bool isSelfMsgSent;
void handleSelfMsg(cMessage* msg) override;
virtual void handleLowerMsg(cMessage* msg) override;
virtual simtime_t computeAsynchronousSendingTime(simtime_t interval, ChannelType chantype);
cMessage* sendBeaconEvt;
virtual void handlePositionUpdate(cObject* obj) ;
TraCIMobility* mobility;
    TraCICommandInterface* traci;
    TraCICommandInterface::Vehicle* traciVehicle;

    AnnotationManager* annotations;
    DemoBaseApplLayerToMac1609_4Interface* mac;
}`

и cc файл

  `using namespace veins;
    Define_Module(veins::BSMApp);
    void BSMApp::receiveSignal(cComponent* source, simsignal_t signalID, cObject* obj,
                cObject* details){
        //EV_DEBUG << "BSMApp::receiveSignal start " << endl;
        EV << "BSMApp::receiveSignal start " << endl;
        cout<< "BSMApp::receiveSignal start"<<endl;
        Enter_Method_Silent();
            if (signalID == BaseMobility::mobilityStateChangedSignal) {
                handlePositionUpdate(obj);
                EV_DEBUG << "BSMApp::receiveSignal updated position " << endl;
            }else{
                EV_DEBUG << "BSMApp::receiveSignal NOT of type mobility state change signal " << endl;
            }
            EV_DEBUG << "BSMApp::receiveSignal end " << endl;
    }
    void BSMApp::initialize(int stage){
    //Almost same as Demo App
    }

    void BSMApp::handleLowerMsg(cMessage* msg) {
    cout << "BSMApp::handleLowerMsg start " << endl;
    }
    void BSMApp::handleSelfMsg(cMessage* msg) {
    cout << "BSMApp::handleSelfMsg start " << endla
    isSelfMsgSent=true;;
    }
    void BSMApp::handlePositionUpdate(cObject* obj) {
    if(!isSelfMsgSent){
            cout<<"Trying to set isSelfMsgSent"<<endl;
           this->handleSelfMsg(sendBeaconEvt);
    }
    }`

Спасибо. С уважением, SJ

1 Ответ

0 голосов
/ 05 февраля 2020

Полагаю, ответ на вопрос лежит в первом ответе на мой @Christoph Sommer. Я понял, что метод sendDown в handleSelfMsg не вызывается из-за предыдущего логического выражения. Я исправил эту проблему, и все начинает работать.

...