NS-3网络仿真平台搭建及可视化

面向5G车联网仿真平台的搭建

本博客是基于SRTP(面向5G车联网仿真平台设计与开发)而搭建的“面向5G车联网的网络仿真平台”,以供大家学习使用。


目录

前言概述
准备工作
下载ns-3
构建ns-3
测试ns-3
NS-3仿真可视化

前言概述

  • 项目简介
    项目立名为:”5G车联网仿真平台“,团队所有成员通过学习相关的NS-3相关技术知识、研究学习5G车联网和V2X等相关参考文献,在研究3GPP Release 12 ProSe 系统架构以及信令流程基础上,综述基于LTE-V2X的车联网协议研究和标准化进展,通过现有理论与技术分析,提出设计方案,在大唐研发的基于LTE网络的V2X的基础上,继续研发出进一步严禁的基于5G网络的V2X,可望支持更低时延(< 10ms)、更高可靠性(99.999%)、更大宽带(支持视频共享)的”传感共享“。
  • 项目特色与创新
    • 特色
      以”车对外界“信息交换为主要功能的V2X技术正在成为车联网的新亮点,是继信息娱乐之后,推动汽车网络组建的新应用。基于将来5G网络的V2X则可望支持更低时延(<10ms)、更高可靠性(99.999%)、更大带宽(支持视频共享)的“传感共享”,并扩展至通过采取“点对点”双向应答式通信方式,实现自动驾驶所需的实时“多车协同”,同时实现大带宽低时延的“车-云”互联,实时下载上传3D地图,并支持全体自动驾驶车的实时经验共享和“群学习”,大幅提高人工智能的学习速度,支撑自动驾驶技术实现商用和普及。
    • 创新
      基于5G网络的V2X将更具有智能化,在全新的5G时代,它将完全实现“5W”的理念:任何时间(whenever)、任何地点(wherever)、任何人(whoever)、任何事物(whatever)以及任何接收者(whomever),这不仅在技术上是一种革新,更是一种理念上的变革,实现了不仅是人与人,车与车之间的完全通信,更是将车与车,车与人也紧密的联系到了一起,这在车联网行业将是一项重大的突破!
  • NS-3概述
    • ns-3 被构建为能够协同工作的软件库系统。可以编写链接这些库的(或导入这些库的)用户程序。用户程序既可用 C++ 也可 Python 编写。ns-3 以源码形式发布,这意味着目标系统需要有软件开发环境能够首先构建所需的库,然后构建用户程序。

准备工作

  • 工具/环境

    • 书籍(后续安装ns-3需要用):

    • 官方文档阅读:

    • 环境:

      • 电脑、linux操作系统
      • 依赖包安装(重点,可能会踩很多坑,这个要根据你的电脑环境而定):(<-在这里我将其总结为一个脚本->)
1.sudo apt-get install gcc g++ python python-dev //C++和python安装,必装        
2.sudo apt-get install mercurial //NS3代码维护使用的源码版本控制管理系统  
3.sudo apt-get install bzr //运行python绑定ns-3-dev需要bazaar这个组件     
4.sudo apt-get install libgtk2.0-0 libgtk2.0-dev //基于GTK的配置系统  
5.sudo apt-get install gdb valgrind //调试工具   
6.sudo apt-get install doxygen graphviz imagemagick  //文档生成器  
7.sudo apt-get install texlive texlive-latex-extra //文档生成器,从源代码中生成说明文档        
8.sudo apt-get install texinfo dia texlive-extra-utils texi2html //ns-3手册和tutorial编写查看工具
9.sudo apt-get install flex bison //仿真必需的词法分析器和语法分析生成器,必装    
10.sudo apt-get install libgoocanvas-dev //部分移动场景仿真的可视化测试需要      这个组件  
11.sudo apt-get install tcpdump //读取pcap的packet traces,即包嗅探器    
12.sudo apt-get install sqlite sqlite3 libsqlite3-dev //支持统计特性的数据库软件   
13.sudo apt-get install libxml2 //xml的配置存储软件   
14.sudo apt-get install python-pygraphviz python-kiwi python-pygoocanvas //Gustavo's ns-3-pyviz的可视化软件   
15.sudo apt-get install qt4-qmake   
16.sudo apt-get install qt4-dev-tools

ps:安装过程中肯定会出现各种各样的错误,不过一般网上都有答案,这里我也就不需要一一列出来来,这个要根据安装实际情况而定。

下载ns-3
  • ns-3使用版本
    我们使用的是 ns-allinone-3.26,现在版本已经更新到ns-allinone-3.28,建议还是使用ns-allinone-3.26
  • 第一种方法:直接下载tar压缩包,网址下载: ns-allinone-3.26
  • 第二种方法:命令行进行下载
mkdir tarballs //创建名字为tarballs的文件夹
cd tarballs    //进入tarballs文件夹
wget http://www.nsnam.org/release/ns-allinone-3.26.tar.bz2   //连网下载NS-3.26版本
tar xjf ns-allinone-3.26.tar.bz2    //使用tar解压

进入到目录ns-allinone-3.26,能看到如下文件和目录:

$ ls
bake        constants.py        ns-3.26                     README 
build.py    netanim-3.107       pybindgen-0.17.0.post57+nga6376f2       util.py

ns-3下载工作到这里就基本完成了,接下来可以开始构建ns-3了。

构建ns-3
  • 使用build.py编译
    进入ns-allinone-3.26文件夹,并键入以下命令进行编译:
$ ./build.py --enable-examples --enable-tests

编译完成后,您会看到显示的是构建脚本构建你下载的各种内容的信息。最终显示如下:

Waf: Leaving directory `/path/to/workspace/ns-allinone-3.26/ns-3.26/build'
'build' finished successfully (6m25.032s)

Modules built:
antenna                   aodv                      applications
bridge                    buildings                 config-store
core                      csma                      csma-layout
dsdv                      dsr                       energy
fd-net-device             flow-monitor              internet
internet-apps             lr-wpan                   lte
mesh                      mobility                  mpi
netanim (no Python)       network                   nix-vector-routing
olsr                      openflow (no Python)      point-to-point
point-to-point-layout     propagation               sixlowpan
spectrum                  stats                     tap-bridge
test (no Python)          topology-read             traffic-control
uan                       virtual-net-device        visualizer
wave                      wifi                      wimax

Modules not built (see ns-3 tutorial for explanation):
brite                     click

尚未被构建的部分:

Modules not built (see ns-3 tutorial for explanation):
brite                     click

这只是意味着某些ns-3模块依赖的外部库可能尚未安装,或者配置文件专门指定的不构建他们。这并不意味着模拟器没有成功构建,也不意味着其会对正在构建的(被列出的)模块给出错误的的结果。

  • 使用waf编译
    一旦工程已经编译过,就不能再使用build.py脚本进行编译
    进入ns-allinone-3.26/ns-3.26目录,键入以下命令:
$ ./waf clean     //清除以前的版本
$ ./waf -d debug --enable-examples --enable-tests configure     //重新配置ns-3项目,并构建系统检查各种依赖关系

正式编译:

$ ./waf 

输出如下结果:

[2593/2631] Linking build/bindings/python/ns/traffic_control.so
[2594/2631] Linking build/bindings/python/ns/network.so
[2595/2631] Linking build/bindings/python/ns/wifi.so
[2596/2631] Linking build/bindings/python/ns/nix_vector_routing.so
[2597/2631] Linking build/bindings/python/ns/lte.so
[2598/2631] Linking build/bindings/python/ns/buildings.so
[2599/2631] Linking build/bindings/python/ns/aodv.so
[2600/2631] Linking build/bindings/python/ns/point_to_point.so
[2601/2631] Linking build/bindings/python/ns/fd_net_device.so
[2602/2631] Linking build/bindings/python/ns/mpi.so
[2603/2631] Linking build/bindings/python/ns/wave.so
[2604/2631] Linking build/bindings/python/ns/csma.so
[2605/2631] Linking build/bindings/python/ns/dsdv.so
[2606/2631] Linking build/bindings/python/ns/topology_read.so
[2607/2631] Linking build/bindings/python/ns/internet_apps.so
[2608/2631] Linking build/utils/ns3.26-print-introspected-doxygen-debug
[2609/2631] Linking build/scratch/subdir/subdir
[2610/2631] Linking build/bindings/python/ns/energy.so
[2611/2631] Linking build/bindings/python/ns/antenna.so
[2612/2631] Linking build/bindings/python/ns/internet.so
[2613/2631] Linking build/bindings/python/ns/tap_bridge.so
[2614/2631] Linking build/bindings/python/ns/wimax.so
[2615/2631] Linking build/bindings/python/ns/_core.so
[2616/2631] Linking build/bindings/python/ns/spectrum.so
[2617/2631] Linking build/bindings/python/ns/sixlowpan.so
[2618/2631] Linking build/bindings/python/ns/mobility.so
[2619/2631] Linking build/bindings/python/ns/stats.so
[2620/2631] Linking build/utils/ns3.26-test-runner-debug
[2621/2631] Compiling src/fd-net-device/helper/tap-device-creator.cc
[2622/2631] Compiling src/fd-net-device/helper/encode-decode.cc
[2623/2631] Compiling src/fd-net-device/helper/creator-utils.cc
[2624/2631] Linking build/src/fd-net-device/ns3.26-tap-device-creator-debug
[2625/2631] Compiling src/fd-net-device/helper/raw-sock-creator.cc
[2626/2631] Compiling src/fd-net-device/helper/encode-decode.cc
[2627/2631] Compiling src/fd-net-device/helper/creator-utils.cc
[2628/2631] Linking build/src/fd-net-device/ns3.26-raw-sock-creator-debug
[2630/2631] Compiling src/tap-bridge/model/tap-encode-decode.cc
[2630/2631] Compiling src/tap-bridge/model/tap-creator.cc
[2631/2631] Linking build/src/tap-bridge/ns3.26-tap-creator-debug
Waf: Leaving directory `/home/xuminghua/tmp/ns-allinone-3.26/ns-3.26/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (14m15.932s)

Modules built:
antenna                   aodv                      applications              
bridge                    buildings                 config-store              
core                      csma                      csma-layout               
dsdv                      dsr                       energy                    
fd-net-device             flow-monitor              internet                  
internet-apps             lr-wpan                   lte                       
mesh                      mobility                  mpi                       
netanim (no Python)       network                   nix-vector-routing        
olsr                      point-to-point            point-to-point-layout     
propagation               sixlowpan                 spectrum                  
stats                     tap-bridge                test (no Python)          
topology-read             traffic-control           uan                       
virtual-net-device        visualizer                wave                      
wifi                      wimax                     

Modules not built (see ns-3 tutorial for explanation):
brite                     click                     openflow 
测试ns-3

构建完成之后,我们就可以开始测试ns-3是否能运行了。

  • 使用test.py进行测试
    进入ns-3.26,键入以下命令:
./test.py -c core  //测试ns-3发行版示范编译正确

输出如下所示:

……
PASS: TestSuite traced-value-callback
PASS: TestSuite aodv-routing-id-cache
PASS: TestSuite routing-aodv
PASS: TestSuite routing-aodv-loopback
PASS: TestSuite routing-aodv-regression
PASS: TestSuite ns3-wifi-msdu-aggregator

PASS: TestSuite lte-frequency-reuse
230 of 233 tests passed (230 passed, 3 skipped, 0 failed, 0 crashed, 0 valgrind errors)
List of SKIPped tests:
    ns3-tcp-cwnd
    ns3-tcp-interoperability
    nsc-tcp-loss

由输出可以看出,除来未安装成功的三个依赖包,其他均测试成功。
- 运行脚本进行测试
运行ns-allinone-3.26/ns-3.26/scratch文件夹下的脚本文件scratch-simulator.cc
在ns-allinone-3.26/ns-3.26文件夹下,键入以下命令(因为waf在这个文件夹下,也可以将waf 和 waf.bat 移至scratch文件夹下再进行运行)

$ ./waf --run scratch/scratch-simulator  

waf首先执行检查以确保程序已经正确构建,并在需要时执行构建。然后执行该程序,产生以下输出:

Waf: Entering directory `/home/xuminghua/tmp/ns-allinone-3.26/ns-3.26/build'
Waf: Leaving directory `/home/xuminghua/tmp/ns-allinone-3.26/ns-3.26/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (1.912s)
Scratch Simulator

输出了Scratch Simulator,表明ns-3网络仿真平台已经搭建完成来,接下来就是用你的代码进行编译,并进行数据可视化分析展示了。

NS-3仿真可视化

数据可视化主要有两种PyViz和NetAnim,都是作为可视化动画演示工具。

  • PyViz

    • 使用参考网址:NS-3-PyViz
    • PyViz安装

      • 安装依赖包
        sudo apt-get install python-dev python-pygraphviz python-kiwi python-pygoocanvas python-gnome2 python-gnomedesktop python-rsvg

      • 安装交互式Python使得GUI上有控制台按钮
        sudo apt-get install ipython

      • PyViz测试
        • Python脚本(3.26目录下)
          ./waf --pyrun src/flow-monitor/examples/wifi-olsr-flowmon.py --visualize
          如图所示:
          这里写图片描述
        • C++脚本(3.26目录下)
          ./waf --run src/olsr/examples/simple-point-to-point-olsr --vis
          如图所示:
          这里写图片描述
        • 需要修改的脚本wscript文件
          obj=bld.create_ns3_program('simple-point-to-point-olsr', ['point-to-point', 'internet', 'olsr', 'applications', 'wifi'])
          修改成
          obj=bld.create_ns3_program('simple-point-to-point-olsr', ['point-to-point', 'internet', 'olsr', 'applications', 'wifi', 'visualizer'])

          再次执行前面的代码
  • NetAnim

    • 使用参考网址:NS-3-NetAnim
    • NetAnim安装

      • 安装依赖包
        sudo apt-get install mercurial
        sudo apt-get install qt4-dev-tools
      • 下载并安装NetAnim
        hg clone http://code.nsnam.org/jabraham3/netanim
        cd netanim
        make clean
        qmake NetAnim.pro (For MAC Users: qmake -spec macx-g++ NetAnim.pro)
        make
      • 运行实例产生.xml文件供NetAnim解析

        • 在src/netanim/examples目录下执行下面两个命令:
          ./waf --run "dumbbell-animation --nLeftLeaf=5 --nRightLeaf=5 --animFile=dumbbell.xml"
          ./waf --run "grid-animation --xSize=5 --ySize=5 --animFile=grid.xml"

        • 若出现”权限不够“,则退出到ns-3.26目录下,执行下面两条命令:
          ./waf --run "src/netanim/examples/dumbbell-animation --nLeftLeaf=5 --nRightLeaf=5 --animFile=dumbbell.xml"
          ./waf --run "src/netanim/examples/grid-animation --xSize=5 --ySize=5 --animFile=grid.xml"

      • 运行NetAnim来解析xml文件:
        cd ns-allinone-3.26/netanim-3.107
        ./NetAnim

        打开NetAnim界面如下:
        这里写图片描述
        打开xml文件,进行解析:
        这里写图片描述


好了,以上就是整个平台的搭建以及可视化全过程……
最后再进行数据分析等过程……

  • 23
    点赞
  • 188
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
以下是一个基于ns-3.27的NS-3 WIFI性能仿真代码,用于模拟802.11n网络的性能。 ``` #include "ns3/core-module.h" #include "ns3/mobility-module.h" #include "ns3/wifi-module.h" #include "ns3/internet-module.h" #include "ns3/network-module.h" #include "ns3/applications-module.h" #include "ns3/flow-monitor-helper.h" #include "ns3/flow-monitor-module.h" using namespace ns3; NS_LOG_COMPONENT_DEFINE ("WifiN"); int main (int argc, char *argv[]) { uint32_t nWifi = 3; bool verbose = false; CommandLine cmd; cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi); cmd.AddValue ("verbose", "Turn on all WifiNetDevice log components", verbose); cmd.Parse (argc,argv); if (verbose) { LogComponentEnableAll (LOG_LEVEL_INFO); LogComponentEnable ("WifiNetDevice", LOG_LEVEL_ALL); } NodeContainer wifiStaNodes; wifiStaNodes.Create (nWifi); NodeContainer wifiApNode; wifiApNode.Create (1); YansWifiChannelHelper channel = YansWifiChannelHelper::Default (); YansWifiPhyHelper phy = YansWifiPhyHelper::Default (); phy.SetChannel (channel.Create ()); WifiHelper wifi = WifiHelper::Default (); wifi.SetRemoteStationManager ("ns3::AarfWifiManager"); NqosWifiMacHelper mac = NqosWifiMacHelper::Default (); Ssid ssid = Ssid ("ns-3-ssid"); mac.SetType ("ns3::StaWifiMac", "Ssid", SsidValue (ssid), "ActiveProbing", BooleanValue (false)); NetDeviceContainer staDevices; staDevices = wifi.Install (phy, mac, wifiStaNodes); mac.SetType ("ns3::ApWifiMac", "Ssid", SsidValue (ssid)); NetDeviceContainer apDevice; apDevice = wifi.Install (phy, mac, wifiApNode); 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 (wifiStaNodes); mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install (wifiApNode); InternetStackHelper stack; stack.Install (wifiApNode); stack.Install (wifiStaNodes); Ipv4AddressHelper address; address.SetBase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer staNodeInterface; staNodeInterface = address.Assign (staDevices); address.SetBase ("10.1.2.0", "255.255.255.0"); Ipv4InterfaceContainer apNodeInterface; apNodeInterface = address.Assign (apDevice); UdpEchoServerHelper echoServer (9); ApplicationContainer serverApps = echoServer.Install (wifiApNode.Get (0)); serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0)); UdpEchoClientHelper echoClient (apNodeInterface.GetAddress (0), 9); echoClient.SetAttribute ("MaxPackets", UintegerValue (1)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0))); echoClient.SetAttribute ("PacketSize", UintegerValue (1024)); ApplicationContainer clientApps = echoClient.Install (wifiStaNodes.Get (0)); clientApps.Start (Seconds (2.0)); clientApps.Stop (Seconds (10.0)); FlowMonitorHelper flowmon; Ptr<FlowMonitor> monitor = flowmon.InstallAll (); Simulator::Stop (Seconds (10.0)); Simulator::Run (); monitor->CheckForLostPackets (); Ptr<Ipv4FlowClassifier> classifier = DynamicCast<Ipv4FlowClassifier> (flowmon.GetClassifier ()); std::map<FlowId, FlowMonitor::FlowStats> stats = monitor->GetFlowStats (); for (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator i = stats.begin (); i != stats.end (); ++i) { Ipv4FlowClassifier::FiveTuple t = classifier->FindFlow (i->first); std::cout << "Flow " << i->first << " (" << t.sourceAddress << " -> " << t.destinationAddress << ")\n"; std::cout << " Tx Bytes: " << i->second.txBytes << "\n"; std::cout << " Rx Bytes: " << i->second.rxBytes << "\n"; std::cout << " Throughput: " << i->second.rxBytes * 8.0 / 9.0 / 1000 / 1000 << " Mbps\n"; } Simulator::Destroy (); return 0; } ``` 这个代码创建了一个包含一个AP和三个STA的802.11n网络,使用UDP Echo协议进行通信,并使用Flow Monitor模块监测网络流量。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HuaCode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值