1. 程式人生 > >(二)NS3如何編譯、執行指令碼和 Command Line命令列引數設定

(二)NS3如何編譯、執行指令碼和 Command Line命令列引數設定

二、編譯、執行指令碼和Command Line命令列引數設定

7. 編譯和執行指令碼主要步驟

1) 將編寫的指令碼複製到ns-3.22/scratch目錄下(可以在ubuntu視窗介面直接複製)

進入ns3目錄: /ns-3.22

$ cp examples/tutorial/first.cc  scratch/myfirst.cc將指令碼複製到scratch目錄下

2) 構建(編譯)

$ ./waf

3) 執行

$ ./waf --run scratch/myfirst

(可能會有執行許可權問題,可在root下執行)

7.1  ns3中first.cc例子註釋

 //first.cc: 2個節點間的點到點通訊
 
 //標頭檔案包含
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"

//ns3名稱空間
using namespace ns3;

//日誌定義
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");

//主函式
int
main (int argc, char *argv[])
{
  //時間解析度
  Time::SetResolution (Time::NS);
  //使日誌元件生效:元件--UdpEchoClientApplication--級別INFO
  LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
  LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
  
//********生成網路節點********
  // 可以簡單看成部分掏空通訊部分內容的計算機,可以加入協議棧、應用及外設的網絡卡等。
  //節點容器類(包含許多方法):是一個helper幫助類,能夠一次操作多個節點。
  //如:利用其物件(變數)作為裝置helper類物件的引數,可以一次在安裝裝置到多個節點。
  NodeContainer nodes;
  nodes.Create (2);//利用該容器類的建立節點方法,建立兩個節點

//********物理連線計算機********
  // 抽象:物理實體=網路裝置+通道,兩者一一對應。
  PointToPointHelper pointToPoint;//點到點通訊助手類,通過所包含方法能設定網路裝置和通道屬性
  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));//呼叫成員函式
  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
  
  //網路裝置容器,即安裝了網路裝置和通道的節點
  NetDeviceContainer devices;
  devices = pointToPoint.Install (nodes);

//********安裝協議棧********//
  InternetStackHelper stack;//網路協議棧幫助類。屬於拓撲幫助類
  stack.Install (nodes);//為每個節點安裝協議棧,IP層
  //ipv4地址幫助類,屬於拓撲幫助類
  Ipv4AddressHelper address;
  address.SetBase ("10.1.1.0", "255.255.255.0");
  //ipv4介面容器類,為了以後引用方便,給網路裝置容器類配置地址。結果存在ipv4介面容器類的物件中。
  Ipv4InterfaceContainer interfaces = address.Assign (devices);
  
//********安裝應用層********//
  // UDP伺服器設定
  UdpEchoServerHelper echoServer (9);

  ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
  serverApps.Start (Seconds (1.0));
  serverApps.Stop (Seconds (10.0));
  // UDP客戶機
  UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9);//遠端伺服器地址和埠
  echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
  echoClient.SetAttribute ("PacketSize", UintegerValue (1024));

  ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));
  clientApps.Start (Seconds (2.0));
  clientApps.Stop (Seconds (10.0));
  //沒有加入Simulation::Stop(Seconds(11.0));模擬結束時間
  //因為first.cc例子的事件佇列中事件會自動操作完;
  //對於一直有事件產生的模擬(類似作業系統),必須設定模擬結束時間
  Simulator::Run ();
  Simulator::Destroy ();
  return 0;
}

7.2  CommandLine命令列引數

模擬一般是為了收集各種不同條件下的資料,常常需要改變一些變數。NS-3提供了Command Line引數介面,可以在執行時對指令碼中的變數進行設定,免去了每次更改變數後要重新編譯和構建指令碼的麻煩。

1) 修改已有屬性變數

在指令碼中新增語句

int main (int argc, char *argv[])

{

...

CommandLine cmd;

cmd.Parse (argc, argv);//將命令列輸入的引數作為類CommandLine的引數進行分析

...

}

這樣可以在shell中使用某些附加引數如PrintHelp

$~/ns-3.2.1 > ./waf --run "scratch/example --PrintHelp"

這條命令將會列出example當前可用的命令引數:

   Entering directory '/home/craigdo/repos/ns-3-dev/build'

   Compilation finished successfully

   --PrintHelp: Print this help message.

   --PrintGroups: Print the list of groups.

   --PrintTypeIds: Print all TypeIds.

   --PrintGroup=[group]: Print all TypeIds of group.

   --PrintAttributes=[typeid]: Print all attributes of typeid.

   --PrintGlobals: Print the list of globals.

從輸出中(倒數第二行)我們知道可以列印某些類的屬性:

$~/ns-3.2.1 > ./waf --run "scratch/example --PrintAttributes=ns3::PointToPointNetDevice"

這條命令將會列出型別為PointToPointNetDevice的裝置的屬性:

   --ns3::PointToPointNetDevice::DataRate=[32768bps]:

The default data rate for point topoint links

知道了屬性名稱,我們也可以使用命令更改這個屬性:前提須把指令碼中賦值語句註釋/刪除

$~/ns-3.2.1>./waf--run"scratch/example --ns3::PointToPointNetDevice::DataRate=5Mbps"

2) 新增自己的變數

使用CommandLine::AddValue新增自己的變數,通過鉤掛自己的變數將其與命令列相關聯,使之成為CommandLine可以使用的引數,

在指令碼中main函式開始新增

CommandLinecmd;

cmd.AddValue("nPackets","Number of packets to echo", nPackets); //(屬性名稱,屬性說明,變數)

cmd.Parse(argc,argv);

  這樣在shell中我們可以在命令中更改這個屬性:

$~/ns-3.2.1 > ./waf --run "scratch/example --nPackets=2"

參考文獻:

[1] http://blog.sina.com.cn/s/articlelist_1923709774_8_1.html

[2] ns-3project. ns-3 Software Tutorial. ns-3 project. 2015年2月26日

[3] ns-3project. ns-3 Reference Manual. ns-3 project. 2015年2月26日

[4]《ns-3網路模擬器基礎及應用》,人民郵電出版社,馬春光 姚建盛,2014年1月

部分參考網路資料,未一一列舉,敬請原諒!