Loading...

# 6.ns3 wifi 模型配置

在本节中,将介绍 ns3 中 wifi 模型扩展所需的一些内容,

# Using the WifiNetDevice

使用底层 ns3 API 添加一个 WifiNetDevice 到节点上,必须创建一个 WifiNetDevice 实例,和许多构成的对象,以一种合适的方式绑定在一起( WifiNetDevice 为未来的可扩展性,在某种程度上已经非常模块化)。在底层 api,这需要大约 20 行代码( ns3::WifiHelper::Install,ns3::YansWifiPhyHelper::Create )。一个信道 WifiChannel 必须被创建,也包含了一些构成的对象(请看 ns3::YansWifiChannelHelper::Create )。

然而,一些可用的帮助类可以使用,如果愿意使用默认值的话,添加设备和信道只用几行代码就能完成。当然也可以使用额外的 api 允许通过属性系统来改变默认值。

接下来,我们描述创建一个 WifiNetDevice 从底层 (WifiChannel) 到设备层 (WifiNetDevice) 的通常的步骤。

为了创建一个 WifiNetDevice ,用户主要需要配置五步:

  1. 配置 WifiChannel:WifiChannel 关系到信号在相同的信道上从一个设备到另一个设备。 WifiChannel 主要的配置是传播损耗模型和传播延时模型。
  2. 配置 WifiPhyWifiPhy 关系到从 WifiChannel 发送和接收无线信号。这里, WifiPhy 依赖于接收的信号的强度和噪声决定每一帧是否被成功解码。所以, WifiPhy 的主要配置是误码率模型,该模型就是最后计算基于信号的成功解码帧的概率。
  3. 配置 WifiMac :这一步更多的是与 the architecture and device level 有关。用户配置 wifi architecture (例如 adhoc or ap-sta )和是否支持 Qos(802.11e),HT(802.11n),VHT(802.11ac) 特性。
  4. 创建 WifiDevice : 在这一步,用户配置期望的 wifi 标准(例如 802.11b,802.11g,802.11a,802.11n or 802.11ac )和速率控制算法。
  5. 配置 mobility : 最后, mobility 模型通常需要在 WifiNetDevice 可用之前配置。

# YansWifiChannelHelper

YansWifiChannelHelper 具有一个不同寻常的名字。读者可能会疑惑为什么使用这样的名字。该模型是从 yans simulator 提取出来的,名字也是引用自它。该帮助类可以创建一个带有默认传播损耗模型 (PropagationLoss) 和传播延时模型 (PropagationDelay)WifiChannel

用户所使用的经典代码如下:

YansWifiChannelHelper wifiChannelHelper = YansWifiChannelHelper::Default ();
    Ptr<WifiChannel> wifiChannel = wifiChannelHelper.Create ();

特别的是,默认的信道模型使用的是 3 的指数的信道模型,所用的传播时延等于一个常数值,就是光速 (ns3::ConstantSpeedPropagationDelayModel) ,所用的传播损耗是基于一个默认的 log distance model(ns3::LogDistancePropagationLossModel) 。请注意,默认的 log distance model is configured with a reference loss of 46.6777 dB at reference distance of 1mThe reference loss of 46.6777 dB was calculated using Friis propagation loss model at 5.15 GHz . The reference loss 模型如果使用 802.11b,802.11g,802.11n (由于它们工作在 2.4GHZ ) 必须被改变。

注意上面在创建一个帮助对象和一个实际的仿真对象的区别。在 ns3 中,帮助对象(仅仅用于帮助 APP)是在栈(它们可以使用 new 操作符创建和使用 deleted 销毁)中创建的。然而,实际的 ns3 对象继承自 ns3::Object 类,并且分配一个智能指针。

下面的两个方法在配置 YansWifiChannelHelper 是有用的:

• YansWifiChannelHelper::AddPropagationLoss adds a PropagationLossModel to a chain of PropagationLossModel
• YansWifiChannelHelper::SetPropagationDelay sets a PropagationDelayModel

# YansWifiPhyHelper

物理层设备(基类 ns3::WifiPhy )在 ns3 中是与 ns3::WifiChannel 相连接的。我们需要为 YansWifiChannel 创建合适的 WifiPhy 对象。这里 YansWifiPhyHelper 就可以胜任这个工作。

YansWifiPhyHelper 类配置了一个对象工厂来创建一个 YansWifiPhy 实例,并添加一些其他的对象到该实例中,包括可能补充的 ErrorRateModel 误码率模型和指向 MobilityModel 移动模型的指针。典型的用户代码如下:

YansWifiPhyHelper wifiPhyHelper = YansWifiPhyHelper::Default ();
    wifiPhyHelper.SetChannel (wifiChannel);

YansWifiPhyHelper 默认配置 NistErrorRateModel(ns3::NistErrorRateModel) 误码率模型。你可以使用 YansWifiPhyHelper::SetErrorRateModel 方法更改误码率模型。

可选的是,如果 pcap 跟踪记录是需要的话,用户可以使用下面的代码使得 pcap 跟踪可用:

YansWifiPhyHelper::SetPcapDataLinkType (enum SupportedPcapDataLinkTypes dlt)
    ns3支持802.11的RadioTap和Prism轨迹扩展。

注意,我们还没有实际创建一个 WifiPhy 对象;我们只是准备了告诉 YansWifiPhyHelper 与之连接的信道。 Phy 对象会在下一步创建。

802.11n/ac PHY 层可以使用长 800ns 或者短 400nsOFDM guard intervals 。为了配置这个参数,可以使用下面的一行的代码(这个例子中,使用的是 short guard interval 的支持):

wifiPhyHelper.Set ("ShortGuardEnabled", BooleanValue(true));

更多的是, 802.11 提供了一种可选的模式 (GreenField mode) 来减少 preamble durations (前沿持续时间),并且这也是唯一一种与 802.11n 设备兼容的模式。可以使用下面的代码启用这种模式:

wifiPhyHelper.Set ("GreenfieldEnabled",BooleanValue(true));

802.11nPHY 层可以支持 20(默认)或者 40MHZ 信道带宽, 802.11ac PHY 层可以使用 20,40,80(默认),160MHZ 信道带宽。由于信道带宽值被 WifiHelper::SetStandard 重写,可以使用下面 Config::Set 代码在安装后进行配置:

WifiHelper wifi = WifiHelper::Default ();
    wifi.SetStandard (WIFI_PHY_STANDARD_80211ac);
    wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", 
                                  StringValue("VHtMcs9"), "ControlMode",StringValue("VHtMcs9"));
    VhtWifiMacHelper mac = VhtWifiMacHelper::Default ();
    //Install PHY and MAC
    Ssid ssid = Ssid ("ns3-wifi");
    mac.SetType ("ns3::StaWifiMac",
        "Ssid", SsidValue (ssid),
        "ActiveProbing", BooleanValue (false));
    NetDeviceContainer staDevice;
    staDevice = wifi.Install (phy, mac, wifiStaNode);
    mac.SetType ("ns3::ApWifiMac",
        "Ssid", SsidValue (ssid));
    NetDeviceContainer apDevice;
    apDevice = wifi.Install (phy, mac, wifiApNode);
    //Once install is done, we overwrite the channel width value
    //(一旦安装之后,我们可以重写信道带宽)
    Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (160));

# WifiMacHelper

下一步是配置 MAC 模型。我们使用 WifiMacHelper 来完成。 WifiMacHelper 可以完成 MAC low 模型和 MAC high 模型。用户必须决定采用哪种模型: 802.11/WMM-style Qos802.11n-style Hight throughput(HT)802.11ac-style Very High throughput(VHT)

# NqosWifiMacHelper and QosWifiMacHelper

ns3::NqosWifiMacHelperns3::QosWifiMacHelper 均可以配置一个对象工厂来创建一个 ns3::WifiMac 实例。它们用来配置像 MAC 类型的参数。
前者 ns3::NqosWifiMacHelper 不支持以下类型的 MAC 实例的创建: 802.11e/WMM-style QoS,802.11n-style High throughput (HT),802.11ac-style Very High throughput (VHT)
例如下面的用户代码配置了一个不支持 QOsHTMAC 类型实例,并且没有 AP ,仅有 STA 的一个基础设施网络, SSID 设置为 ns-3-ssid :

NqosWifiMacHelper wifiMacHelper = NqosWifiMacHelper::Default ();
    Ssid ssid = Ssid ("ns-3-ssid");
    wifiMacHelper.SetType ("ns3::StaWifiMac",
            "Ssid", SsidValue (ssid),
            "ActiveProbing", BooleanValue (false));
可以使用ns3::QosWifiMacHelper来代替ns3::NqosWifiMacHelper来创建一个支持Qos的MAC实例。
下面的代码使用ns3::QosWifiMacHelper创建了一个支持Qos的AP:
QosWifiMacHelper wifiMacHelper = QosWifiMacHelper::Default ();
    wifiMacHelper.SetType ("ns3::ApWifiMac",
            "Ssid", SsidValue (ssid),
            "BeaconGeneration", BooleanValue (true),
            "BeaconInterval", TimeValue (Seconds (2.5)));

支持 Qos 的 MAC 模型可以工作在流量属于四种不同访问策略下: AC_VO 语音流, AC_VI 视频流, AC_BE 尽最大努力流, AC_BK 后台流。为了使 MACMSDU 决定一个合适的 AC ,转发到这些 MAC 层的包应该被使用一个 TID(traffic id)ns3::QosTag 标记,否则该包将被属于 AC_BE 策略。

为了创建一个 ad-hoc MAC 实例,简单的使用 ns3::AdhocWifiMac 代替 ns3::StaWifiMacns3::ApWifiMac 即可。

# HtWifiMacHelper

ns3::HtWifiMacHelper 配置一个对象工厂来创建一个 ns3::WifiMac 实例。它用于支持创建 802.11n-style High throughput (HT) 和支持 QoS 类型的 MAC 实例。特别的,该对象也可以用来设置:

1. 为了使用802.11n MSDU聚合特性,为特定的访问策略AC设置MSDU聚合
2. 可以设置像threshold(阈值)(块ACK机制应该被使用的包的数量)的块ACK参数和闲置超时。

例如,下面的代码配置了一个 HT MAC ,不支持 AP ,支持 STAQOS 保证,聚合 AC_VO , 和 AC_BE 的块 ACK ,这样的基础设施网络,它的 APSSIDns-3-ssid

HtWifiMacHelper wifiMacHelper = HtWifiMacHelper::Default ();
    Ssid ssid = Ssid ("ns-3-ssid");
    wifiMacHelper.SetType ("ns3::StaWifiMac",
                "Ssid", SsidValue (ssid),
                "ActiveProbing", BooleanValue (false));
    wifiMacHelper.SetMsduAggregatorForAc (AC_VO, "ns3::MsduStandardAggregator",
                    "MaxAmsduSize", UintegerValue (3839));
    wifiMacHelper.SetBlockAckThresholdForAc (AC_BE, 10);
    wifiMacHelper.SetBlockAckInactivityTimeoutForAc (AC_BE, 5);

这个对象也可以使用 ns3::QosWifiMacHelper 以相同的方式进行设置。

# VhtWifiMacHelper

ns3::VhtWifiMacHelper 配置一个对象工厂来创建一个 ns3::WifiMac 实例。用于支持创建以下类型的 MAC 实例: 802.11ac-style Very High throughput (VHT) 和支持 QoS 保证。这个对象与 HtWifiMacHelper 很相似。

# WifiHelper

我们现在准备创建 WifiNetDevices . 首先,让我们创建一个默认设置的 WifiHelper

WifiHelper wifiHelper = WifiHelper::Default ();

这一步都做了什么呢?它默认设置 802.11a WIFI 标准,和设置 ns3::ArfWifiManager 作为 RemoteStationManager 。你可以通过调用 WifiHelper::SetRemoteStationManager 方法改变 RemoteStationManager 。为了改变采用的 wifi 标准,可以调用 WifiHelper::SetStandard 方法来设置想要的标准。

现在,让我们使用上面所描述的对象 wifiPhyHelperwifiMacHelper ,安装到在一系列节点 c 上的 WifiNetDevices

NetDeviceContainer wifiContainer = WifiHelper::Install (wifiPhyHelper, wifiMacHelper, c);

这样就创建了一个 WifiNetDevice,它包含 WifiRemoteStationManager,WifiMac,WifiPhy(连接到匹配的 WifiChannel 上的)。
WifiHelper::SetStandard 方法设置了定义在已选的标准版本中的可变的默认的定时参数,可重写已经存在的或者已经配置过的值。为了改变已经给 WifiHelper::SetStandard 重写的参数,应该在安装后使用 Config::Set 来配置:

WifiHelper wifi = WifiHelper::Default ();
    wifi.SetStandard (WIFI_PHY_STANDARD_80211n_2_4GHZ);
    wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", 
                                  StringValue("HtMcs7"), "ControlMode",StringValue("HtMcs7"));
    HtWifiMacHelper mac = HtWifiMacHelper::Default ();
    //Install PHY and MAC
    Ssid ssid = Ssid ("ns3-wifi");
    mac.SetType ("ns3::StaWifiMac",
            "Ssid", SsidValue (ssid),
            "ActiveProbing", BooleanValue (false));
    NetDeviceContainer staDevice;
    staDevice = wifi.Install (phy, mac, wifiStaNode);
    mac.SetType ("ns3::ApWifiMac",
            "Ssid", SsidValue (ssid));
    NetDeviceContainer apDevice;
    apDevice = wifi.Install (phy, mac, wifiApNode);
    //Once install is done, we overwrite the standard timing values
    Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/Slot", TimeValue (MicroSeconds (slot))
    Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/Sifs", TimeValue (MicroSeconds (sifs))
    Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/AckTimeout", TimeValue (MicroSeconds (
    Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/CtsTimeout", TimeValue (MicroSeconds (
    Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/Rifs", TimeValue (MicroSeconds (rifs))
    Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/BasicBlockAckTimeout", TimeValue (Micr
    Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/CompressedBlockAckTimeout", TimeValue

有许多 ns3 属性可以被上面的 helpers 对象使用来改变默认的行为,例子脚本程序展示了如何改变默认行为。

# Mobility configuration

最后,一个移动模型必须在 wifi device 上进行配置。移动模型被用于计算传播损耗和传播时延。在下一节中提供了两个例子。用户可以引用 Mobility 模块一章获取更多细节。

# Example configuration

ns3 提供了两个典型的配置 wifi 网络的例子程序 - 一个例子程序使用 adhoc 网络,一个例子程序使用基础设施网络。两个例子程序在 examples/wireless 目录( wifi-simple-adhoc.ccwifi-simple-infra.cc )。鼓励用户学习 examples/wireless 目录下的例子。

# AdHoc WifiNetDevice configuration

在这个例子中,我们创建了两个 adhoc 节点,配置了 802.11a wifi 设备。我们使用 ns3::ConstantSpeedPropagationDelayModel 作为传播延时模型,使用带有 3 的指数的 ns3::LogDistancePropagationLossModel 作为传播损耗模型。两个设备都配置 12Mbps 固定速率的 ConstantRateWifiManager 。最后,我们使用 ns3::ListPositionAllocator 手动放置节点位置:

std::string phyMode ("OfdmRate12Mbps");
    NodeContainer c;
    c.Create (2);
    WifiHelper wifi;
    wifi.SetStandard (WIFI_PHY_STANDARD_80211a);
    YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
    // ns-3 supports RadioTap and Prism tracing extensions for 802.11
    wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
    YansWifiChannelHelper wifiChannel;
    wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
    wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel",
                "Exponent", DoubleValue (3.0));
    wifiPhy.SetChannel (wifiChannel.Create ());
    // Add a non-QoS upper mac, and disable rate control (i.e. ConstantRateWifiManager)
    NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
    wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
                    "DataMode",StringValue (phyMode),
                    "ControlMode",StringValue (phyMode));
    // Set it to adhoc mode
    wifiMac.SetType ("ns3::AdhocWifiMac");
    NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, c);
    // Configure mobility
    MobilityHelper mobility;
    Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
    positionAlloc->Add (Vector (0.0, 0.0, 0.0));
    positionAlloc->Add (Vector (5.0, 0.0, 0.0));
    mobility.SetPositionAllocator (positionAlloc);
    mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
    mobility.Install (c);
    // other set up (e.g. InternetStack, Application)Infrastructure (access point and clients) 
    //  WifiNetDevice configuration

这是一个典型的代码,展示了用户如何配置一个接入点 AP 和一系列客户端。在这个例子中,我们创建一个接入点和两个客户端。每一个节点配置 802.11 b wifi 设备:

std::string phyMode ("DsssRate1Mbps");
    NodeContainer ap;
    ap.Create (1);
    NodeContainer sta;
    sta.Create (2);
    WifiHelper wifi;
    wifi.SetStandard (WIFI_PHY_STANDARD_80211b);
    YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
    // ns-3 supports RadioTap and Prism tracing extensions for 802.11
    wifiPhy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
    YansWifiChannelHelper wifiChannel;
    // reference loss must be changed since 802.11b is operating at 2.4GHz
    wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
    wifiChannel.AddPropagationLoss ("ns3::LogDistancePropagationLossModel",
                    "Exponent", DoubleValue (3.0),
                    "ReferenceLoss", DoubleValue (40.0459));
    wifiPhy.SetChannel (wifiChannel.Create ());
    // Add a non-QoS upper mac, and disable rate control
    NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default ();
    wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
                    "DataMode",StringValue (phyMode),
                    "ControlMode",StringValue (phyMode));
    // Setup the rest of the upper mac
    Ssid ssid = Ssid ("wifi-default");
    // setup ap.
    wifiMac.SetType ("ns3::ApWifiMac",
            "Ssid", SsidValue (ssid));
    NetDeviceContainer apDevice = wifi.Install (wifiPhy, wifiMac, ap);
    NetDeviceContainer devices = apDevice;
    // setup sta.
    wifiMac.SetType ("ns3::StaWifiMac",
            "Ssid", SsidValue (ssid),
            "ActiveProbing", BooleanValue (false));
    NetDeviceContainer staDevice = wifi.Install (wifiPhy, wifiMac, sta);
    devices.Add (staDevice);
    // Configure mobility
    MobilityHelper mobility;
    Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
    positionAlloc->Add (Vector (0.0, 0.0, 0.0));
    positionAlloc->Add (Vector (5.0, 0.0, 0.0));
    positionAlloc->Add (Vector (0.0, 5.0, 0.0));
    mobility.SetPositionAllocator (positionAlloc);
    mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
    mobility.Install (ap);
    mobility.Install (sta);
    // other set up (e.g. InternetStack, Application)
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

jluyeyu 微信支付

微信支付

jluyeyu 支付宝

支付宝