OMNeT++ INET4.4类型转换错误求助:无法转换Ieee80211DimensionalTransmission
我用OMNeT++和INET 4.4搭建干扰仿真场景,包含两对通信节点:source→destination工作在IEEE802.11b/g信道2;Node1→Node2工作在信道4。但仿真频繁终止,报错如下:
check_and_cast(): Cannot cast (inet::physicallayer::Ieee80211DimensionalTransmission*) to type 'const inet::physicallayer::IScalarSignal *' -- in module (inet::physicallayer::Ieee80211Radio) AnalogModelShowcaseDistanceNetworkRM.source.wlan[1].radio (id=200), at t=0.001s, event #24
我的omnetpp.ini配置如下:
[Config Distance] network = AnalogModelShowcaseDistanceNetworkRM sim-time-limit = 5s # Maryam **.radio.packetErrorRate.result-recording-modes = +vector # Maryam **.radio.bitErrorRate.result-recording-modes = +vector # application parameters *.source.numApps = 1 *.source.app[0].typename = "UdpBasicApp" *.source.app[*].destAddresses = "destination" *.source.app[*].destPort = 1000 *.source.app[*].messageLength = 1000byte *.source.app[*].sendInterval = 1ms *.destination.numApps = 1 *.destination.app[0].typename = "UdpSink" *.destination.app[*].localPort = 1000 *.Node1.numApps = 1 *.Node1.app[0].typename = "UdpBasicApp" *.Node1.app[*].destAddresses = "Node2" *.Node1.app[*].destPort = 1001 *.Node1.app[*].messageLength = 1000byte *.Node1.app[*].sendInterval = 1ms *.Node2.numApps = 1 *.Node2.app[0].typename = "UdpSink" *.Node2.app[*].localPort = 1001 *.source.numWlanInterfaces = 2 *.destination.numWlanInterfaces = 2 *.Node1.numWlanInterfaces = 2 *.Node2.numWlanInterfaces = 2 *.source.wlan[*].radio.typename = "Ieee80211DimensionalRadio" *.destination.wlan[*].radio.typename = "Ieee80211DimensionalRadio" *.Node*.wlan[*].radio.typename = "Ieee80211DimensionalRadio" *.source.wlan[*].radio.centerFrequency = 2.412GHz *.source.wlan[*].radio.bandwidth = 2MHz *.source.wlan[*].radio.transmitter.power = 2mW *.source.wlan[*].radio.transmitter.bitrate = 2Mbps *.source.wlan[*].radio.transmitter.preambleDuration = 0s *.source.wlan[*].radio.transmitter.headerLength = 96b *.source.wlan[*].radio.transmitter.modulation = "BPSK" *.source.wlan[*].radio.receiver.sensitivity = -85dBm *.source.wlan[*].radio.receiver.energyDetection = -85dBm *.source.wlan[*].radio.receiver.snirThreshold = 4dB *.destination.wlan[*].radio.centerFrequency = 2.412GHz *.destination.wlan[*].radio.bandwidth = 2MHz *.destination.wlan[*].radio.transmitter.power = 2mW *.destination.wlan[*].radio.transmitter.bitrate = 2Mbps *.destination.wlan[*].radio.transmitter.preambleDuration = 0s *.destination.wlan[*].radio.transmitter.headerLength = 96b *.destination.wlan[*].radio.transmitter.modulation = "BPSK" *.destination.wlan[*].radio.receiver.sensitivity = -85dBm *.destination.wlan[*].radio.receiver.energyDetection = -85dBm *.destination.wlan[*].radio.receiver.snirThreshold = 4dB *.Node*.wlan[*].radio.centerFrequency = 2.412GHz *.Node*.wlan[*].radio.bandwidth = 2MHz *.Node*.wlan[*].radio.transmitter.power = 2mW *.Node*.wlan[*].radio.transmitter.bitrate = 2Mbps *.Node*.wlan[*].radio.transmitter.preambleDuration = 0s *.Node*.wlan[*].radio.transmitter.headerLength = 96b *.Node*.wlan[*].radio.transmitter.modulation = "BPSK" *.Node*.wlan[*].radio.receiver.sensitivity = -85dBm *.Node*.wlan[*].radio.receiver.energyDetection = -85dBm *.Node*.wlan[*].radio.receiver.snirThreshold = 4dB *.source.wlan[0].radio.channelNumber = 2 *.destination.wlan[0].radio.channelNumber = 2 *.Node1.wlan[0].radio.channelNumber = 4 *.Node2.wlan[0].radio.channelNumber = 4 # mobility parameters *.destination.mobility.typename = "LinearMobility" *.destination.mobility.initialMovementHeading = 0deg *.destination.mobility.speed = 200mps *.destination.mobility.constraintAreaMinX = 500m *.destination.mobility.constraintAreaMaxX = 1200m # wlan *.source.**.transmitter.power = 12mW *.source.**.displayCommunicationRange = true **.backgroundNoise.power = -105dBm **.wlan*.mac.*.rateSelection.dataFrameBitrate = 54Mbps **.wlan*.mac.dcf.channelAccess.pendingQueue.packetCapacity = 14 # visualizer parameters *.visualizer.*.numStatisticVisualizers = 2 *.visualizer.*.statisticVisualizer[0].signalName = "packetSentToUpper" *.visualizer.*.statisticVisualizer[0].statisticExpression = "packetErrorRate" *.visualizer.*.statisticVisualizer[0].sourceFilter = "*.destination.wlan[*].radio" *.visualizer.*.statisticVisualizer[0].format = "packetErrorRate(Maryam): %v" *.visualizer.*.statisticVisualizer[1].signalName = "packetSentToUpper" *.visualizer.*.statisticVisualizer[1].statisticExpression = "minimumSnir" *.visualizer.*.statisticVisualizer[1].sourceFilter = "*.destination.wlan[*].radio" *.visualizer.*.statisticVisualizer[1].format = "SNIR(Maryam): %v" *.visualizer.*.statisticVisualizer[1].placementHint = "topLeft" *.visualizer.*.dataLinkVisualizer[0].displayLinks = true *.visualizer.*.packetDropVisualizer[0].displayPacketDrops = true *.visualizer.*.packetDropVisualizer[0].nodeFilter = "destination" *.visualizer.*.packetDropVisualizer[0].labelFormat = "(Maryam) %r" *.visualizer.*.infoVisualizer[0].displayInfos = true *.visualizer.*.infoVisualizer[0].modules = "*.destination.app[0]"
问题原因与解决方法
这个错误的核心是信号模型不匹配:使用了Ieee80211DimensionalRadio(维度化信号模型,支持频域细节),但仿真中某个组件试图将其传输信号强制转换为IScalarSignal(标量信号模型,仅处理单一功率值),导致类型转换失败。
具体修复步骤:
统一信号模型组件
两种可选方案:- 保留维度化无线电:添加匹配的模拟模型配置,确保所有物理层组件兼容维度化信号:
**.wlan*.radio.analogModel.typename = "Ieee80211DimensionalAnalogModel" - 切换为标量无线电:如果不需要维度化信号的复杂特性,直接替换所有无线电类型为标量版本:
*.source.wlan[*].radio.typename = "Ieee80211ScalarRadio" *.destination.wlan[*].radio.typename = "Ieee80211ScalarRadio" *.Node*.wlan[*].radio.typename = "Ieee80211ScalarRadio"
- 保留维度化无线电:添加匹配的模拟模型配置,确保所有物理层组件兼容维度化信号:
修正信道频率配置
Node1/Node2指定了信道4,但当前配置的中心频率是信道2的2.412GHz,信道4的正确中心频率为2.422GHz,需修正:*.Node*.wlan[0].radio.centerFrequency = 2.422GHz另外,每个节点配置了2个wlan接口,但仅设置了wlan[0]的信道,wlan[1]参数缺失。如果不需要第二个接口,将
numWlanInterfaces改为1;如果需要,补充wlan[1]的信道和频率配置。移除重复参数覆盖
配置中存在重复的功率设置:先设置*.source.wlan[*].radio.transmitter.power = 2mW,后又用*.source.**.transmitter.power = 12mW覆盖,这种重复可能导致初始化异常,建议保留其中一处设置。修正可视化统计信号
统计可视化器的signalName配置错误,packetErrorRate和minimumSnir对应自身信号,而非packetSentToUpper,修正为:*.visualizer.*.statisticVisualizer[0].signalName = "packetErrorRate" *.visualizer.*.statisticVisualizer[1].signalName = "minimumSnir"
内容的提问来源于stack exchange,提问作者Maryam

