前言
无线传感网络课程设计结束,新学习了NS-3仿真软件的使用,过程中遇到了许多问题,也总结了一些心得,打算写下来以作记录。尤其在过程中深感这方面可参考的资料匮乏与琐碎,所以系统的记录下整个过程,望能对他人有所启发。
环境配置是在WMware虚拟机运行平台上安装的Linux Ubuntu操作系统,然后在 Ubuntu操作系统上安装NS-3网络仿真器。
本次仿真设计通过NS-3软件完成,使用可视化程序 NetAnim来显示节点部署情况,利用gawk工具通过awk脚本来计算网络的吞吐量和通信时延等参数,并且使用绘图软件Gnuplot实现参数的可视化。
仿真环境搭建
首先对于虚拟机的搭建我参考的以下两个博文,Ubuntu选择的18.04版本,老版本虽然操作界面没那么美观但是参考资料更多,亲测好用:
VMware下载安装教程https://blog.csdn.net/weixin_45912291/article/details/108894737?spm=1001.2014.3001.5506
安装完成Ubuntu操作系统后,就要安装本次的主角--NS-3网络仿真软件,整个安装过程指令多、时间长,务必耐心安装,磨刀不误砍柴工,安装流程参考下面链接:
ubuntu 18.04安装NS-3教程https://blog.csdn.net/qq_39346534/article/details/107298205
对于安装过程中出现的几个问题做以下总结:
1.【E:无法定位软件包 python-pygoocanvas E: 无法定位软件包 libgoocanvas-dev】
解决方案参考:解决方案1https://blog.csdn.net/qq_39346534/article/details/108594862
2.【安装openmpi*时存在依赖】
(1)sudo apt-get install aptitude // 首先得安装 aptitude 工具
(2)udo aptitude install <package name> // 使用 aptitude 安装需要的依赖项
PS: 这里的依赖项是上图中的openmpi的子包,逐个安装,会有几个包提示仍无法安装,可以忽略,不会影响后续实验。
至此,实验环境搭建完毕,可以运行一下NS-3中的例程文件first.cc(在examples文件夹中)检查安装是否成功,所有的运行文件都要放在NS-3的scratch文件夹中运行,运行指令:
./waf --run scratch/first
传感网络构建
Step1:创建网络节点
创建一个节点作为中心节点,其他节点直接与中心节点相连,整个网络由中心节点进行集中式管理,各节点的通信都要经过中心节点,AP(无线接入点)就是本实验中网络的中心节点。 本次设置了6个接入点(STA站点),每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。程序如下:
uint32_t nSta = 6;
NodeContainer staNodes;
staNodes.Create(nSta);
NodeContainer apNodes;
apNodes.Create(1);
Step2:设置通信信道和物理层
在NS-3中可以把节点连接到代表数据交换信道的对象上。在这里,基本的通信子网这一抽象概念被称为信道,用C++编写的Channel类来描述,Channel类提供了管理通信子网对象和把节点连接至信道的各种方法。一个信道实例可以模拟一条简单的线缆,也可以模拟一个复杂的巨型以太网交换机,信道模型的实例包括:
点对点信道PointToPointChannel:P2P的有线网络连接是两个终端直接建立有线连接,不经过中继设备直接交换数据或服务。
多点接入信道CsmaChannel:总线型的网络连接是采用单根传输线作为总线,所有工作站都共用一条总线,总线中任一节点发生故障不会造成整个网络的瘫痪。
无线信道WifiChanne:无线型网络是两个终端不通过电缆等有线方式,将无线电波作为载波和物理层的网络建立节点之间的连接。
我们使用的是无线通信信道和经典PHY模型。程序如下:
YansWifiChannelHelper channel=YansWifiChannelHelper::Default();
YansWifiPhyHelper phy=YansWifiPhyHelper::Default();
phy.SetChannel(channel.Create());
WifiHelper wifi;
wifi.SetRemoteStationManager("ns3::AarfWifiManager");
Step3:配置通信的数据链路层
配置通信的Mac类型以及基础设置SSID,无线网的名字为ns-3-ssid,并且安装AP和STA节点通信设备。然后向网络节点加入移动模型,让STA可以在x、y轴正负50范围内随机移动,AP节点位置固定。程序如下:
WifiMacHelper mac;
Ssid ssid=Ssid("ns-3-ssid");
mac.SetType("ns3::StaWifiMac","Ssid",SsidValue(ssid),"ActiveProbing",BooleanValue(false));
NetDeviceContainer staDevices;
staDevices=wifi.Install(phy,mac,staNodes);
mac.SetType("ns3::ApWifiMac","Ssid",SsidValue(ssid));
NetDeviceContainer apDevice;
apDevices=wifi.Install(phy,mac,apNode);
MobilityHelper mobility;
mobility.SetPositionAllocator("ns3::GridPositionAllocator","MinX",DoubleValue(0.0),"MinY",DoubleValue(0.0),"DeltaX",DoubleValue(5.0),"DeltaY",DoubleValue(10.0),"GridWidth",UintegerValue(3),"LayoutType",StringValue("RowFirst"));
mobility.SetMobilityModel("ns3::RandomWalk2dMobilityModel","Bounds",RectangleValue(Rectangle(-50,50,-50,50)));
mobility.Install(staNodes);
mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
mobility.Install(apNode);
Step4:配置网络层和运输层
为传感网节点安装TCP/IP协议栈。安装了TCP/IP协议栈的节点还不能直接通信,还需要为节点的网络设备分配IP地址:声明一个地址生成器对象,地址从10.1.1.0开始,并以255.255.255.0为子网掩码分配地址,地址分配默认是从1开始并单调递增。中心节点的IP地址为10.1.1.7,6个STA节点IP地址为10.1.1.1至10.1.1.6。程序如下:
InternetStackHelper stack;
stack.Install(staNodes);
stack.Install(apNode);
Ipv4AddressHelper address;
address.SetBase("10.1.1.0","255.255.255.0");
Ipv4InterfaceContainer wifiInterfaces;
wifiInterfaces=address.Assign(staDevices);
address.Assign(apDevice);
Step5:配置应用层
在NS3中并没有真正的操作系统的概念,更没有特权级别或者系统调用的概念,NS-3中的应用是对物理世界中应用程序内部网络通信功能的抽象,即模拟分组的发送和接收行为。在NS3中,需要被仿真的用户程序被抽象为应用,用Application类来描述,这个类提供了管理仿真过程中用户层应用的各种方法,常用Application的子类有:UdpEcho、OnOffApplication、PacketSink。在这里使用Application类的两个实例:EchoClient和EchoServer发送和回应仿真网络中的数据包。程序如下:
UdpEchoServerHelper echoServer(9);
ApplicationContainer serverApps=echoServer.Install(staNodes.Get(0));
serverApps.Start(Seconds(1.0));
serverApps.Stop(Seconds(15.0));
UdpEchoClientHelper echoClient(wifiInterfaces.GetAddress(0),9);
echoClient.SetAttribute("MaxPackets",UintegerValue(50));
echoClient.SetAttribute("Interval",TimeValue(Seconds(0.5)));
echoClient.SetAttribute("PacketSize",UintegerValue(1024));
Step6:生成后续数据处理文件
最后生成一些数据文件,包括生成PCAP类型文件用于查看具体数据包内容、生成用于netanim的XML类型文件用于观察网络的拓扑结构、对数据包进行追踪得到TR类型文件用于后续数据吞吐量等的计算。程序如下:
phy.EnablePcapAll("star");
AnimationInterface anim("star-ljy.xml");
anim.SetMaxPktsPerTraceFile(99999999999999);
AsciiTraceHelper asciiTraceHelper;
phy.EnableAsciiAll(asciiTraceHelper.CreateFileStream("star-ljy.tr"));
拓扑结构可视化
对于传感网络的可视化使用NS3可视化工具NetAnim,首先配置NetAnim。进入到netanim目录,在空白处右键,在终端中打开,通过下面四条指令生成NetAnim工具:
Build
make clean
qmake NetAnim.pro
make
然后在本目录下执行指令./NetAnim,就会弹出NetAnim窗口,说明配置完成。在该窗口下打开之前编译生成的XML类型文件即可观察到传感网络的可视化仿真,如下图所示:
因为设计的STA节点是可移动AP节点是固定的,所以仿真效果中节点6是固定的,节点0至5位置是不断变化的。
PS: 执行qmake指令时可能会出现command cant found的报错提示,本人的解决方案是去QT官方网站下载一个qt软件安装qmake,之后与NS-3建立软连接。本人下载的是qt-opensource-linux-x64-5.12.9.run版本。
软连接建立参见:qmake建立连接https://blog.csdn.net/hrbust_cxl/article/details/121484839
至此网络仿真建立完成。