NS2中的WirelessPhyExt工作机制研究
@NS2开发笔记
1.概述
WirelessPhyExt是WirelessPhy的扩展,是直接从WirelessPhy继承而来的,但是在WirelessPhyExt中,将物理层按照物理层汇聚过程(Physical Layer Convergence Procedure,PLCP)子层和物理媒体依赖(Physical Medium Dependent,PMD)子层来处理。
- PLCP:直接与物理层接触,起承上启下的作用;
- PMD:直接与无线信道接触,将数据通过天线传输及接收。
2.sendDown过程
上面给出了整个发送数据的处理流程的流程图。
发送过程的核心是根据当前物理层的几种状态:
Phystate={TXing,RXing,PreRXing,SEARCHING}
分别处理,
- TXing:发送状态
- RXing:接收状态,接收数据部分,可以发送但是将丢弃正在接收的数据
- PreRXing:预接收状态,接收前导码和PLCP头,可以发送,但是将丢弃正在接收的前导码和PLCP头
- SEARCHING:侦听状态,可以接收或者发送
3.sendUp过程
上面是整个接收过程的流程图,其中PreambleCapture和DataCapture分别表示接收前导码期间开始下一次前导码的接收(放弃正在接收的前导码)和接收数据期间开始下一次数据接收(放弃当前正在接收的数据)。这两个功能是需要从tcl脚本配置变量PreambleCaptureSwitch_;DataCaptureSwitch_;
来打开或者关闭的,1表示打开该功能,0表示关闭。
当物理层处在PreRxing和Rxing状态时,再次检测到信号时,首先将当前的信号作为正在接收的信号的干扰,判断当前的SINR能否满足对应的调制方式的解码阈值。如果仍然满足,说明当前收到的信号很小,不会影响正在接收的信号,因此继续正在接收的操作,而丢弃当前收到的信号;反之说明当前信号能量已经对正在接收的信号造成干扰导致无法正确解码,此时将放弃正在接收的操作,转而接收当前的信号。
此时,计算当前信号的SINR,与对应的阈值(PreRxing状态下对应SINR_PreambleCapture_
,Rxing状态下对应SINR_DataCapture_
)相比,如果大于阈值,那么可以进行捕获,接下来的流程和Searching状态下接收数据包的处理流程一致,这里不在详述。
在接收流程中,同样也是按照物理层所处的状态进行不同的处理:
- TXing:发送状态,无法接收
- RXing:接收状态,接收数据部分,后面收到的信号会对正在接收的信号造成干扰,干扰足够强时导致无法接收,如果此时打开了数据捕获开关
DataCaptureSwitch_
,则可以尝试接收后面到达的信号 - PreRXing:预接收状态,接收前导码和PLCP头,后面收到的信号会对正在接收的信号造成干扰,干扰足够强时导致无法接收,如果此时打开了数据捕获开关
PreambleCaptureSwitch_
,则可以尝试接收后面到达的信号 - SEARCHING:侦听状态,可以接收或者发送
4.功率监测模块
4.1.初始状态
初始状态下,功率水平等于噪声水平:
powerLevel = wirelessPhyExt->noise_floor_;
4.2.功率水平更新
在发送或者接收信号时会通过调用PowerMonitor::recordPowerLevel(signalpower,duration)
函数来更新powerLevel,实际上就是将在持续期内将信号功率加到powerLevel上,而在持续期结束后在用powerLevel减去信号功率,以此来模拟信号在收发过程中空口功率变化。
4.3.信干燥比计算
由于每次接收(或者发送)都会动态的更新powerLevel,按照4.2描述的规则,powerLevel表示的是发送或者接收的总功率,对接收而言,总功率减去有效信号功率就是干扰和噪声功率,因此SINR通过下面的方法计算:
SINR = Pr/(getPowerLevel()-Pr)
其中,Pr为接收到的有效信号功率。
5.物理层与MAC层的交互
5.1.发送定时器
在WirelessPhyExt中sendDown函数将数据发往信道前会先启动一个发送定时器,超时时间为发送时间,定时器超时后自动调用WirelessPhyExt::handle_TXtimeout()
,该函数的作用是调用上层的函数handleTXEndIndication()
通知上层(MAC)发送完成,同时将物理层状态设置为SEARCHING
5.2.预接收定时器
在WirelessPhyExt中sendUp函数中,物理层一旦接收到Preamble和PLCP Header之后就会进入PreRxing状态,此时会启动一个PreRxTimer,超时时间为PLCP Header的持续期,超时之后自动调用WirelessPhyExt::handle_PreRXtimeout()
,表示PLCP头接收结束,函数当中将再次判断接收信噪比和解调阈值的关系,确认数据主体部分是否可以正确解调,如果可以正确解调,将把物理层的状态切换到RXing,同时启动RxTimer,超时时间为接收时间-HeaderDuration,并调用上层的函数handleRXStartIndication()
通知上层(MAC)开始接收数据主体部分。
5.3.接收定时器
在WirelessPhyExt的WirelessPhyExt::handle_PreRXtimeout()
函数中,当PLCP Header接收完成之后启动RxTimer(因为调制方式包含在PLCP Header中,所以先接收并解调PCLP Header),超时之后自动调用WirelessPhyExt::handle_RXtimeout()
,该函数通过调用上层的函数handleRXEndIndication()
通知上层接收完成,并将接收到的数据上传给上层(MAC),同时将接收缓冲清空,将接收功率重置。