如何在 OMNeT++ 中模拟期间更改网络配置?

Posted

技术标签:

【中文标题】如何在 OMNeT++ 中模拟期间更改网络配置?【英文标题】:How to change configuration of network during simulation in OMNeT++? 【发布时间】:2015-04-13 19:31:19 【问题描述】:

我想修改OMNeT++中元素的.ini文件的一些参数,比如一个节点的传输速率,在模拟运行期间,例如当一个节点收到一些控制消息时。

我发现信息说可以以某种方式循环配置,如下所示:some_variable = $几个值,但 中没有条件子句.ini 文件,并且无法将来自 C++ 函数的任何数据传递给这些文件(就我而言)。

我使用 INET,但可能其他模型的用户已经为此类问题烦恼。

【问题讨论】:

【参考方案1】:

我发现信息说可以以某种方式循环配置,如下所示:some_variable = $several values,但 .ini 文件中没有条件子句,并且无法传递给那些归档来自 C++ 函数的任何数据(就我而言)。

事实上,您可以在 INI 文件中使用内置的constraint 表达式。这将允许您为给定的配置创建运行,同时尊重指定的约束(条件)。

但是,此约束仅适用于 .ini 文件中指定的参数,即,如果您尝试更改的变量是作为代码的一部分动态计算的,这对您没有帮助

下面,我给你一个来自 .ini 文件的相当复杂的“code-sn-p”,它使用了你提到的许多内置函数(变量迭代、条件等)

                # Parameter assignment using iteration loops and constrains #
# first define the static values on which the others depend #
scenario.node[*].application.ADVlowerBound = $t0= 0.1s
scenario.node[*].application.aggToServerUpperBound = $t3= 0.9s
#
## assign values to "dependent" parameters using variable names and loop iterations #
scenario.node[*].application.ADVupperBound = $t1= $t0..$t3 step 0.1s        # ADVupperBound == t1; t1 will take values starting from t0 to t3 (0.1 - 0.9) iterating 0.1
scenario.node[*].application.CMtoCHupperBound = $t2= $t0..$t3 step 0.1s
#
## connect "dependent" parameters to their "copies" -- this part of the snippet is only variable assignment.
scenario.node[*].application.CMtoCHlowerBound = $t11 = $t1s
scenario.node[*].application.joinToServerLowerBound = $t12 = $t1s
#
scenario.node[*].application.aggToServerLowerBound = $t21 = $t2s
scenario.node[*].application.joinToServerUpperBound = $t22 = $t2s
#
constraint = ($t0) < ($t1) && ($t1) < ($t2) && ($t2) < ($t3)
                # END END END #

上面的代码为t0t3 创建了所有可能的时间值组合,它们可以在0.10.9 之间取值。

t0t3 分别是起点和终点。 t1t2 基于它们获取值。

t1 将采用介于 t0t3 之间的值,每次递增 0.1(参见上面的语法)。 t2 也是如此。

但是,我希望t0 始终小于t1t1 小于t2,并且t2 小于t3。我在constraint 部分中指定了这些条件。

我确信,通读手册的this 部分,将帮助您找到解决方案。

【讨论】:

【参考方案2】:

如果您想在模拟期间更改某些值,您可以在您的 C++ 代码中执行此操作。比如:

handleMessage(cMessage *msg)
  if(msg->getKind() == yourKind)  // replace yourKind with the one you are using for these messages
    transmission_rate = new_value;

您所说的 some_variable = $several values 可用于使用不同的参数执行多次运行。例如,以 1 秒的速度运行一次,以 2 秒的速度运行,以 10 秒的速度运行。那将是:

transsmission_rate = $1, 2, 10s

有关如何使用这些值的更多详细信息(例如循环),请参阅OMNeT++ User Manual 中的相关部分

【讨论】:

【参考方案3】:

虽然您当然可以手动更改 volatile parameters,但 OMNeT++(据我所知)不提供在运行时自动更改参数的集成支持。

但是,您可以编写一些changes volatile parameters programatically 的模型代码。

【讨论】:

没错,我需要的是par("*some_parameter*").setLongValue(*new_value*)。当然,在我不得不在 NED 文件中将 *some_parameter* 设置为 volatile 之前。谢谢! @Rudi 为在不同时间返回不同值的参数指出了一个巧妙的技巧here

以上是关于如何在 OMNeT++ 中模拟期间更改网络配置?的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 如何在使用OMNeT ++框架构建的NB-IoT模拟器中检测数据包的示例。

如何在anylogic中模拟期间动态更改资源池的班次组大小?

使用 INet 在 Omnet++ 上检查和投射错误

charles如何模拟弱网环境

在 OMNeT++ 仿真中使用使用 Matlab Compiler SDK 创建的共享库

如何在 OMNET++ 中将消息从一个节点发送到多个节点?