Я сталкиваюсь с проблемами при попытке настроить беспроводную ячеистую сеть с использованием ns3.38 на Ubuntu 22.04 LTS.

Вопрос или проблема

Я использую Ubuntu версии 22.04 и пытаюсь запустить сценарий с использованием ns-3 3.38, который настраивает сетевое соединение Mesh. Однако после запуска я получаю ошибки.

ошибка: ‘Default’ не является членом ‘ns3: YansiWifiHelper’

ошибка: ‘WIFI_PHY_STANDARD_80211N_5GHZ’ не был объявлен в этой области видимости

Я предоставлю сценарий без заголовочных файлов. У меня две ошибки, и я отмечу строки.

using namespace ns3;

NS_LOG_COMPONENT_DEFINE("SimpleMeshNetwork");

int main(int argc, char *argv[]) {
    LogComponentEnable("SimpleMeshNetwork", LOG_LEVEL_INFO);

    NodeContainer nodes;
    nodes.Create(4);

    MobilityHelper mobility;
    mobility.SetPositionAllocator("ns3::GridPositionAllocator",
                                  "MinX", DoubleValue(0.0),
                                  "MinY", DoubleValue(0.0),
                                  "DeltaX", DoubleValue(100.0),
                                  "DeltaY", DoubleValue(100.0),
                                  "GridWidth", UintegerValue(2),
                                  "LayoutType", StringValue("RowFirst"));
    mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
    mobility.Install(nodes);

    WifiHelper wifi;
    wifi.SetStandard(WIFI_PHY_STANDARD_80211s);
    wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
                                 "DataMode", StringValue("OfdmRate6Mbps"));

    YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default();
    wifiPhy.Set("ChannelNumber", UintegerValue(7));

    YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default();
    wifiPhy.SetChannel(wifiChannel.Create());

    MeshHelper mesh = MeshHelper::Default();
    mesh.SetStackInstaller("ns3::Dot11sStack");
    mesh.SetSpreadInterfaceChannels(MeshHelper::SPREAD_CHANNELS);
    mesh.SetMacType("RandomStart", TimeValue(Seconds(0.1)));

    NetDeviceContainer meshDevices = mesh.Install(wifiPhy, nodes);

    InternetStackHelper internet;
    internet.Install(nodes);

    Ipv4AddressHelper address;
    address.SetBase("10.1.1.0", "255.255.255.0");
    Ipv4InterfaceContainer interfaces = address.Assign(meshDevices);

    Simulator::Stop(Seconds(10.0));

    for (uint32_t i = 0; i < nodes.GetN(); ++i) {
        Ptr<Node> node = nodes.Get(i);
        Ptr<Ipv4> ipv4 = node->GetObject<Ipv4>();
        Ipv4InterfaceAddress iaddr = ipv4->GetAddress(1, 0);
        Ipv4Address addr = iaddr.GetLocal();
        NS_LOG_INFO("Node " << i << " имеет IP адрес " << addr);
    }

    Simulator::Run();
    Simulator::Destroy();

    return 0;
} 



Как решить такие ошибки?

wifi.SetStandard(ns3::WIFI_STANDARD_80211n);

Попробуйте использовать эту строку вместо n3.38, нужно писать без указания диапазона частот.

Насколько мне известно, модуль mesh NS3 802.11s не совместим с модулями 802.11n/ac/ax. Вот ссылка. https://gitlab.com/nsnam/ns-3-dev/-/issues/176

Некоторые предложения, чтобы это заработало, были озвучены в комментариях к указанной ссылке, но никто не делился тем, что это сработало. До тех пор предложенный способ использовать mesh 11s – перейти на более ранние стандарты.

Ответ или решение

Вам понадобятся несколько исправлений в вашем скрипте для настройки беспроводной сетевой мэш-сети с использованием ns-3.38 на Ubuntu 22.04 LTS. Давайте разберем возникшие у вас ошибки и предложим соответствующие решения.

Обзор ошибок

  1. Ошибка: ‘Default’ is not a member of ‘ns3::YansWifiHelper’
  2. Ошибка: ‘WIFI_PHY_STANDARD_80211N_5GHZ’ was not declared in this scope

Решение ошибок

1. Исправление для YansWifiPhyHelper

Ошибка возникает из-за неверного использования функции Default(). В версии ns-3.38 правильный способ создания экземпляра YansWifiPhyHelper заключается в том, чтобы просто объявить его, а не использовать метод Default().

Измените эту строку:

YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default();

На:

YansWifiPhyHelper wifiPhy;

2. Переход на стандарт WIFI

Для исправления второй ошибки, вам нужно использовать правильный стандарт Wifi для создания мэш-сети. В вашем коде пытались использовать WIFI_PHY_STANDARD_80211N_5GHZ, что не соответствует спецификации мэш-сетей, поддерживаемых ns-3. Как упоминалось в комментарии к вашему коду, ns3.38 не поддерживает 802.11n/ac/ax для мэш-сетей. Вместо этого, вам следует использовать стандарт WIFI_STANDARD_80211s, который представляет значение мэш-сетей.

Измените эту строку:

wifi.SetStandard(WIFI_PHY_STANDARD_80211s);

На:

wifi.SetStandard(ns3::WIFI_STANDARD_80211s);

Полностью исправленный код

Вот окончательный вариант вашего скрипта с внесенными исправлениями:

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/mesh-module.h"
#include "ns3/wifi-module.h"
#include "ns3/yans-wifi-helper.h"
#include "ns3/log.h"

using namespace ns3;

NS_LOG_COMPONENT_DEFINE("SimpleMeshNetwork");

int main(int argc, char *argv[]) {
    LogComponentEnable("SimpleMeshNetwork", LOG_LEVEL_INFO);

    NodeContainer nodes;
    nodes.Create(4);

    MobilityHelper mobility;
    mobility.SetPositionAllocator("ns3::GridPositionAllocator",
                                  "MinX", DoubleValue(0.0),
                                  "MinY", DoubleValue(0.0),
                                  "DeltaX", DoubleValue(100.0),
                                  "DeltaY", DoubleValue(100.0),
                                  "GridWidth", UintegerValue(2),
                                  "LayoutType", StringValue("RowFirst"));
    mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
    mobility.Install(nodes);

    WifiHelper wifi;
    wifi.SetStandard(ns3::WIFI_STANDARD_80211s); // Замените на 802.11s
    wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
                                 "DataMode", StringValue("OfdmRate6Mbps"));

    YansWifiPhyHelper wifiPhy; // Изменено
    wifiPhy.Set("ChannelNumber", UintegerValue(7));

    YansWifiChannelHelper wifiChannel;
    wifiChannel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
    wifiPhy.SetChannel(wifiChannel.Create());

    MeshHelper mesh = MeshHelper::Default();
    mesh.SetStackInstaller("ns3::Dot11sStack");
    mesh.SetSpreadInterfaceChannels(MeshHelper::SPREAD_CHANNELS);
    mesh.SetMacType("RandomStart", TimeValue(Seconds(0.1)));

    NetDeviceContainer meshDevices = mesh.Install(wifiPhy, nodes);

    InternetStackHelper internet;
    internet.Install(nodes);

    Ipv4AddressHelper address;
    address.SetBase("10.1.1.0", "255.255.255.0");
    Ipv4InterfaceContainer interfaces = address.Assign(meshDevices);

    Simulator::Stop(Seconds(10.0));

    for (uint32_t i = 0; i < nodes.GetN(); ++i) {
        Ptr<Node> node = nodes.Get(i);
        Ptr<Ipv4> ipv4 = node->GetObject<Ipv4>();
        Ipv4InterfaceAddress iaddr = ipv4->GetAddress(1, 0);
        Ipv4Address addr = iaddr.GetLocal();
        NS_LOG_INFO("Node " << i << " has IP address " << addr);
    }

    Simulator::Run();
    Simulator::Destroy();

    return 0;
}

Заключение

С данным исправлением ваш скрипт должен работать без ошибок. Обязательно проверьте наличие всех требуемых заголовочных файлов, соответствующих используемым модулям. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...