NS3 Command Line Arguments 使用命令行参数改变脚本

转自:http://blog.sina.com.cn/s/blog_7ec2ab360102wxgr.html


除了通过NS_LOG环境变量外,另一个不用编译就可以改变NS3脚本的方法就是通过使用命令行参数。

NS3提供了一种分析命令属性和基于这些属性自动设置本地和全局变量的机制。

 

 

一.重载默认属性

使用命令行属性系统的第一步就是声明命令行分析器:

int

main (int argc, char *argv[])

{

CommandLine cmd;        //提供了向NS-3全局变量和属性传递参数的途径

cmd.Parse (argc,argv);

}

 

在scratch/first.cc的main函数开始加上这两行代码,编译并运行脚本,同时可以根据下面两行代码向脚本寻求帮助:

$ ./waf --run "scratch/first --PrintHelp"     //让Waf运行first.cc脚本并且向脚本传递命令行参数-PrintHelp。其中,双引号用来确定哪个程序要得到哪个参数。命令行分析器将查看--PrintHelp参数,并且回应。

NS3 <wbr>Command <wbr>Line <wbr>Arguments <wbr>使用命令行参数改变脚本
下面来关注一下--PrintAttributes选项。在我们查看first.cc脚本的时候,已经提到过NS3的系统属性。

PointToPointHelper pointToPoint;

pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));

pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

我们已知DataRate是PointToPointNetDevice的一个属性。现在用命令行参数分析器来看一下PointToPointNetDevice的参数:

$ ./waf --run "scratch/first --PrintAttributes=ns3::PointToPointNetDevices"

NS3 <wbr>Command <wbr>Line <wbr>Arguments <wbr>使用命令行参数改变脚本
显示了网络设备的所有属性。
当系统中的PointToPointNetDevice被创建时,DataRate将作为一个默认值被运用。脚本用PointToPointHelper重载了这个默认值。现在,让我们删除first.cc中的SetDeviceAttribute和SetChannelAttribute调用,仅使用默认值来设置点到点设备和信道。

现在脚本只要声明PointToPointHelper,并且不做任何设置:

NodeContainer nodes;

nodes.Create (2);

 

PointToPointHelper pointToPoint;

 

NetDeviceContainer devices;

devices = pointToPoint.Install (nodes);

使用./waf运行脚本,启用UDPecho服务器应用的一些日志并打开时间前缀,如

$ export 'NS_LOG=UdpEchoServerApplication=level_all|prefix_time'

可以看到下面的结果:

NS3 <wbr>Command <wbr>Line <wbr>Arguments <wbr>使用命令行参数改变脚本

之前PointToPointHelper设置参数时,Echo服务器收到数据包的仿真时间是2.00369s。现在是2.25732s。

NS3 <wbr>Command <wbr>Line <wbr>Arguments <wbr>使用命令行参数改变脚本
这是因为PointToPointNetDevice的数据传输速率从5Mbps降到了32768bps。我们采用了默认值。

如果我们采用命令行来改用一个新的DataRate,能够重新加快仿真速度。我们可以根据帮助文档中指明的规则,按照下面的方法来做:

$ ./waf --run "scratch/first --ns3::PointToPointNetDevices::DataRate=5Mbps"     //将数据传输速率重新设置为5Mbps

NS3 <wbr>Command <wbr>Line <wbr>Arguments <wbr>使用命令行参数改变脚本
现在,Echo服务器收到数据包的仿真时间是2.00169s,这是因为之前的信道延迟是2ms,而现在变成了0ns。

同理可得,我们可以用同样的方式设置信道属性:

NS3 <wbr>Command <wbr>Line <wbr>Arguments <wbr>使用命令行参数改变脚本
得到的默认值是0ns。

我们可以通过下面的方法设置这两个默认值:

$ ./waf --run "scratch/first --ns3::PointToPointNetDevices::DataRate=5Mbps 

--ns3::PointToPointChannel::Delay=2ms"

NS3 <wbr>Command <wbr>Line <wbr>Arguments <wbr>使用命令行参数改变脚本
现在,仿真时间就和之前的一样了。

我们可以用这样的方法来设置脚本中任何属性。

问题:如何知道所有已有的属性?

可以通过--PrintHelp帮助,如下

NS3 <wbr>Command <wbr>Line <wbr>Arguments <wbr>使用命令行参数改变脚本

如果,你选择--PrintGroups选项,你将看到一张列有所有已注册的TypeId groups。group的名字与src目录下的模型名一致。一次性输出所有消息,会导致信息量太大,所以我们可以进一步过滤一些信息,例如输出单组信息:

$ ./waf --run "scratch/first --PrintGroup==PointToPoint"

NS3 <wbr>Command <wbr>Line <wbr>Arguments <wbr>使用命令行参数改变脚本
当然还有一种方法来查找属性信息,那就是ns-3Doxygen。

 

 

二.向命令行系统添加自设属性

你可以利用AddValue方法,向命令行系统添加自己的属性。

 

让我们用这个方法来改变echo中的数据包数量。首先,在main函数中添加一个本地变量nPackets。我们会将nPackets初始化为1,使之与之前的默认参数一致。为了允许命令行参数分析器可以改变nPackets值,我们需要在分析器中hook这个值。让我们在first.cc中做一些变动:

int

main (int argc, char *argv[])

{

uint32_t nPackets=1;

 

CommandLine cmd;

cmd.AddValue("nPackets","Number of Packets to echo",nPackets);

cmd.Parse(argc,argv);

…}

向下拉到脚本中我们设置MaxPackets Attribute的地方,做以下变动:

echoClient.SetAttribute("MaxPackets",UintegerValue (nPackets));

编译运行,并向脚本寻求帮助:

$ ./waf --run "scratch/first --PrintHelp"

NS3 <wbr>Command <wbr>Line <wbr>Arguments <wbr>使用命令行参数改变脚本
可以在帮助列表中看到新的用户选项——nPackets。
如果你想改变nPackets的值,你可以通过命令行参数来改变:

$ ./waf --run "scratch/first --nPackets=2"

NS3 <wbr>Command <wbr>Line <wbr>Arguments <wbr>使用命令行参数改变脚本
如果你是一个NS3用户,你可以用命令行参数系统控制全局变量和属性。

如果你是一个模型作者,你可以向你的对象添加新的属性,你的模型用户可以通过命令行参数系统设置这些属性。

如果你是一个脚本作者,你可以轻松地在你的脚本里添加新变量,并且将它们添加进命令行参数系统。

 

 


--------------------------------完----------------------------------

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值