如何在OMNeT++ 6.0.1中获取丢包率、吞吐量与端到端延迟统计?
OMNeT++ 6.0.1(INET 4.5)UDP视频流仿真统计问题
问题描述
在OMNeT++ 6.0.1搭配INET 4.5环境下开展UDP视频流仿真,尝试通过@statistic[nameOfStatistic]统计丢包率,但结果并未出现在.anf文件中,不清楚该如何计算该指标。同时希望获取每个节点的丢包率、吞吐量与端到端延迟数据,请问应使用何种模块过滤器或结果名称过滤器?
附上当前NED与.ini配置代码:
.NED 文件
import inet.networklayer.configurator.ipv4.Ipv4NetworkConfigurator; import inet.node.ethernet.EthernetSwitch; import inet.node.inet.StandardHost; import inet.node.inet.WirelessHost; import inet.node.wireless.AccessPoint; import inet.physicallayer.wireless.ieee80211.packetlevel.Ieee80211ScalarRadioMedium; import inet.visualizer.common.IntegratedVisualizer; import ned.DatarateChannel; //WIRED-SCENARIO network GiB { parameters: @display("bgb=1986.9299,976.53595"); @statistic[endToendDelay](title="end-to-end delay"; source="messageAge(rcvdPk)"; unit=s; record=vector); @statistic[throughput](title="throughput"; unit=bps; source="throughput(rcvdPk)"; record=vector); int numHosts; int numWHosts; types: channel Ether1000m extends DatarateChannel { datarate = 1000Mbps; delay = 0.1us; } submodules: standardHost[numHosts]: StandardHost; standardHost1[numHosts]: StandardHost; server: StandardHost { @display("p=985.446,69.498;i=device/server"); } configurator: Ipv4NetworkConfigurator { @display("p=263.675,820.875"); } centerSwitch: EthernetSwitch { @display("p=985.446,276.21"); } ethernetSwitch1: EthernetSwitch { @display("p=518.562,441.936"); } ethernetSwitch2: EthernetSwitch { @display("p=760.914,488.26797"); } wirelessHost[numWHosts]: WirelessHost { @display("p=265.518,185.328"); } wirelessHost1[numWHosts]: WirelessHost { @display("p=115.829994,367.09198"); } accessPoint: AccessPoint { @display("p=504.306,276.21"); } accessPoint1: AccessPoint { @display("p=311.85,422.33398"); } radioMedium: Ieee80211ScalarRadioMedium { @display("p=450.2375,818.3875"); } visualizer: IntegratedVisualizer { @display("p=114.424995,820.875"); } ethernetSwitch3: EthernetSwitch { @display("p=1044.252,497.17798"); } ethernetSwitch4: EthernetSwitch { @display("p=1309.77,506.08798"); } ethernetSwitch5: EthernetSwitch { @display("p=1564.596,543.51"); } standardHost2[numHosts]: StandardHost; standardHost3[numHosts]: StandardHost; standardHost4[numHosts]: StandardHost; connections: server.ethg++ <--> Ether1000m <--> centerSwitch.ethg++; ethernetSwitch1.ethg++ <--> Ether1000m <--> centerSwitch.ethg++; ethernetSwitch2.ethg++ <--> Ether1000m <--> centerSwitch.ethg++; centerSwitch.ethg++ <--> Ether1000m <--> ethernetSwitch3.ethg++; centerSwitch.ethg++ <--> Ether1000m <--> ethernetSwitch4.ethg++; centerSwitch.ethg++ <--> Ether1000m <--> ethernetSwitch5.ethg++; for i=0..numHosts-1 { ethernetSwitch1.ethg++ <--> Ether1000m <--> standardHost[i].ethg++; standardHost1[i].ethg++ <--> Ether1000m <--> ethernetSwitch2.ethg++; ethernetSwitch3.ethg++ <--> Ether1000m <--> standardHost2[i].ethg++; ethernetSwitch4.ethg++ <--> Ether1000m <--> standardHost3[i].ethg++; ethernetSwitch5.ethg++ <--> Ether1000m <--> standardHost4[i].ethg++; } ethernetSwitch1.ethg++ <--> Ether1000m <--> accessPoint1.ethg++; ethernetSwitch2.ethg++ <--> Ether1000m <--> accessPoint.ethg++; }
.ini 文件
[General] network = GiB sim-time-limit = 3600s #**.numHosts = ${5..25 step 10} **.numHosts = ask **.numWHosts = ask **.channel.throughput.statistic-recording = true **.channel.throughput.result-recording-modes = all **.*.vector-recording = true **.*.vector-recording-intervals = 0..900 **.*.scalar-recording = true **.standardHost[*].numApps = 1 **.standardHost[*].app[*].typename = "UdpVideoStreamClient" **.standardHost[*].app[*].serverAddress = "server" **.standardHost[*].app[*].serverPort = 1000 **.constraintAreaMinX = 0m **.constraintAreaMinY = 0m **.constraintAreaMinZ = 0m **.constraintAreaMaxX = 800m **.constraintAreaMaxY = 500m **.constraintAreaMaxZ = 0m **.standardHost1[*].numApps = 1 **.standardHost1[*].app[*].typename = "UdpVideoStreamClient" **.standardHost1[*].app[*].serverAddress = "server" **.standardHost1[*].app[*].serverPort = 1000 **.standardHost2[*].numApps = 1 **.standardHost2[*].app[*].typename = "UdpVideoStreamClient" **.standardHost2[*].app[*].serverAddress = "server" **.standardHost2[*].app[*].serverPort = 1000 **.standardHost3[*].numApps = 1 **.standardHost3[*].app[*].typename = "UdpVideoStreamClient" **.standardHost3[*].app[*].serverAddress = "server" **.standardHost3[*].app[*].serverPort = 1000 **.standardHost4[*].numApps = 1 **.standardHost4[*].app[*].typename = "UdpVideoStreamClient" **.standardHost4[*].app[*].serverAddress = "server" **.standardHost4[*].app[*].serverPort = 1000 **.server.numApps = 1 **.server.app[*].typename = "UdpVideoStreamServer" **.server.app[*].localPort = 1000 **.server.app[*].sendInterval = 0.001s **.server.app[*].packetLen = 1400B **.server.app[*].videoSize = 1Gb **.addDefaultRoutes = false #Assigning SSID to access point and configuring wireless hosts *.accessPoint.numApps = 1 *.accessPoint.numWlanInterfaces = default *.accessPoint.wlan[*].mgmt.ssid = "AP" *.accessPoint1.numApps = 1 *.accessPoint1.numWlanInterfaces = default *.accessPoint1.wlan[*].mgmt.ssid = "AP1" *.wirelessHost[*].numApps = 1 *.wirelessHost[*].wlan[*].agent.defaultSsid = "AP" *.wirelessHost[*].app[*].typename = "UdpVideoStreamClient" *.wirelessHost[*].app[*].serverAddress = "server" *.wirelessHost[*].app[*].serverPort = 1000 *.wirelessHost1[*].numApps = 1 *.wirelessHost1[*].wlan[*].agent.defaultSsid = "AP1" *.wirelessHost1[*].app[*].typename = "UdpVideoStreamClient" *.wirelessHost1[*].app[*].serverAddress = "server" *.wirelessHost1[*].app[*].serverPort = 1000
解决方案
1. 丢包率统计问题修复与计算方式
你之前在网络NED里定义的@statistic没生效,是因为统计源没绑定到具体的模块事件(比如客户端的接收、服务器的发送)。丢包率需要基于服务器发送的包数和客户端接收的包数计算,公式为:丢包率 = 1 - (客户端接收包数 / 服务器对应客户端的发送包数)
配置方式二选一:
方式一:在NED中为客户端/服务器添加统计
修改网络的parameters块,添加针对客户端的丢包率统计:
@statistic[packetLossRate]( title="Packet Loss Rate"; source="(count(sentPk) - count(rcvdPk)) / count(sentPk)"; record=scalar,vector; unit=ratio; module="*.standardHost[*].app[*],*.standardHost1[*].app[*],*.standardHost2[*].app[*],*.standardHost3[*].app[*],*.standardHost4[*].app[*],*.wirelessHost[*].app[*],*.wirelessHost1[*].app[*]"; )
这里module指定了所有客户端模块,统计每个客户端自身的发送/接收差与发送数的比值。
方式二:在.ini中全局配置统计
在.ini的[General]块添加:
# 统计每个客户端的接收包数 **.*Host[*].app[*].rcvdPk.statistic-recording = true # 统计服务器的发送包数 **.server.app[*].sentPk.statistic-recording = true # 定义丢包率统计 **.*Host[*].app[*].@statistic[packetLossRate].source = "1 - (count(rcvdPk) / count(sentPk))" **.*Host[*].app[*].@statistic[packetLossRate].record = scalar,vector **.*Host[*].app[*].@statistic[packetLossRate].unit = ratio
2. 每个节点的指标过滤配置
要获取每个节点的三个指标,需要在结果分析时使用以下过滤器:
模块过滤器(针对节点)
- 所有客户端(合并):
**.*Host[*].app[*] - 有线客户端单独筛选:
**.standardHost[*].app[*],**.standardHost1[*].app[*],**.standardHost2[*].app[*],**.standardHost3[*].app[*],**.standardHost4[*].app[*] - 无线客户端单独筛选:
**.wirelessHost[*].app[*],**.wirelessHost1[*].app[*]
结果名称过滤器(针对指标)
- 端到端延迟:
*endToendDelay* - 吞吐量:
*throughput* - 丢包率:
*packetLossRate*
简化的.ini统计配置(覆盖所有指标)
替换你现有.ini中的统计相关配置,改为:
# 启用所有客户端的核心统计 **.*Host[*].app[*].statistic-recording = true **.*Host[*].app[*].result-recording-modes = all # 端到端延迟:客户端接收包时记录消息年龄 **.*Host[*].app[*].@statistic[endToendDelay].source = "messageAge(rcvdPk)" **.*Host[*].app[*].@statistic[endToendDelay].record = scalar,vector **.*Host[*].app[*].@statistic[endToendDelay].unit = s # 吞吐量:基于接收包计算 **.*Host[*].app[*].@statistic[throughput].source = "throughput(rcvdPk)" **.*Host[*].app[*].@statistic[throughput].record = scalar,vector **.*Host[*].app[*].@statistic[throughput].unit = bps # 丢包率:基于发送/接收包数计算 **.*Host[*].app[*].@statistic[packetLossRate].source = "1 - (count(rcvdPk) / count(sentPk))" **.*Host[*].app[*].@statistic[packetLossRate].record = scalar,vector **.*Host[*].app[*].@statistic[packetLossRate].unit = ratio
3. 结果验证
仿真结束后,在OMNeT++的结果分析工具中:
- 选择模块过滤器为
**.*Host[*].app[*] - 选择结果名称过滤器为
endToendDelay|throughput|packetLossRate - 即可查看每个客户端节点的对应指标数据,这些数据会自动写入.anf文件。
内容的提问来源于stack exchange,提问作者nisar007
相关产品推荐
相关产品推荐

