zoukankan      html  css  js  c++  java
  • 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协议。呵呵~~~~~


     


     







    
  • 相关阅读:
    Mina入门:mina版之HelloWorld
    Mina入门:Java NIO基础概念
    Activity与Service进行数据交互
    Android 6.0权限全面详细分析和解决方案
    查看Android系统是User模式还是Eng模式
    修改 Android 5.x 系统默认音量大小
    Android执行程序或脚本的方法
    Android Launcher 3 简单分析
    将Android系统源码导入ecplise
    Scrum三大角色特点
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7160559.html
Copyright © 2011-2022 走看看