Ответ a4arshad компилируется и запускается, но они не верны. Причина, по которой решение a4arshad не работает, заключается в том, что второй вызов SetAttribute
устанавливает атрибут OffTime
как LogNormalRandomVariable
с Sigma=0.0352
. Второй вызов не добавляет к существующему LogNormalRandomVariable
с Mu=0.4026
. Второй вызов перезаписывает первого.
a4arshad также предлагает поставить пробел между LogNormalRandomVariable
и [
, но это тоже не работает; это просто приведет к тому, что ns-3 проигнорирует все параметры.
Правильный способ задания атрибута в качестве связанной бумаги - разделить параметры с помощью трубы, |
. Вы должны сделать что-то вроде
onoff.SetAttribute("OffTime", StringValue("ns3::LogNormalRandomVariable[Mu=0.4026|Sigma=0.0352]"));
Я не знаю, когда ns-3 переключился на использование канала вместо запятой, но я использую самую последнюю версию выпуска, ns-3.30.1.
Вы можете использовать следующую программу, чтобы проверить, работает ли установка атрибута. Последние строки являются соответствующими; остальное - шаблон для настройки симуляции. В последних строках мы извлекаем Attribute
из Application
и выводим значения Mu и Sigma. Попробуйте комментировать / раскомментировать правильные / неправильные методы и посмотреть на различные результаты. Согласно документации LogNormalRandomVariable
, значения по умолчанию Mu и Sigma равны 0 и 1 соответственно.
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
// setting a LogNormalRandomVariable with multiple parameters as the OffTime
// of an OnOffApplication
// https://stackoverflow.com/questions/60791009
// Author: Sagar
#include "ns3/core-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/ipv4-global-routing-helper.h"
#include "ns3/applications-module.h"
using namespace ns3;
NS_LOG_COMPONENT_DEFINE("RandomVariableAttirbuteTest");
int
main(int argc, char *argv[]) {
NodeContainer nodes;
nodes.Create(2);
PointToPointHelper p2pLink;
NetDeviceContainer devices = p2pLink.Install(nodes);
InternetStackHelper stack;
stack.InstallAll();
// assign IP addresses to NetDevices
Ipv4AddressHelper address ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer ipInterfaces = address.Assign(devices);
Ipv4GlobalRoutingHelper::PopulateRoutingTables();
// configure and install server app
int serverPort = 8080;
UdpServerHelper serverApp (serverPort);
serverApp.Install(nodes.Get(0));
Address serverAddress = InetSocketAddress(ipInterfaces.GetAddress(0), serverPort);
// configure and install client apps
OnOffHelper onoff ("ns3::UdpSocketFactory", serverAddress);
// incorrect (two separate SetAttribute calls)
// onoff.SetAttribute("OffTime", StringValue("ns3::LogNormalRandomVariable[Mu=0.4026]"));
// onoff.SetAttribute("OffTime", StringValue("ns3::LogNormalRandomVariable[Sigma=0.0352]"));
// also incorrect (adding a space)
// onoff.SetAttribute("OffTime", StringValue("ns3::LogNormalRandomVariable [Mu=0.4026,Sigma=0.0352]"));
// correct
onoff.SetAttribute("OffTime", StringValue("ns3::LogNormalRandomVariable[Mu=0.4026|Sigma=0.0352]"));
onoff.Install(nodes.Get(1));
// print Attirbutes to check if they were correctly set
Ptr<Application> app = nodes.Get(1)->GetApplication(0);
PointerValue pv;
app->GetAttribute("OffTime", pv);
Ptr<LogNormalRandomVariable> rv = pv.Get<LogNormalRandomVariable>();
NS_LOG_UNCOND("Mu = " << rv->GetMu());
NS_LOG_UNCOND("Sigma = " << rv->GetSigma());
return 0;
}