2. 接收端
2.1 物理层
发送断物理层有两个信号,一个是开始发送,一个是结束发送,两个信号成对出现,表示一个数据帧发送完成。接收端类似,一个开始接收,一个结束接收,两个信号成对出现,表示一个数据帧接收完成。在物理层分别由两个函数处理信号,PHY_SignalArrivalFromChannel()和PHY_SignalEndFromChannel()。前一个函数判断物理层当前状态,空闲或侦听中,则锁定信号,更改状态为接收中,开始接收;若当前状态为接收中,则丢弃准备接收的信号。第二个函数结束接收,将接收完整的数据帧向上层传递。仍以802.11协议为例
void Phy802_11SignalEndFromChannel(
Node* node,
int phyIndex,
int channelIndex,
PropRxInfo *propRxInfo)
{
PhyData *thisPhy = node->phyData[phyIndex];
PhyData802_11* phy802_11 = (PhyData802_11*) thisPhy->phyVar;
BOOL receiveErrorOccurred = FALSE;
assert(phy802_11->mode != PHY_TRANSMITTING);
if ((phy802_11->mode == PHY_RECEIVING)
&& (phy802_11->rxMsg == propRxInfo->txMsg))
{
Message* newMsg = NULL;
Phy802_11UnlockSignal(phy802_11);
//载波侦听,进入侦听状态
if (Phy802_11CarrierSensing(node, phy802_11) == TRUE)
{
Phy802_11ChangeState(node,phyIndex, PHY_SENSING);
}
//不载波侦听,进入空闲状态
else
{
Phy802_11ChangeState(node,phyIndex, PHY_IDLE);
}
if (!receiveErrorOccurred)
{
//复制消息
newMsg = MESSAGE_Duplicate(node, propRxInfo->txMsg);
//去除物理层首部
MESSAGE_RemoveHeader(
node, newMsg, sizeof(Phy802_11PlcpHeader), TRACE_802_11);
PhySignalMeasurement* signalMeaInfo;
MESSAGE_InfoAlloc(node,
newMsg,