功能描述:
%%---IEEE802.11 CSMA/CA AdHoc Network------%%
% close all;
% clear all;
for M = 2;
%M=5; %无线节点数量
Counter=0;%数据包发送成功计算器
Delay=0;
PacketResendingRate=0; %数据包重发率
TotalTimeInSeconds=200;%总仿真时间,单位:秒
Resend = zeros(1,M);
BER=10^(-6);%误码率
SendTime = zeros(1,M);%数据包发送时间向量
ChannelBusy = 0;
Start = 0;
Collition = 0;
DeferenceTime = 0; %发送完成时间
Throughput = 0;
Throughput_Result = zeros(1,TotalTimeInSeconds);
PacketResendingRate_Result = zeros(1,TotalTimeInSeconds);
Delay_Result = zeros(1,TotalTimeInSeconds);
ArrivalTime = 1:M; %新数据包到无线节点发送缓冲区的时间
PacketLength = 1:M; %到无线节点发送缓冲区的新数据包大小
HasPacket = zeros(1,M);
CW = 1:M;
BackoffTimer = 1:M;
PacketBuff = zeros(M,5001); %无线节点发送缓冲区各数据包大小矩阵
CollitionStations = zeros(1,M+1); %冲突站点号向量
PhyRate = 2*10^6; %物理层数据率=2Mbit/s
SlotTime = 20*10^(-6); %时隙间隔=20us
TotalTime = TotalTimeInSeconds/SlotTime; %总仿真时间,单位:slot
SIFS = 0.5; %SIFS=0.5*slot,10us
DIFS = 2.5; %DIFS=2.5*slot,50us
ACK = 14*8/(PhyRate*SlotTime); %ACK大小,单位:slot
AverageArrivalTime = 110; %slots
AveragePacketLength = 50; %slots
CurBufferSize = zeros(1,M); %当前发送帧长
Buffer_Threshold = 8*10^6/(PhyRate*SlotTime);%AP最大缓冲区大小
%初始化
for i = 1:M
ArrivalTime(i) = ExpDis(AverageArrivalTime); %初始化到达时间
PacketLength(i) = 50;%初始化分组长度
CW(i) = 32; %竞争窗口,CW = 32 slots
BackoffTimer(i) = 1200; %退避时间用 1200 slots来代表无穷大
end
for t = 1:TotalTime
for i = 1:M
%更新发送缓冲区
if t == ArrivalTime(i)
%目前不能发送,push分组进PackeBuff,修改退避计数器
if CurBufferSize(i) < Buffer_Threshold - PacketLength(i)
PacketBuff = Push(PacketBuff,i,PacketLength(i));
%Push新数据包
CurBufferSize(i) = CurBufferSize(i) + PacketLength(i);
HasPacket(i) = 1;
if BackoffTimer(i) == 1200
BackoffTimer(i) = RandSel(CW(i));%退避计数器达到最大1200时,重置退避计数器
end
end
ArrivalTime(i) = ExpDis(AverageArrivalTime) + PacketLength(i) + t;
%下一个数据包的到达时间
PacketLength(i) = 50;
%下一个数据包的大小
end
end
for i = 1:M
if HasPacket(i) == 1 & ChannelBusy == 0 %PackeBuff中有数据包发送并且信道空闲
if BackoffTimer(i) == 0 %退避时间=0则发送
CollitionStations = Add(CollitionStations,i);%加入冲突站点序列中
if Resend(i)==0 ; %第一次发送
SendTime(i)=t+DIFS;
end
Start = 1;
else
BackoffTimer(i) = BackoffTimer(i) - 1;%退避时间=0则 退避时间-1
end
end
end
if Start == 1%信道改为忙碌
ChannelBusy = 1;
n = CollitionStations(1);
if n == 1%信道中只有一个站点发送数据则为正常发送情况
DeferenceTime = floor(t + SIFS + DIFS + ACK + PacketBuff(CollitionStations(2),2));
%PacketBuff(CollitionStations(2),2)数据长度
%成功发送时间
Collition=0;%没有碰撞
else
DeferenceTime = floor(t + DIFS + MaxLength(PacketBuff,CollitionStations));
%发生碰撞要加上最大的冲突数据时间段
Collition=1;%发生碰撞
end
Start=0;%信道恢复空闲
end
if t == DeferenceTime & ChannelBusy == 1%信道忙的时候达到站点的等待时间
if Collition == 0
n = CollitionStations(2);
PER=1-(1-BER)^(PacketBuff(n,2)*PhyRate*SlotTime);
AckER=1-(1-BER)^(ACK*PhyRate*SlotTime);
if rand>=PER & rand>=AckER;
PacketLost=0;%无错误
else
PacketLost=1;
end
end
if Collition == 0 & PacketLost==0%发送成功
n = CollitionStations(2);
CurBufferSize(n) = CurBufferSize(n) - PacketBuff(n,2);
Throughput = Throughput + PacketBuff(n,2) * SlotTime * PhyRate;
PacketBuff = Pop(PacketBuff,n);
Resend(n)=0;
Delay = Delay+t-SendTime(n);
Counter=Counter+1;
CW(n) = 32;
k = PacketBuff(n,1);
if k ==0%如果没有数据等待发送,将HasPacke置0,BackoffTimer置Max
HasPacket(n) = 0;
BackoffTimer(n) = 1200;
else%还有数据分发送,修改碰撞计数器
BackoffTimer(n) = RandSel(CW(n));
end
else%发送失败
PacketResendingRate=PacketResendingRate+1;
n = CollitionStations(1);
for i = 1:n
j = CollitionStations(i+1);
CW(j) = Increase(CW,j);
BackoffTimer(j) = RandSel(CW(j));
Resend(j)=1;
end
end
CollitionStations = zeros(1,M+1);
DeferenceTime = 0;
ChannelBusy = 0;
Collition = 0;
end
if mod(t,1/SlotTime) == 0%时间为整数
s = t * SlotTime;
s = round(s);
Throughput_Result(s) = Throughput;
if Counter~=0
Delay_Result(s)=Delay*SlotTime/Counter;%平均时延
else
Delay_Result(s)=0;
end
PacketResendingRate_Result(s) = PacketResendingRate;
Throughput = 0;
PacketResendingRate=0;
Delay = 0;
Counter=0;
end
end
savefile = sprintf('Packet Resending Rate M=(%d).txt',M);
fid = fopen(savefile,'a+');
fprintf(fid,'%1.6f ',PacketResendingRate_Result);
fclose(fid);
savefile = sprintf('Throughput M=(%d).txt',M);
fid = fopen(savefile,'a+');
fprintf(fid,'%1.6f ',Throughput_Result);
fclose(fid);
savefile = sprintf('Average Delay M=(%d).txt',M);
fid = fopen(savefile,'a+');
fprintf(fid,'%1.6f ',Delay_Result);
fclose(fid);
end
联系:highspeedlogic
QQ :1224848052
微信:HuangL1121
邮箱:1224848052@qq.com
网站:http://www.mat7lab.com/
网站:http://www.hslogic.com/
微信扫一扫:
|