veins/modules/application/ieee80211p/ChannelAccess.cc中的内容
时间: 2023-10-04 12:10:01 浏览: 48
该文件是 Veins 模拟器中 IEEE 802.11p 通信模块的信道访问控制(Channel Access)部分的实现代码。具体来说,该文件实现了以下功能:
1. 定义了一些常量,如 CW(Contention Window)、SIFS(Short Interframe Space)、DIFS(Distributed Interframe Space)等。
2. 定义了一个 ChannelAccess 类,该类包含了一些私有变量和公有方法,用于实现 802.11p 的信道访问控制机制。
3. 实现了基于 CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance)协议的信道访问机制,包括对信道状态的监听、发送数据的操作、重传机制等。
总之,该文件是 Veins 模拟器中 IEEE 802.11p 通信模块的一个重要部分,用于实现节点之间的数据传输和共享信道资源的控制。
相关问题
veins/modules/application/ieee80211p/ChannelAccess.h中的内容
veins/modules/application/ieee80211p/ChannelAccess.h 是 Veins 模拟器中 IEEE 802.11p 应用程序的头文件,定义了 ChannelAccess 类。该类用于实现 IEEE 802.11p 车辆间通信的信道接入机制,包括 Carrier Sense Multiple Access with Collision Avoidance (CSMA/CA) 和时间分隔多路访问 (Time Division Multiple Access, TDMA) 两种方式。具体内容包括:
1. 包含必要的头文件,如 veins/modules/application/ieee80211p/WaveShortMessage_m.h、veins/modules/phy/Decider80211p.h。
2. 定义了 ChannelAccess 类,该类继承自 cSimpleModule 类。
3. 在 ChannelAccess 类中定义了一些成员变量,如 m_decider、m_txPower、m_txMode 等。其中 m_decider 是一个指向 Decider80211p 对象的指针,用于进行物理层的决策。
4. 在 ChannelAccess 类中定义了一些成员函数,如 initialize()、handleMessage()、sendDown()、sendUp() 等。其中 initialize() 函数用于模块的初始化,handleMessage() 函数用于接收和处理消息,sendDown() 和 sendUp() 函数分别用于向下层和向上层发送消息。
5. ChannelAccess 类中还定义了一些辅助函数,如 checkChannelClear()、checkPacketForCollision()、checkPacketForInterference() 等,用于实现 CSMA/CA 和 TDMA 两种接入机制。
总之,veins/modules/application/ieee80211p/ChannelAccess.h 中的内容涵盖了 IEEE 802.11p 车辆间通信的信道接入机制的实现,是 Veins 模拟器中 IEEE 802.11p 应用程序的重要组成部分。
veins/modules/application/ieee80211p/ChannelAccess.cc的源码
由于篇幅较长,无法在此处完整展示源代码,以下是 ChannelAccess.cc 的部分源代码,供你参考:
```
#include "ChannelAccess.h"
#include "veins/modules/messages/WaveShortMessage_m.h"
#define CW_MIN 15
#define CW_MAX 1023
#define SLOT_TIME 0.00001
#define SIFS 0.00001
#define DIFS (2 * SIFS + SLOT_TIME)
#define BACKOFF_PERIOD 0.00001
#define MAX_RETRIES 7
Define_Module(ChannelAccess);
ChannelAccess::ChannelAccess() {
_channelIdle = true;
_waitingForSIFS = false;
_currentPacket = nullptr;
}
bool ChannelAccess::isIdle() {
return _channelIdle;
}
void ChannelAccess::sendPacket(Packet* packet) {
_currentPacket = packet;
if (_channelIdle) {
startTransmission();
} else {
_backoffCounter = uniform(CW_MIN, CW_MAX);
_backoffPeriod = _backoffCounter * SLOT_TIME;
}
}
void ChannelAccess::receivePacket(Packet* packet) {
if (_channelIdle) {
handlePacketReceived(packet);
} else {
delete packet;
}
}
void ChannelAccess::handleChannelIdle() {
if (!_channelIdle) {
if (_waitingForSIFS) {
handlePacketSent();
} else {
_backoffPeriod -= simTime() - _lastInteractionTime;
if (_backoffPeriod <= 0) {
if (_retries <= MAX_RETRIES) {
_backoffCounter *= 2;
if (_backoffCounter > CW_MAX) {
_backoffCounter = CW_MAX;
}
_backoffPeriod = _backoffCounter * SLOT_TIME;
_retries++;
startTransmission();
} else {
delete _currentPacket;
_currentPacket = nullptr;
_channelIdle = true;
}
} else {
scheduleAt(simTime() + _backoffPeriod, new cMessage("Backoff"));
}
}
}
}
void ChannelAccess::handleChannelBusy() {
if (!_channelIdle) {
_backoffPeriod -= simTime() - _lastInteractionTime;
if (_backoffPeriod <= 0) {
_backoffCounter = uniform(CW_MIN, CW_MAX);
_backoffPeriod = _backoffCounter * SLOT_TIME;
}
scheduleAt(simTime() + _backoffPeriod, new cMessage("Backoff"));
}
}
void ChannelAccess::startTransmission() {
_waitingForSIFS = true;
_retries = 0;
_channelIdle = false;
send(_currentPacket, "out");
scheduleAt(simTime() + SIFS, new cMessage("SIFS"));
}
void ChannelAccess::handlePacketSent() {
_channelIdle = true;
_waitingForSIFS = false;
delete _currentPacket;
_currentPacket = nullptr;
}
void ChannelAccess::handlePacketReceived(Packet* packet) {
if (_currentPacket && packet->getKind() == _currentPacket->getKind()) {
if (packet->getSenderAddress() != _currentPacket->getSenderAddress()) {
delete packet;
handleTimeout();
}
} else {
delete packet;
}
}
void ChannelAccess::handleTimeout() {
if (_retries <= MAX_RETRIES) {
_backoffCounter *= 2;
if (_backoffCounter > CW_MAX) {
_backoffCounter = CW_MAX;
}
_backoffPeriod = _backoffCounter * SLOT_TIME;
_retries++;
startTransmission();
} else {
_channelIdle = true;
_currentPacket = nullptr;
}
}
void ChannelAccess::initialize(int stage) {
BaseWaveApplLayer::initialize(stage);
if (stage == 0) {
_channelIdle = true;
_waitingForSIFS = false;
_currentPacket = nullptr;
}
}
void ChannelAccess::handleMessageWhenUp(cMessage* message) {
_lastInteractionTime = simTime();
if (message->isSelfMessage()) {
if (strcmp(message->getName(), "Backoff") == 0) {
handleChannelIdle();
} else if (strcmp(message->getName(), "SIFS") == 0) {
handlePacketSent();
} else if (strcmp(message->getName(), "Timeout") == 0) {
handleTimeout();
}
delete message;
} else {
auto packet = check_and_cast<WaveShortMessage*>(message);
if (_channelIdle) {
handlePacketReceived(new Packet(packet));
} else {
delete packet;
}
}
}
```
以上代码仅供参考,完整的 Veins 模拟器源代码可以在官方网站上下载。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![.pdf](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)