如何在OMNeT++的AODV网络中统计指定指标数据
OMNeT++ AODV示例中各统计指标的实现方法
1. 网络进入/退出时间
- 网络进入时间:在移动节点的移动模块(如INET的
MobilityBase子类)或AODV模块里,记录节点完成初始化、能参与网络通信的时刻——比如节点完成IP配置或首次发送Hello包时,把simTime()存入成员变量,最后用cOutVector或cScalarStatistics输出统计值。 - 网络退出时间:监听节点下线事件,比如移动超出所有邻居覆盖范围、节点故障触发的逻辑,在事件处理函数里记录当前
simTime()。如果是移动节点,可通过位置更新回调判断是否脱离网络,此时记录退出时间。
2. 丢包率
- 方法一:用INET自带的
PacketSink和PacketSource模块,统计接收包数和发送总包数,丢包率 = (发送总数 - 接收总数) / 发送总数 * 100%。 - 方法二:在AODV路由模块的
handleMessage()里,判断数据报转发失败的情况(比如找不到路由、TTL耗尽),维护丢包计数器,同时统计总发送包数,最后计算比例。 - 用
cScalarStatistics保存发送数、接收数、丢包数,仿真结束后在finish()里计算输出丢包率。
3. 网络形成时间
- 定义为从仿真启动到所有节点间都能建立有效路由的时刻,实现逻辑:
- 做一个全局统计模块,维护计数器记录完成路由初始化的节点数。
- 每个节点的AODV模块在完成邻居发现(收到第一个Hello回复、路由表有有效邻居路由)时,向全局模块发消息递增计数器。
- 当计数器等于总节点数时,记录当前
simTime()就是网络形成时间。
- 全局模块用
cSimpleModule实现,通过sendDirect()接收节点的初始化完成消息。
4. 端到端延迟
- 发送端(如
UdpApp)发数据包时,给包加时间戳:packet->addTag<CreationTimeTag>()->setCreationTime(simTime());。 - 接收端收到包后,提取时间戳,用当前时间减去创建时间得到延迟。
- 用
cOutVector记录每个包的延迟,用cStatistic统计平均值、最大值、百分位数等。
5. 吞吐量
- 按单位时间内成功传输的字节数计算(通常转成bps):
- 接收端维护累计接收字节数的变量,每次收包就累加
packet->getByteLength()。 - 仿真结束或指定时间间隔内,计算吞吐量 = 累计字节数 * 8 / 仿真时长(单位:bps)。
- 接收端维护累计接收字节数的变量,每次收包就累加
- 用
cScalarStatistics存累计字节数,finish()里计算输出,也可以用cOutVector按时间间隔输出吞吐量变化。
6. 跳数
- AODV路由条目里本身就有
hopCount字段,转发时会更新:- 方法一:发送端给数据包加自定义标签,初始跳数设0,每个中间节点转发时递增,接收端提取最终跳数统计。
- 方法二:直接从AODV路由表取对应目的节点的跳数,发送前记录,接收端验证后统计。
- 用
cOutVector记录每个包的跳数,cStatistic统计平均跳数、分布情况。
通用统计工具使用要点
- 所有统计变量(
cOutVector、cStatistic等)要在模块的initialize()里初始化,示例代码:cOutVector endToEndDelayVec; cStatistic delayStats; void initialize() override { endToEndDelayVec.setName("endToEndDelay"); delayStats.setName("delayStatistics"); } - 在
finish()里输出统计结果,示例:void finish() override { recordScalar("averageDelay", delayStats.getMean()); recordScalar("maxDelay", delayStats.getMax()); delayStats.recordAs("delayDistribution"); } - 全局统计(如网络形成时间)可以用
getModuleByPath()获取全局模块,或借助cSimulation的全局事件机制。
内容的提问来源于stack exchange,提问作者zt0526
相关产品推荐
相关产品推荐

