【问题标题】:Aggregating results of vectors based on Omnet++ signals基于 Omnet++ 信号的向量聚合结果
【发布时间】:2016-11-23 18:38:49
【问题描述】:

我想使用基于 Omnet++ 信号的向量计算随时间变化的总体交付率?当有多个源且只有一个接收器时,我如何实现它。

例如,假设我有 10 个移动节点向固定 AP 发送数据,传输率等于(接收/发送数据包),但 AP 只知道接收数据包的数量。

我声明了以下信号和统计数据:

对于 AP:

@signal[receivedBndl](type = "int");
@statistic[receivedBundle](title="ReceivedBundle";source=receivedBndl;record=count,mean,last,vector);

对于节点:

@signal[sentBndl](type = "int");
@statistic[sentBundle](title="SentBundle";source=sentBndl;record=count,mean,last,vector);

是否可以创建另一个 @statistics 来使用这 2 个信号计算随时间变化的交付率?

谢谢,

【问题讨论】:

    标签: omnet++


    【解决方案1】:

    这更像是网络范围的统计信息,而不是与单个节点相关的信息,因此您必须在顶级网络模块本身而不是实际节点上安装统计监听器。 OMNeT++ 信号在包含链上向上传播,因此发送到特定节点的任何信号也将被传递到包含网络模块。这使得可以在网络上安装统计信息并在那里(也)获得给定的信号。

    为了实现这一点,我将重写代码以实际发出发送/接收的 cPacket 对象(而不是将它们的计数作为整数)。您仍然可以使用统计中的 count() 函数来统计数据包的数量。

    对于 AP:

    @signal[receivedBndl](type = cPacket);
    

    对于节点:

    @signal[sentBndl](type = cPacket);
    

    由于每个实际发送/接收的数据包现在都发送到它们的发送/接收模块(以及它们之上的任何东西),您可以在顶级模块中安装一个统计信息并将它们组合成一个统计信息:

    @statistic[deliveryratio](source=count(receivedBndl)/count(sentBndl); record=last);
    

    最后一行将在顶层模块上安装两个信号侦听器,并且每次任何模块在网络中的任何位置生成或接收数据包时,统计信息都会计算该值。

    【讨论】:

    • 所以,如果我明白你在说什么,我必须从所有发送者和接收者模块向将处理这些统计数据的全局模块发出信号,然后再发出一个新信号使用向量来绘制统计数据和交付率与时间的关系。
    • 另外,sum和count有什么区别,有点混乱?谢谢,
    • 不,您不必将所有信号发送到顶级模块。每个信号都可以发送到实际模块。我建议将统计数据附加到顶层模块。发送到模块的信号会自动传递到模块和 OMNeT++ 中的所有父模块。这意味着默认情况下,顶层网络模块接收发送到网络中任何模块的所有信号。您不必修改实际的 emit() 代码,只需在顶层收集统计信息。 (至于 COUNT 与 SUM,你是对的,这是误导性的,我已经更正了答案)
    • 添加了更多关于如何创建派生统计的信息。
    猜你喜欢
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多