(二)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月
部分參考網路資料,未一一列舉,敬請原諒!