Veins源码阅读—connectionManager模块

记一次深度的踩坑,在这个坑中摸爬滚打了几天之后,发现进错坑了。留给后续使用veins做车联网仿真的入坑者,一点启示。
原来的目的:
我本来是打算实现RSU和Car有不同的通信距离。在修改了ini文件中的maxInterfDistdrawMaxIntfDist之后通过仿真页面观察到,车辆和RSU的覆盖范围发生了变化,而且在通信过程中数据包传输的距离也正好是maxInterfDist 的范围。我们就错误的认为,这里就是实现RSU和Car不同通信范围的地方。然后就开始了深度踩坑之旅。
结论:
如果你要实现RSU和Car不同的通信范围,只需要修改他们mac层的发送功率即可。connectionManager模块仅仅是对他们直接的连接进行管理,即对哪些模块进行连接(网卡端口之间),哪些结点去掉连接。但是具体的数据包能不能收到,则是根据发送功率,接收功率进行确定的。仿真页面太迷惑人了,即使仿真过程中有数据包过去,也不一定真的接收到(因为功率问题)。具体的可以在仿真的过程中看具体的输出,在连接范围内只能收到AirFrame,但是在处理的过程中会发现并没有收到数据包。
然后我们就来看看connectionManager模块具体是做什么的?
connectionManager模块

  • ConnectionManager.ned

在这里插入图片描述
从上面的注释我们可以看出,管理协调所有节点之间的连接,并且动态的处理门的创建。因此它周期性的和移动模块和信道接入模块进行通信。
maxInterfDist 是任何传输的最大上界。

  • ConnectionManager.h&ConnectionManager.cc
    在这里插入图片描述
    头文件就定义了一个虚函数,计算最大的通信范围。
    在这里插入图片描述
    这里仅仅是读取ini文件中定义的最大通信范围,然后返回。
    这里介绍另一种写法,更具功率、频率等,使用自由空间衰落模型进行计算。不过这里的需要ned文件和头文件都需要做出相应的改动。
   double interfDistance;

    //the minimum carrier frequency for this cell
    double carrierFrequency = par("carrierFrequency").doubleValue();
    //maximum transmission power possible
    double pMax             = par("pMax").doubleValue();
    if (pMax <=0) {
        error("Max transmission power is <=0!");
    }
    //minimum signal attenuation threshold
    double sat              = par("sat").doubleValue();
    //minimum path loss coefficient
    double alpha            = par("alpha").doubleValue();

    //const
    double waveLength     = (BaseWorldUtility::speedOfLight()/carrierFrequency);

    //minimum power level to be able to physically receive a signal
    double minReceivePower = pow(10.0, sat/10.0);

    ccEV << "max interference distance:" << interfDistance << endl;

    return interfDistance;
  • BaseConnectionManager.h
    这个函数就是最重要的函数,这里仅介绍每个函数是干什么的。
    在这里插入图片描述
    首先在头文件中声明了一个网格坐标类,大概意思就是,将整个仿真背景根据最大传输距离划分为若干个网格,然后用有一个坐标来表示每一个网格。
    在这里插入图片描述
    这里是因为C++中没有hash set,新建了一个类来模拟hash set.

在这里插入图片描述
这里是主要的函数,很多函数之间是相互调用的关系。首先是initialize初始化的函数。然后就是从
在这里插入图片描述
ChannelAccess::receiveSignal函数开始,逐步进行调用,根据这个顺序,依次阅读源码的注释即可。
注:
在车联网的仿真中,这一块并不需要做出修改。只是能够帮助你理解Veins是如果如何工作起来的。

发布了32 篇原创文章 · 获赞 7 · 访问量 7573

猜你喜欢

转载自blog.csdn.net/Isaacddx/article/details/101161169