NS3网络仿真(7): Wifi节点

快乐虾

http://blog.csdn.net/lights_joy/

欢迎转载,但请保留作者信息

在上一节中,我们仿真了一个总线型网络,这一节尝试将上一节中的n0变成一个无线的AP,再连上几个节点。这也是NS3中的示例third.cc干的事情,只是我们用Python实现。

// Default Network Topology
//
//   Wifi 10.1.3.0
//                 AP
//  *    *    *    *
//  |    |    |    |    10.1.1.0
// n5   n6   n7   n0 -------------- n1   n2   n3   n4
//                   point-to-point  |    |    |    |
//                                   ================
//                                     LAN 10.1.2.0

与上一节一样,先构造p2p网络,再构建总线型网线:

# 构建点对点连接
p2pNodes = ns.network.NodeContainer()
p2pNodes.Create (2)

pointToPoint = ns.point_to_point.PointToPointHelper()
pointToPoint.SetDeviceAttribute ("DataRate", ns.core.StringValue ("5Mbps"))
pointToPoint.SetChannelAttribute ("Delay", ns.core.StringValue ("2ms"))
p2pDevices = pointToPoint.Install (p2pNodes)

# 构建总线连接
nCsma = 3

csmaNodes = ns.network.NodeContainer()
csmaNodes.Add (p2pNodes.Get (1))
csmaNodes.Create (nCsma)

csma = ns.csma.CsmaHelper()
csma.SetChannelAttribute ("DataRate", ns.core.StringValue ("100Mbps"))
csma.SetChannelAttribute ("Delay", ns.core.TimeValue (ns.core.NanoSeconds (6560)))
csmaDevices = csma.Install (csmaNodes)

接着构建无线网络:

# 构建Wifi连接
nWifi = 3
wifiStaNodes = ns.network.NodeContainer()
wifiStaNodes.Create (nWifi)
wifiApNode = p2pNodes.Get (0)

channel = ns.wifi.YansWifiChannelHelper.Default ()
phy = ns.wifi.YansWifiPhyHelper.Default ()
phy.SetChannel (channel.Create ())

接着配置AP:

# 配置AP
wifi = ns.wifi.WifiHelper.Default ()
wifi.SetRemoteStationManager ("ns3::AarfWifiManager")

mac = ns.wifi.NqosWifiMacHelper.Default ()

ssid = ns.wifi.Ssid ("ns-3-ssid")
mac.SetType ("ns3::StaWifiMac",
            "Ssid", ns.wifi.SsidValue (ssid),
            "ActiveProbing", ns.core.BooleanValue (False))

staDevices = wifi.Install (phy, mac, wifiStaNodes)

mac.SetType ("ns3::ApWifiMac",
            "Ssid", ns.wifi.SsidValue (ssid))

apDevices = wifi.Install (phy, mac, wifiApNode);

接着配置无线节点的位置参数:

# 配置无线节点的位置
mobility = ns.mobility.MobilityHelper()

mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
                                "MinX", ns.core.DoubleValue (0.0),
                                "MinY", ns.core.DoubleValue (0.0),
                                "DeltaX", ns.core.DoubleValue (5.0),
                                "DeltaY", ns.core.DoubleValue (10.0),
                                "GridWidth", ns.core.UintegerValue (3),
                                "LayoutType", ns.core.StringValue ("RowFirst"))

mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
                            "Bounds", ns.mobility.RectangleValue (ns.mobility.Rectangle (-50, 50, -50, 50)))
mobility.Install (wifiStaNodes)

mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel")
mobility.Install (wifiApNode)

接着安装协议栈:

# 安装协议栈
stack = ns.internet.InternetStackHelper()
stack.Install (csmaNodes)
stack.Install (wifiApNode)
stack.Install (wifiStaNodes)

配置IP,这个和上一节一样,只是加上10.1.3.0网段而已:

# 配置IP
address = ns.internet.Ipv4AddressHelper()
address.SetBase (
    ns.network.Ipv4Address("10.1.1.0"),
    ns.network.Ipv4Mask("255.255.255.0"))
p2pInterfaces = address.Assign (p2pDevices)

address.SetBase (
    ns.network.Ipv4Address("10.1.2.0"),
    ns.network.Ipv4Mask("255.255.255.0"))
csmaInterfaces = address.Assign (csmaDevices)

address.SetBase (
    ns.network.Ipv4Address("10.1.3.0"),
    ns.network.Ipv4Mask("255.255.255.0"))
address.Assign (staDevices)
address.Assign (apDevices)

接下来模拟一个Echo服务,这个与上一节相同,只是Client安装在了Wifi节点上。

# 配置应用程序
echoServer = ns.applications.UdpEchoServerHelper (9)

serverApps = echoServer.Install (csmaNodes.Get (nCsma))
serverApps.Start (ns.core.Seconds (1.0))
serverApps.Stop (ns.core.Seconds (20.0))

echoClient = ns.applications.UdpEchoClientHelper (csmaInterfaces.GetAddress (nCsma), 9)
echoClient.SetAttribute ("MaxPackets", ns.core.UintegerValue (5))
echoClient.SetAttribute ("Interval", ns.core.TimeValue (ns.core.Seconds (1.0)))
echoClient.SetAttribute ("PacketSize", ns.core.UintegerValue (1024))

clientApps = echoClient.Install (wifiStaNodes.Get (nWifi - 1))
clientApps.Start (ns.core.Seconds (2.0))
clientApps.Stop (ns.core.Seconds (20.0))

接下来的部分与上一节几乎完全相同,只是加上了Simulator.Stop,因为如果没有这个函数调用,那么将导致Simulator.Run永远不会停止:

# 全局路由管理器根据节点产生 的链路通告为每个节点建立路由表
ns.internet.Ipv4GlobalRoutingHelper.PopulateRoutingTables()

ns.core.Simulator.Stop (ns.core.Seconds (10.0));

pointToPoint.EnablePcapAll ("third");
csma.EnablePcap ("third", csmaDevices.Get (1), True)
phy.EnablePcap ("third", apDevices.Get (0))

anim = ns.netanim.AnimationInterface(‘third.xml‘)
anim.SetConstantPosition(p2pNodes.Get(0), 10, 10)
anim.SetConstantPosition(csmaNodes.Get(0), 30, 10)
anim.SetConstantPosition(csmaNodes.Get(1), 40, 10)
anim.SetConstantPosition(csmaNodes.Get(2), 50, 10)
anim.SetConstantPosition(csmaNodes.Get(3), 60, 10)
anim.EnablePacketMetadata(True)

# 开始仿真
ns.core.Simulator.Run()
ns.core.Simulator.Destroy()

看看NetAnim显示的仿真结果:

再看看third-0-1.pcap的内容:

如我们所愿,802.11协议,呵呵~~~~~

??

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 17:05:18

NS3网络仿真(7): Wifi节点的相关文章

NS3网络仿真(2):first.py

1    安装基本模块 11  安装Python 12  安装PTVS 13  添加对python-279的支持 2    在vs2013下编译NS3 3    编译NetAnim 4    在vs2013下使用ns 快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 学习一下ns中的第一个示例脚本,first.py,这个示例模拟一个Echo服务和客户端之间的通信. 1.1    导入所需要的库 ns3的每一个模块都有一个对应的用C++开发的dl

NS3网络仿真(6): 总线型网络

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3提供的第一个示例first.py中,模拟了一个点对点的网络,接下来的一个示例代码模拟了一个总线型网络及CSMA协议. # // Default Network Topology # // # // 10.1.1.0 # // n0 -------------- n1 n2 n3 n4 # // point-to-point | | | | # // ================ #

NS3网络仿真(8): 实时仿真

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 NS3支持实时仿真,且可以将NS3模拟生成的数据包通过主机上真实的网卡发送出去,本节尝试运行NS3中自带的fd-emu-ping示例,使用NS3模拟一台设备,再通过主机上的网口ping一台网络上的真实设备. // Allow ns-3 to ping a real host somewhere, using emulation mode // // +----------------------

NS3网络仿真(3): NetAnim

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3提供的示例first.py中,并没有生成NetAnim所需要的xml文件,本节我们尝试用NetAnim来展示first.py的仿真结果. 依照NetAnim的说明,在Run开始前加上一行: anim = ns.netanim.AnimationInterface('first.xml') ns.core.Simulator.Run() ns.core.Simulator.Destroy(

NS3网络仿真(1):开发环境搭建

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 1.1    安装基本模块 1.1.1  安装Python 出于对兼容性的考虑,在此选择python-2.7.9,win32版本,而不是最新的3.x版本. 安装目录为c:\python27 这个就没什么可说的了. 1.1.2  安装PTVS PTVS是ms提供的一个python插件,我用的是2.2,安装完成后可以在VS2013的扩展与更新中看到它: 1.1.3  添加对python-2.7.9的

NS3网络仿真(14): TCP连接与端口扫描

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 本节学习一下使用NS3构造一个TCP包,再利用构造好的TCP包进行最简单的TCP端口扫描. 1.    TCP协议数据报头 下图中给出了TCP协议数据报头的格式. 源端口.目的端口:16位长.标识出远端和本地的端口号. 顺序号:32位长.表明了发送的数据报的顺序. 确认号:32位长.希望收到的下一个数据报的序列号. TCP协议数据报头DE 头长:4位长.表明TCP头中包含多少个32位字. 接下来

NS3网络仿真(13): FdNetDevice的问题

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在前面的小节中,我们使用FdNetDevice进行了实时仿真,利用NS3向一台实际的机器发送ping包,但得到的结果显然有点偏离我们的预期结果,因为ping包的响应时间明显长于正常情况下的响应时间. 这个是用NS3发送ping包的结果: 使用WireShark在NS3使用的适配器上抓包,这个是在物理网卡上抓到的包: 显然对端的响应是没有问题的,莫非问题出现在winpcap的发送上?刚好学习ICM

NS3网络仿真(12): ICMPv4协议

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 ICMP的全称是 Internet ControlMessage Protocol .其目的就是让我们能够检测网络的连通状况.ICMP主要是透过不同的类别(Type)与代码(Code) 让机器来识别不同的连接状况.本节利用NS3学习一下此协议. 1.1    报文格式 ICMP的报文格式如下: 即ICMP报文是IP报文的数据,而IPv4报文的格式如下: 在网上抓一个ping包来看看: 这是一个从

NS3网络仿真(9): 构建以太网帧

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3使用了一个叫Packet的类来表示一个数据帧,本节尝试用它构造一个以太网帧. 以下是一个典型的ARP请求帧: 我们就用Packet来创建一个同样的帧. 首先创建一个空的数据包: Ptr<Packet>pkt = Create<Packet>(); 接下来加上ARP头: //加入arp头 ArpHeader ah; ah.SetRequest(Mac48Address(&qu