记录NS3中报错的尝试解决之路【AODV- ETX测试example出现的错误】

发布于:2022-10-21 ⋅ 阅读:(297) ⋅ 点赞:(0)

文件名ideal-8node-floor-v01-00.cc
终端输入./ns3 run ideal-8node-floor-v01-00后报错
在这里插入图片描述
bug:msg="TraceSource 'TxErrHeader' is obsolete, with no fallback: Depending on the failure type, use the NAckedMpdu trace, the DroppedMpdu trace or one of the traces associated with TX timeouts.", +0.000000000s -1 file=/Users/mengyuanchen/Software/NS3/ns-allinone-3.36.1/ns-3.36.1/src/core/model/type-id.cc, line=1166 libc++abi: terminating Command 'build/scratch/ns3.36.1-ideal-8node-floor-v01-00-debug' died with <Signals.SIGABRT: 6>.
翻译:msg=“TraceSource’TxErrHeader’已过时,没有回退:根据故障类型,使用NAckedMpdu跟踪、DroppedMpdu或与TX超时相关的跟踪之一。

  • 猜测是TraceSource的问题,但是啥也不懂,去学习一下
  • 回调机制
    ~核心:通过传参的形式将函数的地址传递给其他函数,然后在其他函数中使用函数指针调用该函数
/*test.h*/定义该头文件
#pragma once
#include<iostream>
using namespace std;
typedef int(*callbackfun)(int, int,int); //函数的指针*callbackfun,该指针指向的函数的返回值为int型,且需要输入三个int型参数
void Add(callbackfun pf, int a=0, int b=0,int c=0)
{
	cout << pf(a, b,c) << endl;
}
/*test.cpp*/
#include"test.h" //包含该头文件
int add(int a, int b,int c)
{
	return a + b;
}
void main()
{
	Add(add, 1, 2);
}

个人理解:回调函数仅仅提供了外部的一个接口,具体的函数体内部写了什么还是要靠外部。
举例:对于一个快速排序函数,其中必然需要包含比较大小。但问题是:此时并不知道要比较的是何类型的数据(整型,浮点型,字符)。于是,需要为每类数据制作一个不同的排序函数。但更通用的是:在函数参数中列出一个回调函数地址,并通知调用者:自己准备一个比较函数,其中包含两个指针类参数,函数需要比较这两个指针所指向的数据的大小,并由函数返回值说明比较结果。排序函数借调用者提供的比较函数来比较大小,借函数指针传递参数,可以全然不管所比较的的数据类型。最后被调用者回调调用者的排序函数得到最终序列。

  • Tracing系统
    ~Tracing系统主要分为三个部分:Tracing SourcesTracing Sinks和将Tracing Sources和Tracing Sinks关联起来的方法。
    ~Tracing Sources提供信息,Tracing Sinks消费信息。针对不同用户给出的不同的Tracing Sinks代码来处理Tracing Sources,得到的结果是不同的;因此用户可以根据个人需求设计自己的Tracing Sinks以便得出不同的结果。
    以third.cc为例,通过定义一个Tracing Sinks来输出移动节点的位置变化信息。
    原始third.cc的运行结果:仅仅描述了节点间传输信息的过程
    在这里插入图片描述
    更改步骤

  • 增加命名空间

using namespace std;
  • 定义Trace Sinks
void CourseChange(string context, Ptr<const MobilityModel> model){ //定义CourseChange函数(Tracing Sinks)
  Vector position = model->GetPosition();
  NS_LOG_UNCOND(context << "x = " << position.x << "y = " << position.y);
}
  • 关联Trace Sinks和Trace Sources
//使用Config的静态成员函数Connect()来关联Trace Sinks和Trace Sources
  ostringstream oss;
  oss << "/NodeList" << wifiStaNodes.Get(nWifi - 1) -> GetId() << "/$ns3::MobilityModel/Coursechange";
  // /后面紧跟的是命名空间,这里的NodeList是仿真中使用的节点的列表
  // Get()函数用于获取节点
  // GetId()函数用于获取该节点的索引
  // $,当程序遇到·这个符号时会调用GetObject函数返回一个类型为MobilityModel的对象,而MobilityModel中有一个名叫CourseChange的属性,也就是需要跟踪的Trace Sources
  Config::Connect(oss.str(), MakeCallback(&CourseChange))
  // Config::Connect会从系统中选取用户所需要使用的Trace Sources
  // MakeCallback函数将Coursechange作为回调函数,当Trace Sources发生变化时,该函数就会被调用
  • 运行报错
    在这里插入图片描述
    报错!!!看到曙光了!!继续学习Tracing系统
    https://www.nsnam.org/doxygen/db/ddb/classns3_1_1_mobility_model.html里看到CourseChange(TraceSources)依旧在使用,说明没有被弃用。在这里插入图片描述
    玄学出现了:本人怎么修改,跑出来都报错。按照这位博主https://blog.csdn.net/qq_31648921/article/details/114037279?spm=1001.2101.3001.6650.11&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-11-114037279-blog-117752974.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-11-114037279-blog-117752974.pc_relevant_3mothn_strategy_recovery的,把其中的代码复制进去,就成功了????!!!!早知道我早点复制啊🤔
    在这里插入图片描述
  • 如何确定Trace Sources
    ns-3/Modules/mobility/mobilitymodel/trace
  • 如何确定Trace Sinks
    两种方法:若使用使用Ptr<Node>来将callback Connect 到 trace格式为Ptr<Object> theObject = wifiStaNodes.Get (nWifi - 1); theObject->TraceConnectWithoutContext ("CourseChange", MakeCallback (&CourseChange)); 若使用config格式为Config::Connect (oss.str (), MakeCallback (&CourseChange));

回归正题
去报错的文件,对应的行查看报错原因:当属性或trace source弃用时,仿真失败,会提示该错误。所以TxErrHeader是被弃用了,接下来找到哪里调用这个trace source了,然后修改。
在这里插入图片描述
找了一下午+一晚上,也没找到我的代码里有哪里调用了TxErrHeader
可能是有默认设置
anyway,我放弃了,以后再解决吧!

本文含有隐藏内容,请 开通VIP 后查看