转自:http://blog.sina.com.cn/s/blog_7ec2ab360102wxgr.html
除了通过NS_LOG环境变量外,另一个不用编译就可以改变NS3脚本的方法就是通过使用命令行参数。
NS3提供了一种分析命令属性和基于这些属性自动设置本地和全局变量的机制。
一.重载默认属性
使用命令行属性系统的第一步就是声明命令行分析器:
int
main (int argc, char *argv[])
{
…
CommandLine cmd;
cmd.Parse (argc,argv);
…
}
在scratch/first.cc的main函数开始加上这两行代码,编译并运行脚本,同时可以根据下面两行代码向脚本寻求帮助:
$ ./waf --run "scratch/first --PrintHelp"
下面来关注一下--PrintAttributes选项。在我们查看first.cc脚本的时候,已经提到过NS3的系统属性。
PointToPointHelper pointToPoint;
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
我们已知DataRate是PointToPointNetDevice的一个属性。现在用命令行参数分析器来看一下PointToPointNetDevice的参数:
$ ./waf --run "scratch/first --PrintAttributes=ns3::PointToPointNetDevices"
显示了网络设备的所有属性。
现在脚本只要声明PointToPointHelper,并且不做任何设置:
NodeContainer nodes;
NetDeviceContainer devices;
使用./waf运行脚本,启用UDPecho服务器应用的一些日志并打开时间前缀,如
$ export 'NS_LOG=UdpEchoServerApplication
可以看到下面的结果:
之前PointToPointHelper设置参数时,Echo服务器收到数据包的仿真时间是2.00369s。现在是2.25732s。
这是因为PointToPointNetDevice的数据传输速率从5Mbps降到了32768bps。我们采用了默认值。
如果我们采用命令行来改用一个新的DataRate,能够重新加快仿真速度。我们可以根据帮助文档中指明的规则,按照下面的方法来做:
$ ./waf --run "scratch/first --ns3::PointToPointNetDevices::DataRate=5Mbps"
现在,Echo服务器收到数据包的仿真时间是2.00169s,这是因为之前的信道延迟是2ms,而现在变成了0ns。
同理可得,我们可以用同样的方式设置信道属性:
我们可以通过下面的方法设置这两个默认值:
$ ./waf --run "scratch/first --ns3::PointToPointNetDevices::DataRate=5Mbps
--ns3::PointToPointChannel::Delay=2ms"
我们可以用这样的方法来设置脚本中任何属性。
问题:如何知道所有已有的属性?
可以通过--PrintHelp帮助,如下
如果,你选择--PrintGroups选项,你将看到一张列有所有已注册的TypeId groups。group的名字与src目录下的模型名一致。一次性输出所有消息,会导致信息量太大,所以我们可以进一步过滤一些信息,例如输出单组信息:
$ ./waf --run "scratch/first --PrintGroup==PointToPoint"
当然还有一种方法来查找属性信息,那就是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"
可以在帮助列表中看到新的用户选项——nPackets。
如果你想改变nPackets的值,你可以通过命令行参数来改变:
$ ./waf --run "scratch/first --nPackets=2"
如果你是一个NS3用户,你可以用命令行参数系统控制全局变量和属性。
如果你是一个模型作者,你可以向你的对象添加新的属性,你的模型用户可以通过命令行参数系统设置这些属性。
如果你是一个脚本作者,你可以轻松地在你的脚本里添加新变量,并且将它们添加进命令行参数系统。
--------------------------------完----------------------------------