INET框架下参数定义的sink节点位置未更新该如何修复?
INET框架Sink节点mobility坐标与配置不符问题解决
问题复现
我搭建了如下无线传感器网络*(重点关注sink节点定义)*:
import inet.physicallayer.wireless.apsk.packetlevel.ApskScalarRadioMedium; import inet.node.inet.SensorNode; network SensorNetwork { int numNodes = default(15); string interfaceTableModule = default("interfaceTable"); int areaX @unit(m) = 500m; int areaY @unit(m) = 500m; int sinkX @unit(m) = int (this.areaX*(0.5)); int sinkY @unit(m) = this.areaY; @display("bgb=$areaX,$areaY;bgu=m"); submodules: sink: SensorNode { @display("i=device/antennatower;p=$sinkX,$sinkY"); } node[numNodes]: SensorNode; radioMedium: ApskScalarRadioMedium { @display("p=45,79"); } }
运行后发现sink节点mobility子模块的lastPosition为(0, 0, 0) m,和预期的(250,500,0)m不符;如果直接在@display的p属性里写固定数值,lastPosition就能正常更新。
根因说明
@display注解里的p属性仅控制OMNeT++画布上节点图标的显示位置,不是mobility模块的实际位置配置。
你之前填固定值时坐标能匹配,是因为默认mobility模块开启了initFromDisplayString开关,会从display string读取初始坐标,但这个读取逻辑不支持$参数名形式的变量引用,变量替换只在NED编译阶段生效,mobility运行时读取display string拿到的是未替换的$sinkX、$sinkY,识别失败就回退到默认的(0,0,0)。
修复方法
直接给sink节点的mobility子模块显式指定初始坐标参数即可,不需要依赖display string的隐式读取:
submodules: sink: SensorNode { @display("i=device/antennatower;p=$sinkX,$sinkY"); // 显式指定mobility的初始坐标,和你定义的sinkX、sinkY参数绑定 mobility.initialX = sinkX; mobility.initialY = sinkY; mobility.initialZ = 0m; }
如果你的SensorNode默认未配置mobility类型,可以同步指定:
sink: SensorNode { @display("i=device/antennatower;p=$sinkX,$sinkY"); mobility: StationaryMobility { initialX = sinkX; initialY = sinkY; } }
配置完成后重新运行,mobility的lastPosition就会正确显示为你设定的坐标值。
内容的提问来源于stack exchange,提问作者Gérard KPONHINTO
相关产品推荐
相关产品推荐

