NS3 移动模型

转自https://blog.csdn.net/qq_41816035/article/details/88071765

NS3整体介绍
目录结构
src目录是ns-3的源代码目录,其目录结构基本和ns-3模块相对应

这些模块目录的子目录都是固定的。

bindings/ 绑定python语言的
doc/ 帮助文档
examples/ 应用该模块的示例代码
helper/ 模块对应的helper类源文件
model/ 模块代码的.cc和.h文件
test/ 模块设计者编写的模块测试代码
wscript
一些常用模块

模块    用途
core    ns3内核模块,实现了ns-3的基本机制,智能指针,属性,回调,随机变量,日志,追踪,事件调度等
network    网络数据分组模块,一般仿真都会使用
Internet    实现了TCP/IP相关的协议族,IP, ARP, UDP, TCP等
applications    几种常见的应用层协议
mobility    移动模型模块,为节点添加移动属性
status    统计框架模块,方便对仿真数据的收集、分析和统计
tools    统计工具,作图工具gunplot
netanim    动画演示工具
visualizer    可视化界面工具
几种典型的网络模块

模块    用途
point-to-point    点对点网络
CSMA    实现基于IEEE802.3的以太网网络,包括MAC层,物理层和媒体信道
Wi-Fi    实现基于IEEE802.11a/b/g的无线网络,也可以是有基础设施的ad hoc网络
mesh    实现基于IEEE802.11s的无线mesh网络
wimax    实现基于IEEE802.16标准的无线城域网络
几种ad hoc网络路由协议模块 :aodv, dsdv, olsr。

这些模块当中,core,network,internet和status是ns-3的基础模块,学习和开发其它模块首先要掌握这几个基础模块。

ns3 关键概念
节点
ns-3中的基本计算设备被抽象为节点。此节点是一个可以添加各种功能的计算机。当然仅仅是个计算机,要想使它工作,还需要添加网卡,协议栈,应用程序。

在ns-3中节点用Node类来描述,下面两行代码会创建两个节点对象,它们在仿真中代表计算机

NodeContainer nodes;
nodes.Create(2);

应用
计算机软件中通常分为系统软件和应用软件。应用软件完成用户工作,系统软件管理计算机中的内存,CPU,硬盘,网络等各种资源。在ns-3中并没有正常的操作系统的概念,但是用应用程序的概念。在ns-3中,需要被仿真的用户程序被抽象为应用。在C++中用Application类描述。

bulk-send-application
on-off-application
udp-client/server
udp-echo-client/server


信道
通常把网络中数据流过的媒介称作为信道,在ns-3中,节点需要连接到信道上来进行数据交换,在C++中用Channel类来描述,一个信道实例可以模拟一条简单的线缆,也可以是一个复杂的巨型以太网交换机,甚至是一个无线网络中充满障碍物的三维空间。

CsmaChannel
PointToPointChannel
Wi-FiChannel

网络设备
把计算机连接到网络上,必须用网线连接到网卡上。现在计算机出厂的时候都已经配置了网卡,所以用户一般看不到这些模块。一张网卡只是个外围设备,设备需要驱动软件来控制,如果缺少软件驱动它还是不能工作的。在ns-3中,网络设备这一抽象概念相当硬件设备和软件驱动的总和。网络设备安装在节点上,然后节点之间通过信道和其他节点通信。这个网络和信道是相对应的,就像无线网卡不能连接网线,只能在在无线环境中使用。C++中用NetDevice类来描述网络设备。

CsmaNetDevice
PointToPointNetDevice
Wi-FiNetNevice

搭建网络仿真场景和搭建真实网络类似
首先要有网络节点(Node),节点需要有网络设备(NetDevice),网络设备需要通过传输媒体(Channel)连接

仿真脚本的编写
脚本编写一般都是经过以下步骤

步骤    实例
1. 创建节点    NodeContainer
2. 创建链路类型    XxxDeviceHelper
3. 安装链路类型,生成网卡    XxxDeviceContainer=XxxDeviceHelper.install(NodeContainer)
4. 安装协议栈    XxxStack.install(NodeContainer)
5. 配置IP地址    XxxAddressHelper.setBase(“IP”,“NETMASK”)
6. 生成网络接口    XxxInterfaceContainer = XxxAddressHelper.Assign(NetDeviceContainer )
7. 安装应用    ApplicationContainer = XxxHelper.Install(NodeContainer);
8. 开始仿真    
结合 tutroial/first.cc 例子讲解,first.cc两个P2P节点,client节点向server节点发送数据,server回显数据。

示例中仅发送了一个数据包。MaxPacket属性是数据包数量,Interval是发送间隔,PacketSize是数据包大小

main (int argc, char *argv[])
{
    CommandLine cmd;
    cmd.Parse (argc, argv);
    
    Time::SetResolution (Time::NS);
    LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
    LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
    
    //1. 创建节点
    NodeContainer nodes;
    nodes.Create (2);
    
    //2.为节点创建P2P类型的链路,并配置链路属性
    PointToPointHelper pointToPoint;
    pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
    pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
    
    //3.安装链路,生成网卡
    NetDeviceContainer devices;
    devices = pointToPoint.Install (nodes);
    
    //4.安装协议栈
    InternetStackHelper stack;
    stack.Install (nodes);
    
    //5.为网卡配置IP
    Ipv4AddressHelper address;
    address.SetBase ("10.1.1.0", "255.255.255.0");
    //6.生成网络接口
    Ipv4InterfaceContainer interfaces = address.Assign (devices);
    
    UdpEchoServerHelper echoServer (9);
    ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
    serverApps.Start (Seconds (1.0));
    serverApps.Stop (Seconds (10.0));
    
    //7.配置应用
    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));
    
    //8.开始仿真
    Simulator::Run ();
    Simulator::Destroy ();
    return 0;
}


ns3拓扑构造
构建拓扑一般是使用以下步骤

先构建节点,网络类型。节点使用网络连接起来生产网卡
给网卡绑定IP地址,生成网络接口(之后可以在接口上做业务)
使用拓扑帮助

Device = Helper.Install(Node);
/*  生成网卡
    Device是网卡
    Helper是网络类型,
    Node是要来连接的节点
*/

Interface = Address.Assign(Device);
/*
    绑定IP
    Interface是网络接口接口,供后续Application使用
    Address是网络地址,是一个网段
    Device是网卡
*/

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
/*
    用拓扑帮助类构建路由
*/

点对点网络示例

NodeContainer c;
c.create(2);

NodeContainer n0n1 = NodeContainer(c.Get(0), c.Get(1));

PointToPointHelper p2p;
p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
NetDeviceContainer d0d1 = p2p.Install (n0n1);

Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
xxx = address.Assign (d0d1);
// 为d0d1里的两个节点分配ip, 10.1.1.1 -------10.1.1.2

Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

以太网总线网络

NodeContainer c;
c.create(4);

CsmaHelper n0n1n2n3 = NodeContainer(c.Get(0), c.Get(1), c.Get(2), c.Get(3));
//CsmaHelper n0n1n2n3 = NodeContianer(c);
csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps"));
csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));
NetDeviceContainer d0d1d2d3 = csma.Install (n0n1n2n3);

Ipv4AddressHelper address;
address.SetBase ("10.1.2.0", "255.255.255.0");
xxx = address.Assign (d0d1d2d3);
// 为d0d1d2d3中的节点分别分配ip
// 10.1.2.1----10.1.2.2----10.1.2.3----10.1.2.4
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
无线网拓扑

NodeContainer c;
c.create(3);

// 让第一个节点做AP节点,其他的连接这个AP
NodeContainer ApNode = c.Get(0);

// 其他的做无线设备,连接AP节点
NodeContainer StaNode = NodeContainer(c.Get(1), c.Get(2));

WifiHelper wifi;
wifi.SetRemoteStationManager ("ns3::AarfWifiManager");

WifiMacHelper mac;
Ssid ssid = Ssid ("ns-3-ssid");


//设置AP节点网络
mac.SetType ("ns3::ApWifiMac",
           "Ssid", SsidValue (ssid));
NetDeviceContainer apDevices = wifi.Install (phy, mac, wifiApNode);

//设置无线设备网络
mac.SetType ("ns3::StaWifiMac",
           "Ssid", SsidValue (ssid),
           "ActiveProbing", BooleanValue (false));
NetDeviceContainer staDevices = wifi.Install (phy, mac, wifiStaNodes);

Ipv4AddressHelper address;
address.SetBase ("10.1.2.0", "255.255.255.0");
address.Assign (staDevices);
address.Assign (apDevices);

应用
所有应用程序要分别用apps.Start(), apps.Stop()设置应用的启动停止时间,注意服务器程序要比客户端早启动

UdpClient,UdpServer
Udp应用,顾名思义,构建一个udp应用,客户端往服务器端发数据。可以设置数据包的大小,数量,发送间隔

在一个节点上安装udpserver

NodeContainer c;
c.create(2);
...
...
uint16_t port = 4000;
UdpServerHelper server (port);
ApplicationContainer apps = server.Install (c.Get (1));
apps.Start (Seconds (1.0));
apps.Stop (Seconds (10.0));

在一个节点上安装udpclient

UdpClientHelper client (serverAddress, port);//绑定服务器地址,地址用interface.GetAddress方法获取
client.SetAttribute ("MaxPackets", UintegerValue (320));//发送多少个包
client.SetAttribute ("Interval", TimeValue (0.05));//发送间隔
client.SetAttribute ("PacketSize", UintegerValue (1024));//包大小
apps = client.Install (n.Get (0));//安装到哪个节点
apps.Start (Seconds (2.0));
apps.Stop (Seconds (10.0));

OnOffApplication
OnOff应用是个开关应用,开的时候产生流量,关的时候不产生流量。

BulkSendApplication
PacketSink
移动模型
MobilityHelper 类用来设置节点移动模型
SetPositionAllocator

MobilityHelper mobility
mobility.SetPositionAllocator()//设置节点初始位置
mobility.SetMobilityModel()  //设置节点运动方式


初始位置-网格布局
mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
                                 "MinX", DoubleValue (-100.0),
                                 "MinY", DoubleValue (-100.0),
                                 "DeltaX", DoubleValue (5.0),
                                 "DeltaY", DoubleValue (20.0),
                                 "GridWidth", UintegerValue (20),
                                 "LayoutType", StringValue ("RowFirst"));

GridPositionAllocator的属性以及默认值

“GridWidth”, “一行最多有几个节点”,UintegerValue (10),
“MinX”, “网格布局起始处在x轴上的坐标.”,DoubleValue (1.0)
“MinY”, “网格布局起始处在y轴上的坐标.”,DoubleValue (0.0)
“DeltaX”, “x轴上节点间的距离.”,DoubleValue (1.0)
“DeltaY”, “y轴上节点间的距离”, DoubleValue (1.0)
“LayoutType”, “布局类型.”,EnumValue (ROW_FIRST)
如果有100个节点,GirdWidth值为10,则一行10个,共10行,Girdwidth为20,则一行20个,共5行

初始位置-随机布局
在一个圆内随机布局

mobility.SetPositionAllocator ("ns3::RandomDiscPositionAllocator",
                             "X", StringValue ("100.0"),
                             "Y", StringValue ("100.0"),
                             "Rho", StringValue ("ns3::UniformRandomVariable[Min=0|Max=30]"));

RandomDiscPositionAllocator属性以及默认值

“Theta”,“随机角度.”, StringValue (“ns3::UniformRandomVariable[Min=0.0|Max=6.2830]”),
“Rho”,“随机半径”, StringValue (“ns3::UniformRandomVariable[Min=0.0|Max=200.0]”),
“X”,“圆心x轴坐标”, DoubleValue (0.0),
“Y”,“圆心y轴坐标”, DoubleValue (0.0)
ns3::UniformRandomVariable[Min=0.0|Max=6.2830] 一个随机的值,0.0~6.2830

运动模型-固定不动
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
1
运动模型-随机运动
在一个2d场景随机运动,方向和速度都是随机的

mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
                         "Mode", StringValue ("Time"),
                         "Time", StringValue ("2s"),
                         "Speed", StringValue ("ns3::ConstantRandomVariable[Constant=1.0]"),
                         "Bounds", StringValue ("0|200|0|200"));

RandomWalk2dMobilityModel模型的属性以及默认值

“Bounds”,“运动的范围”, RectangleValue (Rectangle (0.0, 100.0, 0.0, 100.0))
“Time”,“走多久换一次方向”,TimeValue (Seconds (1.0))
“Distance”,"走多远换一次方向"DoubleValue (1.0),
“Mode”,“Time or Distance”,EnumValue (RandomWalk2dMobilityModel::MODE_DISTANCE)
“Direction”,"随机方向 (radians)."StringValue (“ns3::UniformRandomVariable[Min=0.0|Max=6.283184]”)
“Speed”“随机速度 (m/s).”,StringValue (“ns3::UniformRandomVariable[Min=2.0|Max=4.0]”)
Mode 是选择根据运动时间来变方向还是根据运动距离来变方向

自定义运动
MobilityModel::SetPosition 方法用来控制模型的移动,

//在5秒后node节点会沿x轴,y轴,z轴方向分别移动1米,
Ptr<MobilityModel> mob = node->GetObject<MobilityModel> ();
Simulator::Schedule (Seconds (5.0), &MobilityModel::SetPosition, mob, Vector (1, 1, 1));
 

  • 1
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验内容1. 在上一个实验的基础上,建立ad hoc节点拓扑模型,网络中节点均具有路由转发功能; 2. 进入~/tarballs/ns-allinone-3.2x/ns-3.2x/examples/wireless$ 目录,在wireless文件夹下,有很多wifi传输的示例。在wifi-simple-adhoc-grid.cc代码基础上修改,文件拷贝到scratch文件夹下,重命名为你的姓名缩写+学号,例如学生姓名钢铁侠,学号20191314,c文件命名为gtx20191314.cc; 3. 读懂wifi-simple-adhoc-grid.cc代码,掌握在NS-3中网络拓扑布局,ad hoc传输方式、网络路由的简单配置等,成功运行wifi-simple-adhoc-grid.cc; 4. 掌握拓扑建模方法,在wifi-simple-adhoc-grid.cc代码中扩展建立到100个节点,节点初始呈现网格布局; 5. 深入研究移动模型建模方法,完成对移动模型参数设置,使得节点移动在可视化界面更加明显; 6. 深入研究信道模型建模方法,在代码中完成对信道模型的替换,例如Friis、LogDistancePropagationLossModel信道模型。通过射频参数,了解发射机、路径损耗和接收机间增益的计算方法。可以根据参数配置想要的发射距离; 7. 掌握网路层路由配置方法,可以配置多种ad hoc路由模式,例如OLSR、aodv等。查阅不同路由协议的工作原理和方法; 8. 掌握统计模型的使用方法,可以统计相应节点的时延、丢包率等重要指标; 9. 掌握能耗模型的使用方法,配置节点能量,设备能量,可以统计节点的能量消耗; 10. 掌握统计数据作图方法,对于获得的统计数据,图形化的形式得出结果。
ns-3中提供了三种节点移动模型:静态模型、随机游走模型移动模型(Mobility Model)。其中移动模型又分为以下几种: 1. Constant Position Model:恒定位置模型,节点一直保持不动。 2. Random Walk Model:随机游走模型,节点在平面上以随机步长和方向运动。 3. Gauss-Markov Model:高斯-马尔科夫模型,节点在平面上以高斯分布的随机步长和方向运动。 4. Random Direction Model:随机方向模型,节点在平面上以随机方向和常量速度移动。 5. Constant Velocity Model:恒定速度模型,节点以恒定速度沿着一个随机方向移动。 6. Random Waypoint Model:随机航点模型,节点随机选择目标点并以一定速度移动。 7. Random Walk 2D Model:二维随机游走模型,节点在平面上以随机步长和方向运动。 可以通过创建相应的移动模型对象,并将其与节点关联,来实现节点的移动。例如,使用Random Walk 2D Model来实现节点的移动,可以按照以下步骤进行: 1. 创建一个移动模型对象: ```c++ Ptr<RandomWalk2dMobilityModel> model = CreateObject<RandomWalk2dMobilityModel> (); ``` 2. 设置节点的初始位置和速度: ```c++ model->SetPosition (Vector3D (0, 0, 0)); model->SetVelocity (Vector (5, 0, 0)); ``` 3. 将移动模型对象与节点关联: ```c++ node->AggregateObject (model); ``` 在仿真过程中,节点将按照指定的移动模型进行移动。可以使用仿真器的Schedule方法来控制节点的移动时间。例如,以下代码将节点在10秒后开始移动,并在20秒后停止移动: ```c++ Simulator::Schedule (Seconds (10.0), &RandomWalk2dMobilityModel::Start, model); Simulator::Schedule (Seconds (20.0), &RandomWalk2dMobilityModel::Stop, model); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值