在上一节中,我们仿真了一个总线型网络,这一节尝试将上一节中的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协议,呵呵~~~~~
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/lights_joy/article/details/46868631