NS3——trace分类及trace记录移动位置信息

本文介绍了NS3中TracedCallback和TracedValue两种回调签名类型,详细讲解了它们的使用场景和区别。TracedCallback常用于分组事件,如收发、丢失,而TracedValue则关注数值变量的变化,如TCP接收窗口大小。文中还通过实例展示了如何追踪节点位置信息的变化,以及在脚本中设置回调函数的方法。

在之前对first.cc例子更改学习trace的时候,用到的回调就是下面的回调,回调trace包含在元信息中。如果想在脚本中用回调的话,就需要在回调所在类GetTypeId()方法中添加回调的信息,如下所示:
在这里插入图片描述
NS3中根据回调函数签名格式的不同将回调分成两类

1、TracedCallback签名类型

主要用于与分组相关行为事件(分组收发、丢失等)
这种签名格式的返回值是void,形参最多8个。这些trace只是用来读取传入的参数的,所以返回值设置成void。比如上面的例子用到的就是这类回调。
签名格式的命名通常是"ns3::<类名称或命名空间>::<typedef 名>"
比如"ns3::Packet::TracedCallback",“ns3::Ipv4L3Protocol::TxRxTracedCallback”
在这里插入图片描述

2、TracedValue签名类型

主要用于一个数值变量的大小变化的事件(拥塞窗口改变、队列中分组数目改变)
是TracedCallback类型的一个子集,因为跟踪一个变量的变化只需要新旧数值两个参数,用不到8个参数,所以才衍生出TracedValue这个类型。TracedValue类在src/core/model/traced-value.h中定义,内部就是只有两个参数的TracedCallback对象。
例子:
1)、TCP接收窗口的回调:
tcp-socket-base.h文件下的类TcpSocketBase中的trace变量:

  TracedValue<uint32_t> m_rWnd;        //!< Receiver window (RCV.WND in RFC793)

对应的trace信息:

TypeId
TcpSocketBase::GetTypeId (void)
{
  static TypeId tid = TypeId ("ns3::TcpSocketBase")
    .AddTraceSource ("RWND",
                     "Remote side's flow control window",
                     MakeTraceSourceAccessor (&TcpSocketBase::m_rWnd),
                     "ns3::TracedValueCallback::Uint32")
}

这里的Uint32是src/core/model/traced-value.h中TracedCallback名字空间中定义的函数指针,指向的函数类型返回值void,接收两个32位的参数。
在这里插入图片描述
除了这个函数指针之外TracedCallback名字空间下还定义了其他的一些常用函数指针,用途就是接收不同类型的新旧数值。
在这里插入图片描述
2)、检测节点位置信息改变:
mobility-model.h文件下的MobilityModel移动模型相关类中有如下回调(为什么这里要用ns3命名空间为前缀呢?)

ns3::TracedCallback<Ptr<const MobilityModel> > m_courseChangeTrace;
TypeId 
MobilityModel::GetTypeId (void)
{
  static TypeId tid = TypeId ("ns3::MobilityModel")
    .SetParent<Object> ()
    .SetGroupName ("Mobility")
    .AddTraceSource ("CourseChange", 
                     "The value of the position and/or velocity vector changed",
                     MakeTraceSourceAccessor (&MobilityModel::m_courseChangeTrace),
                     "ns3::MobilityModel::TracedCallback")
  ;
  return tid;
}

具体的移动模型,都是MobilityModel的子类,在位置改变的时候子类会调用父类的这个函数,因此回调绑定的函数被调用

void
MobilityModel::NotifyCourseChange (void) const
{
  m_courseChangeTrace (this);
}

在third.cc脚本中,创建一个函数,并设置把这个函数与位置改变回调联系起来

  void
  CourseChange (std::string context, Ptr<const MobilityModel> model)
  {
    Vector position = model->GetPosition ();
    NS_LOG_UNCOND (context << 
      " x = " << position.x << ", y = " << position.y<<" time:"<<Simulator::Now().GetSeconds());
  }

在main函数最后Run之前插入下面一段话,这是为最后一个wifi节点绑定回调函数。这里也展示了C++字符串拼接的方法,也可应用于int转string。

 std::ostringstream oss;
  oss << "/NodeList/"
      << wifiStaNodes.Get (nWifi - 1)->GetId ()
      << "/$ns3::MobilityModel/CourseChange";

  Config::Connect (oss.str (), MakeCallback (&CourseChange));

运行结果:

the node size:3
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10, y = 0 time:0
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.3841, y = 0.923277 time:0.264586
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.2049, y = 1.90708 time:0.726624
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.8136, y = 1.11368 time:1.21727
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.8452, y = 2.11318 time:1.55391
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.9797, y = 3.10409 time:1.90586
At time 2s client sent 1024 bytes to 10.1.2.4 port 9
For P10 , At +2017955049.0ns, node 10.1.2.4 receive a packet from 10.1.3.3
At time 2.01796s server received 1024 bytes from 10.1.3.3 port 49153
/NodeList/7/$ns3::MobilityModel/CourseChange x = 11.3273, y = 4.04175 time:2.2186
/NodeList/7/$ns3::MobilityModel/CourseChange x = 12.013, y = 4.76955 time:2.63984
/NodeList/7/$ns3::MobilityModel/CourseChange x = 12.4317, y = 5.67771 time:2.95688
At time 3s client sent 1024 bytes to 10.1.2.4 port 9
For P10 , At +3005254603.0ns, node 10.1.2.4 receive a packet from 10.1.3.3
At time 3.00525s server received 1024 bytes from 10.1.3.3 port 49153
/NodeList/7/$ns3::MobilityModel/CourseChange x = 11.4607, y = 5.91681 time:3.22047
/NodeList/7/$ns3::MobilityModel/CourseChange x = 12.0155, y = 6.74878 time:3.54923
/NodeList/7/$ns3::MobilityModel/CourseChange x = 13.0076, y = 6.62336 time:3.87834
At time 4s client sent 1024 bytes to 10.1.2.4 port 9
For P10 , At +4005254604.0ns, node 10.1.2.4 receive a packet from 10.1.3.3
At time 4.00525s server received 1024 bytes from 10.1.3.3 port 49153
/NodeList/7/$ns3::MobilityModel/CourseChange x = 12.6285, y = 5.698 time:4.14201
/NodeList/7/$ns3::MobilityModel/CourseChange x = 13.32, y = 4.97559 time:4.50591
/NodeList/7/$ns3::MobilityModel/CourseChange x = 13.1134, y = 3.99715 time:4.79762
/NodeList/7/$ns3::MobilityModel/CourseChange x = 13.8359, y = 4.68851 time:5.26802
/NodeList/7/$ns3::MobilityModel/CourseChange x = 13.5953, y = 3.71789 time:5.55539
/NodeList/7/$ns3::MobilityModel/CourseChange x = 12.7595, y = 4.26688 time:5.8998
/NodeList/7/$ns3::MobilityModel/CourseChange x = 11.7629, y = 4.34913 time:6.33086
/NodeList/7/$ns3::MobilityModel/CourseChange x = 11.2292, y = 5.19485 time:6.65619
/NodeList/7/$ns3::MobilityModel/CourseChange x = 10.2344, y = 5.09394 time:6.91098
/NodeList/7/$ns3::MobilityModel/CourseChange x = 9.3601, y = 4.60846 time:7.26228
/NodeList/7/$ns3::MobilityModel/CourseChange x = 8.40025, y = 4.32795 time:7.61601
/NodeList/7/$ns3::MobilityModel/CourseChange x = 9.14292, y = 4.99761 time:7.89798
/NodeList/7/$ns3::MobilityModel/CourseChange x = 9.08299, y = 5.99581 time:8.33373
/NodeList/7/$ns3::MobilityModel/CourseChange x = 8.26068, y = 5.42677 time:8.58405
/NodeList/7/$ns3::MobilityModel/CourseChange x = 8.35917, y = 6.42191 time:9.03936
/NodeList/7/$ns3::MobilityModel/CourseChange x = 7.66805, y = 7.14466 time:9.30208
/NodeList/7/$ns3::MobilityModel/CourseChange x = 6.71414, y = 6.84456 time:9.61913
/NodeList/7/$ns3::MobilityModel/CourseChange x = 6.42489, y = 7.80181 time:9.89537
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值