如何在Inet 4.2中修改无线节点发射功率并实现动态逐秒增长
INET 4.2 无线节点发射功率动态调整实现方案
1 涉及的核心类及修改逻辑
不需要修改INET原生源码,通过继承扩展即可实现需求,涉及的核心类如下:
inet::physicallayer::FlatTransmitter:默认的发射参数配置类,存储发射功率等核心参数,我们可以继承该类添加功率修改接口inet::physicallayer::IRadio:射频接口类,可通过该类获取transmitter实例,触发功率更新omnetpp::cSimpleModule的自消息机制:用来实现每秒触发一次功率调整的定时逻辑
2 具体实现步骤
2.1 自定义支持动态修改功率的Transmitter类
新建C++类继承FlatTransmitter,添加功率更新的公共方法:
// DynamicPowerFlatTransmitter.h #include "inet/physicallayer/wireless/common/radio/packetlevel/FlatTransmitter.h" using namespace inet::physicallayer; class DynamicPowerFlatTransmitter : public FlatTransmitter { public: // 入参功率单位为瓦 void setTransmissionPower(double powerW); }; // DynamicPowerFlatTransmitter.cc void DynamicPowerFlatTransmitter::setTransmissionPower(double powerW) { this->power = inet::units::values::W(powerW); }
同时新增对应的NED模块定义:
module DynamicPowerFlatTransmitter extends FlatTransmitter { @class(DynamicPowerFlatTransmitter); }
2.2 替换仿真场景中的Transmitter配置
在ini配置文件中修改无线节点的transmitter类型,设置初始功率:
# 替换默认Transmitter为我们自定义的版本 *.node[*].wlan[0].radio.transmitter.typename = "DynamicPowerFlatTransmitter" # 初始发射功率设置为2mW *.node[*].wlan[0].radio.transmitter.power = 2mW
2.3 实现定时功率更新逻辑
可以在节点的自定义应用层模块中添加自消息定时逻辑,示例代码如下:
// 自定义应用层类的头文件中添加成员变量 omnetpp::cMessage *powerUpdateTimer = new omnetpp::cMessage("powerUpdate"); double currentPowerMw = 2.0; // 初始功率2mW DynamicPowerFlatTransmitter *transmitter; // 初始化函数中获取transmitter实例,启动第一个定时器 void YourApp::initialize(int stage) { if (stage == inet::INITSTAGE_APPLICATION_LAYER) { auto radio = getModuleFromPar<inet::physicallayer::IRadio>(par("radioModule"), this); transmitter = check_and_cast<DynamicPowerFlatTransmitter*>(radio->getTransmitter()); // 1秒后触发第一次功率更新 scheduleAt(omnetpp::simTime() + 1.0, powerUpdateTimer); } } // 消息处理函数中处理功率更新逻辑 void YourApp::handleMessage(omnetpp::cMessage *msg) { if (msg == powerUpdateTimer) { currentPowerMw += 0.1; // 每次上调0.1mW // 转换为瓦单位更新transmitter参数 transmitter->setTransmissionPower(currentPowerMw * 0.001); // 注册下一秒的更新事件 scheduleAt(omnetpp::simTime() + 1.0, powerUpdateTimer); } } // 析构函数销毁定时器 YourApp::~YourApp() { cancelAndDelete(powerUpdateTimer); }
3 注意事项
- INET内部默认功率单位是瓦(W),做mW到W的单位转换时不要出错,避免功率设置偏差过大
- 如果需要不同节点的功率调整逻辑不同,每个节点单独维护自己的
currentPowerMw变量即可
内容的提问来源于stack exchange,提问作者Maryam
相关产品推荐
相关产品推荐

