Вопрос или проблема
Я использую 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. Давайте разберем возникшие у вас ошибки и предложим соответствующие решения.
Обзор ошибок
- Ошибка: ‘Default’ is not a member of ‘ns3::YansWifiHelper’
- Ошибка: ‘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;
}
Заключение
С данным исправлением ваш скрипт должен работать без ошибок. Обязательно проверьте наличие всех требуемых заголовочных файлов, соответствующих используемым модулям. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.