c++ - OMNET++: 如何在 INET 4.0 中获取帧的源 MAC 地址?

标签 c++ omnet++ mac-address inet data-link-layer

我正在使用 INET Framework 4.0 和 OMNET++。我已经自定义了我的 Ieee80211ScalarRadio 模块来读取从我的 AdhocHost 中的各种 AP 接收到的信标的信号功率和源 MAC 地址。
这是我的自定义 CIeee80211ScalarRadio.ned 文件:

import inet.physicallayer.ieee80211.packetlevel.Ieee80211ScalarRadio;

module CIeee80211ScalarRadio extends Ieee80211ScalarRadio
{
    @class(inet::physicallayer::CIeee80211ScalarRadio);
}

这里是对应的CIeee80211ScalarRadio.cc文件:

#include "inet/physicallayer/ieee80211/packetlevel/Ieee80211Radio.h"
#include "inet/physicallayer/common/packetlevel/SignalTag_m.h"
#include "inet/linklayer/common/MacAddressTag_m.h"


#include <omnetpp.h>
#include <string>

#include <cmath>
#include <iostream>

namespace inet{
namespace physicallayer{
class CIeee80211ScalarRadio : public Ieee80211Radio{
protected:
   virtual void sendUp(Packet *macFrame) override;
};

Define_Module(CIeee80211ScalarRadio);

void CIeee80211ScalarRadio::sendUp(Packet *macFrame)
{
    if (macFrame->findTag<SignalPowerInd>() != nullptr) {
           auto signalPowerInd = macFrame->getTag<SignalPowerInd>();
           auto rxPower = signalPowerInd->getPower().get();
           double pdBm = 10*log10(rxPower)+30;
           EV_INFO << "RX power = " << pdBm << " dBm" << endl;
    }
    if(macFrame->findTag<MacAddress>() != nullptr){
        auto macAddress = macFrame->getTag<MacAddress>();
        EV_INFO << "Mac Address = " << macAddress << endl;
    }

    Radio::sendUp(macFrame);
}
}//namespace physicallayer
}//namespace inet

如您所见,我重写了 Ieee80211ScalarRadiosendUp() 方法以从 macFrame 获取我想要的值。< br/> 我可以成功提取 RxPower,但是,当我为 MacAddress 做同样的事情时,我在 INET 中得到以下编译器错误源代码:

../inet4/src/inet/common/packet/tag/TagSet.h:123:36: error: static_cast from 'std::__1::__vector_base<omnetpp::cObject *, std::__1::allocator<omnetpp::cObject *> >::value_type' (aka 'omnetpp::cObject *') to 'inet::MacAddress *', which are not related by inheritance, is not allowed

如何在没有任何错误的情况下获取 MacAddress 值?

最佳答案

包含MAC地址的标签的正确名称是MacAddressInd,而不是MacAddress。它在您包含的 MacAddressTag_m.h 中声明。

编辑
附加说明:MacAddressInd 包含两个地址:源地址和目标地址。所以你应该明确你想要获得哪一个,例如:

auto macAddress = macFrame->getTag<MacAddressInd>()->getSrcAddress();

关于c++ - OMNET++: 如何在 INET 4.0 中获取帧的源 MAC 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51408759/

相关文章:

c++ - 如何在 OMNeT++ 仿真期间更改网络配置?

c++ - OMNeT++ TicToc 扩展字符串消息

iphone - iPhone 的 MAC 地址是唯一的,它会改变吗?

c++ - 递归显式模板实例化是否可能?

c++ - boost::archive::binary_(i/o) 归档可移植性

c++ - OMNeT++缓冲器设计

java - 如何在android中获取Wifi连接设备的MAC地址

C++ 在构造函数中初始化数组

c++ - 在 C++ 中转换大整数 <-> double

ip - 为什么不使用 MAC 地址而不是本地 IP?