概述
记一次深度的踩坑,在这个坑中摸爬滚打了几天之后,发现进错坑了。留给后续使用veins做车联网仿真的入坑者,一点启示。
原来的目的:
我本来是打算实现RSU和Car有不同的通信距离。在修改了ini文件中的maxInterfDist
和 drawMaxIntfDist
之后通过仿真页面观察到,车辆和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
是如果如何工作起来的。
最后
以上就是乐观猫咪为你收集整理的Veins源码阅读—connectionManager模块的全部内容,希望文章能够帮你解决Veins源码阅读—connectionManager模块所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复