代码分析

1 头文件

#include "ns3/core-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/network-module.h"
#include "ns3/applications-module.h"
#include "ns3/mobility-module.h"
#include "ns3/csma-module.h"
#include "ns3/internet-module.h"
#include "ns3/yans-wifi-helper.h"
#include "ns3/ssid.h"

2 名字空间

3 打印内容

NS_LOG_COMPONENT_DEFINE (“ThirdScriptExample”);

4 主函数(变量声明)

与案例1不同,此处定义并使用一些命令行参数。

  bool verbose = true;uint32_t nCsma = 3;uint32_t nWifi = 3;bool tracing = false;CommandLine cmd;cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi);cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);cmd.AddValue ("tracing", "Enable pcap tracing", tracing);
`

以nWifi为例,意义为默认无线节点数目,设置大小为3,但可以通过命令行传入参数
若运行时采用以下方式,则把参数传进里面。

./waf --run "third --nWifi=18"

5 创建网络拓扑

(1)案例1涉及PPP网络,【设置链路速率、时延】代码如下

  NodeContainer p2pNodes;p2pNodes.Create (2);PointToPointHelper pointToPoint;pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));NetDeviceContainer p2pDevices;p2pDevices = pointToPoint.Install (p2pNodes);

(2)CSMA网络
CSMA可以连接多个节点,节点之间竞争使用信道
(PPP连接两个节点,专属信道)

  NodeContainer csmaNodes;csmaNodes.Add (p2pNodes.Get (1));//此处为双接口节点csmaNodes.Create (nCsma);CsmaHelper csma;csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));NetDeviceContainer csmaDevices;csmaDevices = csma.Install (csmaNodes);

(3)Wifi网络
由一个接入点(AP)与nWiFi个移动节点组成,AP为双模节点,安装WiFi与PPP两个设备。WiFi协议包括链路层(WiFIMac)与物理层(WifiPhy)。WifiNetDevice只起到连接上下层协议的作用。
1)

    NodeContainer wifiStaNodes;wifiStaNodes.Create (nWifi);NodeContainer wifiApNode = p2pNodes.Get (0);//双模节点
//默认模型YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();//配置Channel类YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();//配置wifiPhy类phy.SetChannel (channel.Create ());

设置Channel和WifiPhy
2)

  WifiHelper wifi;wifi.SetRemoteStationManager ("ns3::AarfWifiManager");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, wifiStaNodes);//安装移动节点mac.SetType ("ns3::ApWifiMac","Ssid", SsidValue (ssid));NetDeviceContainer apDevices;//AP结点apDevices = wifi.Install (phy, mac, wifiApNode);//安装AP节点

服务集标志符(SSID)
其中,设置主要用WifiHelper设置,助手类
3)设置移动模型
设置笛卡尔坐标系,其中AP节点坐标设为原点
主要应用助手类MobilityHelper

    MobilityHelper mobility;//使用分布器GridPositionAllocator形成初始分布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"));
//利用RandomWalk2MobilityModel设置移动轨迹mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel","Bounds", RectangleValue (Rectangle (-50, 50, -50, 50)));mobility.Install (wifiStaNodes);
// 为AP节点设置移动模型,设置原点mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");mobility.Install (wifiApNode);

6 安装TCP/IP协议

  InternetStackHelper stack;stack.Install (csmaNodes);stack.Install (wifiApNode);stack.Install (wifiStaNodes);Ipv4AddressHelper address;address.SetBase ("10.1.1.0", "255.255.255.0");Ipv4InterfaceContainer p2pInterfaces;p2pInterfaces = address.Assign (p2pDevices);address.SetBase ("10.1.2.0", "255.255.255.0");Ipv4InterfaceContainer csmaInterfaces;csmaInterfaces = address.Assign (csmaDevices);address.SetBase ("10.1.3.0", "255.255.255.0");address.Assign (staDevices);address.Assign (apDevices);UdpEchoServerHelper echoServer (9);

7 安装应用程序

 ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));serverApps.Start (Seconds (1.0));serverApps.Stop (Seconds (10.0));UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);echoClient.SetAttribute ("MaxPackets", UintegerValue (1));echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));echoClient.SetAttribute ("PacketSize", UintegerValue (1024));ApplicationContainer clientApps = echoClient.Install (wifiStaNodes.Get (nWifi - 1));clientApps.Start (Seconds (2.0));clientApps.Stop (Seconds (10.0));

具体解释可以看案例1

8 设置路由

之前一个节点设置两个网络设备(PPP CSMA),而网络属于两个不同的子网,需要连接两个字网的节点具有路由功能。才可以进行数据包的转发(PPP与CSMA之间)
此处设置路由协议为全局路由,采用最短路径优先(OSPF算法),为每个节点生成路由表。对于IPV4,此处调用Ipv4GlobalRoutingHelper的PopulateRoutingTable()函数。

 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

9 数据追踪

分析网络性能的重要前提是获取实验数据,ns3以pcap或ASCII文本形式保存在指定文件中,这部分代码往往最后编辑。

  pointToPoint.EnablePcapAll ("third");//EnablePcapAll()用于收集信道上所有链路层分组收发记录,格式Pcap,文件名前缀为third,命名规则为“前缀-节点号-网络设备”phy.EnablePcap ("third", apDevices.Get (0));csma.EnablePcap ("third", csmaDevices.Get (0), true);

10 启动与结束

  Simulator::Run ();Simulator::Destroy ();return 0;

运行程序

在ns3目录下运行

./waf --run third

ns3 入门案例2:third.cc相关推荐

  1. ns3入门案例1 first.cc

    1.目录结构 example:1.根文件下自带示例结构,作为良好的参考资源 2.src环境下中各模块中example作为资源 build: 编译后文件以及可执行文件 src:各模块源代码 2.新代码运 ...

  2. ns3入门(1)——第一个案例first.cc

    ns3入门(1)--第一个案例first.cc 一.安装ns3 安装没啥可说的,参考一下别人的网站吧. 说下我的环境吧,ubuntu16.04,仅此. 1.安装eclipse https://blog ...

  3. 语音分类入门案例: 英文数字音频分类

    语音分类入门案例: 英文数字音频分类 本项目是一个全流程的语音分类项目,内容简单,适合想要涉猎音频分类的小白学习. 推荐将本项目Fork成为自己的项目并运行,以获得更好的学习体验!! 项目地址:语音分 ...

  4. 2021年大数据Flink(八):Flink入门案例

    目录 Flink入门案例 前置说明 API 编程模型 准备工程 pom文件 log4j.properties Flink初体验 需求 编码步骤 代码实现 Flink入门案例 前置说明 API API ...

  5. Python:Scrapy的安装和入门案例

    Scrapy的安装介绍 Scrapy框架官方网址:http://doc.scrapy.org/en/latest Scrapy中文维护站点:http://scrapy-chs.readthedocs. ...

  6. Vue安装配置以及入门案例

    Vue Vue简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不 ...

  7. AOP配置开发入门案例

    该AOP开发入门案例采用XML文件方式配置开发(非注解方式)共包含一个xml文件和4个Java类,创建好web工程后引入相应jar包(文末会给出),建好包(若自定义包名注意更改类中的包名),将xml文 ...

  8. python与人工智能编程-总算明白python人工智能编程入门案例

    Python是非常简洁的一种脚本语言,写同样的程序,代码量仅为java的三分一,除了性能没有Java强之外,它的优点还是相当多的.以下是小编为你整理的python人工智能编程入门案例 下载Active ...

  9. mybatis基于注解的入门案例

    mybatis基于注解的入门案例:             把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句             同时需要在SqlMa ...

最新文章

  1. 区块链行业报告|从交易流程到Token经济的全方位解析
  2. iPhone nano 被取消是因为乔布斯看到了风向?
  3. ABAP CHECKBOX 和LISTBOX使用指南
  4. C# 中的eval ()函数
  5. c语言运行时更入下一行,C语言高级语言程序设计(一)_第二章 C程序设计基础(二).ppt...
  6. struts2中非表单标签的使用 componen
  7. android.net.wifi的简单使用方法
  8. 《如何了解软件的设计》学习笔记0——模型-接口-实现
  9. kaggle—HousePrice房价预测项目实战
  10. 极目智能完成2亿元C1轮融资,已获多个乘用车ADAS项目定点
  11. 微信小程序的本地存储
  12. 安全管家安卓_手机管家和顽固木马专杀哪个更好用
  13. Help Bubu UVALive - 4490
  14. OC 建议实现类似淘宝的物流步骤视图
  15. 简述python的安装过程_安装Python-3.5.2过程中常见的几种错误
  16. Java 计蒜客——开关灯
  17. 如何优雅地管理微信数据库?
  18. .net 导出excel_使用 EasyPOI 优雅导出Excel模板数据(含图片)
  19. 从经济学角度解释:为什么画家总是死后成名?
  20. 三维触控测试软件,解读苹果3D touch三维触控技术

热门文章

  1. openjpa_以编程方式向OpenJPA注册实体类型
  2. ehcache 程序_将Ehcache添加到Openxava应用程序
  3. 使用Java 8流遍历递归数据结构
  4. 休眠身份,序列和表(序列)生成器
  5. 具有瞬态属性的视图对象的钝化和激活
  6. 具有可执行Tomcat的独立Web应用程序
  7. 懒惰的JSF Primefaces数据表分页–第2部分
  8. Spring远程支持和开发RMI服务
  9. Java 7功能概述
  10. Spring MVC开发–快速教程