# 9.ns3 Config 类 API 说明
在本节中,将介绍 ns3
中 Config
类的使用, 它可以用来配置仿真参数和跟踪,在统计结果方面十分有用
源文件位置:src/core/model/config.h
config.cc
# 函数原型
void ns3::Config::Connect (std::string path, const CallbackBase &cb) | |
此函数将尝试查找与输入路径匹配的所有跟踪源,然后将输入回调连接到它们,以使回调在跟踪事件通知时接收到一个额外的上下文字符串。 | |
void ns3::Config::ConnectWithoutContext (std::string path, const CallbackBase &cb) | |
此函数将尝试查找与输入路径匹配的所有跟踪源,然后将输入回调连接到它们。 | |
void ns3::Config::Disconnect (std::string path, const CallbackBase &cb) | |
此函数撤消Config :: ConnectWithContext的工作。 | |
void ns3::Config::DisconnectWithoutContext (std::string path, const CallbackBase &cb) | |
此函数撤消Config :: Connect的工作。 | |
Ptr< Object > ns3::Config::GetRootNamespaceObject (uint32_t i) | |
请求的根命名空间对象 | |
uint32_t ns3::Config::GetRootNamespaceObjectN (void) | |
注册的根命名空间对象的数量。 | |
Config::MatchContainer ns3::Config::LookupMatches (std::string path) | |
包含与输入路径匹配的所有对象的容器。 | |
void ns3::Config::RegisterRootNamespaceObject (Ptr< Object > obj) | |
每个根对象在路径匹配期间用作Config :: Connect和Config :: Set的路径的根。 | |
void ns3::Config::Reset (void) | |
Reset the initial value of every attribute as well as the value of | |
every global to what they were before any call to SetDefault and SetGlobal. | |
将每个属性的初始值以及每个全局的值重置为在调用SetDefault和SetGlobal之前的值。 | |
void ns3::Config::Set (std::string path, const AttributeValue &value) | |
此函数将尝试查找与输入路径匹配的属性,然后将其值设置为输入值。 | |
void ns3::Config::SetDefault (std::string name, const AttributeValue &value) | |
此方法覆盖匹配属性的初始值。 此方法不能失败:如果输入属性名称或值无效,它将崩溃。 | |
bool ns3::Config::SetDefaultFailSafe (std::string name, const AttributeValue &value) | |
如果值设置成功,则为true,否则为false。 | |
void ns3::Config::SetGlobal (std::string name, const AttributeValue &value) | |
此方法等同于GlobalValue :: Bind | |
bool ns3::Config::SetGlobalFailSafe (std::string name, const AttributeValue &value) | |
如果可以设置GlobalValue,则为true。 | |
void ns3::Config::UnregisterRootNamespaceObject (Ptr< Object > obj) | |
此函数撤消Config :: RegisterRootNamespaceObject的工作。 |
# 用法实例
# Connect 函数的用法:
第二个参数是回调函数,回调函数的参数根据第一个参数的属性来设置。需要注意的是,第二个参数所设置的回调函数,其第一个参数是 string 类型的 context。
Config::Connect ("/NodeList/*/DeviceList/*/Mac/MacTx", MakeCallback (&DevTxTrace)); | |
Config::Connect ("/NodeList/*/DeviceList/*/Mac/MacRx", MakeCallback (&DevRxTrace)); | |
Config::Connect ("/NodeList/*/DeviceList/*/Phy/State/RxOk", MakeCallback (&PhyRxOkTrace)); | |
Config::Connect ("/NodeList/*/DeviceList/*/Phy/State/RxError", MakeCallback (&PhyRxErrorTrace)); | |
Config::Connect ("/NodeList/*/DeviceList/*/Phy/State/Tx", MakeCallback (&PhyTxTrace)); | |
Config::Connect ("/NodeList/*/DeviceList/*/Phy/State/State", MakeCallback (&PhyStateTrace)); | |
void | |
DevTxTrace (std::string context, Ptr<const Packet> p) | |
{ | |
if (g_verbose) | |
{ | |
std::cout << " TX p: " << *p << std::endl; | |
} | |
} | |
void | |
DevRxTrace (std::string context, Ptr<const Packet> p) | |
{ | |
if (g_verbose) | |
{ | |
std::cout << " RX p: " << *p << std::endl; | |
} | |
} | |
void | |
PhyRxOkTrace (std::string context, Ptr<const Packet> packet, double snr, WifiMode mode, enum WifiPreamble preamble) | |
{ | |
if (g_verbose) | |
{ | |
std::cout << "PHYRXOK mode=" << mode << " snr=" << snr << " " << *packet << std::endl; | |
} | |
} |
# ConnectWithoutContext 的用法:
第二个参数是回调函数,参数的设置依赖与第一个参数设置的属性。与 Connect 函数不同的是,这里的回调函数的第一个参数没有 string 类型的 context。
Config::ConnectWithoutContext ("/NodeList/0/DeviceList/*/Phy/MonitorSnifferRx", MakeCallback (&MonitorSniffRx)); | |
void MonitorSniffRx (Ptr<const Packet> packet, uint16_t channelFreqMhz, | |
uint16_t channelNumber, uint32_t rate, | |
WifiPreamble preamble, WifiTxVector txVector, | |
struct mpduInfo aMpdu, struct signalNoiseDbm signalNoise) | |
{ | |
g_samples++; | |
g_signalDbmAvg += ((signalNoise.signal - g_signalDbmAvg) / g_samples); | |
g_noiseDbmAvg += ((signalNoise.noise - g_noiseDbmAvg) / g_samples); | |
g_rate = rate; | |
g_channelNumber = channelNumber; | |
} |
# SetGlobal 的用法:
这与 SetGlobalFailSafe 函数的用法类似。设置全局值。
Config::SetGlobal ("SimulatorImplementationType", StringValue (m_simulatorType)); |
# SetDefault 函数的用法:
这与 SetDefaultFailSafe 函数用法类似。
Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0")); | |
// disable fragmentation | |
Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2200")); |
# Set 函数的用法:
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 (ackTimeout))); | |
Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/CtsTimeout", | |
TimeValue (MicroSeconds (ctsTimeout))); | |
Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/Rifs", | |
TimeValue (MicroSeconds (rifs))); | |
Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/BasicBlockAckTimeout", | |
TimeValue (MicroSeconds (basicBlockAckTimeout))); | |
Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/CompressedBlockAckTimeout", | |
TimeValue (MicroSeconds (compressedBlockAckTimeout))); |