概述
Veins的源代码零零碎碎的看了比较久了,一直都没有系统的看;今天看了一天,通过追踪Tkenv输出结果,简单粗略的梳理一下Veins收发数据的流程(假设A节点发送一个数据给B节点),仅供大家参考,同时欢迎交流:
=======A‘s Part======
1. A节点应用层产生数据E,调用sendDelayedDown函数将E发送给MAC层;
2. 在收到E后,MAC层将E封装层MAC帧;通过CSMA/CA机制进行信道竞争,得到nextMacEvent并初始化自消息,准备在一定时延后发送给PHY层;在MAC层调用sendDelayed之前调用phy->setRadioState()函数,通知PHY层进行 接收/发送 模式转换;PHY层模式转换完成后,向MAC发送控制消息(SendControlToMac函数);MAC层在完成前面的过程后,调用SendDelayed函数将数据帧发送给PHY层;
3. PHY层的handleUpperMessage函数在收到MAC发来的帧后,将其封装层PHY层的帧(Airframe),然后调用sendToChannel将帧发往信道;
4. sendToChannel函数通过遍历所有和A节点PHY层连接的gate,将帧发往每一个gate对应的PHY层.
=======B’s Part======
1. B的PHY层handleMessage函数在收到A发送的Airframe后,进一步调用handleAirFrame函数进行处理;
2. handleAirFrame函数分三个状态来处理收到的Airframe (状态之间的转换通过触发自消息实现 ):
START_RECEIVE=>handleAirFrameStartReceive
RECEIVING=>handleAirFrameReceiving
RECEIVING=>handleAirFrameEndReceive
第一个状态,会调用filterSignal函数,该函数通过相应的信道模型来计算信号的衰减;第二个状态,调用processSignal函数,该函数同样通过三个状态来处理Airframe:NEW=>processNewSignal; EXPECT_HEADER=>return processSignalHeader; EXPECT_END=>return processSignalEnd. (第一个状态中利用前面计算的衰减来计算接收功率,并判断是否接收该数据包;第三个状态调用phy->sendUp函数将处理好的数据向上发送给MAC层)。
3. B的MAC层handleLowerMsg函数在收到PHY来的数据后,首先进行解封装,然后发送给应用层;至此,A--->B数据包收发流程基本完成。
NOTE:
a. 以上过程中,只写出了最基本的流程,函数的调用关系比较复杂,有时候会调用父类(如BasePhyLayer)的方法,有时候子类(如PhyLayer80211p)又会重写父类的函数;要想理清楚调用关系,建议使用eclipse中的工具来辅助查看。
b. MAC层想要和PHY层进行交互(例如在MAC层中需要通知PHY层进行 接收/发送 状态转换),需要定义相关的接口类(如Class Mac80211pToPhy11pInterface),然后让MAC类和PHY类都去继承该接口类,并在MAC类中加入成员Mac80211pToPhy11pInterface *phy11p ;同时,在MAC类初始化的时候,调用phy11p = FindModule<Mac80211pToPhy11pInterface*>::findSubModule(getParentModule()); 这样,phy11p就可以直接调用Mac80211pToPhy11pInterface中的成员函数,对PHY进行操作了。<这一点是怎么实现的,还没完全弄懂,属于底层部分!>
最后
以上就是冷酷汽车为你收集整理的Veins 数据包收发基本流程简单总结的全部内容,希望文章能够帮你解决Veins 数据包收发基本流程简单总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复