资源共享分类
通信信号 图像语音 神经网络 智能优化 控制器 数值仿真 数学建模 其他专业

微信:HuangL1121
Q Q:1224848052
团队:嘉兴麦特莱博软件开发工作室
地址:嘉兴港区
 
通信信号
MATLAB代做|IEEE802.11 CSMA/CA AdHoc Network
来源:本站    日期:2019/8/7    浏览量:126  

功能描述:

%%---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/

微信扫一扫:


   上一篇: MATLAB代做|聚类层次分类簇算法的MATLAB源码    下一篇:    
   相关阅读
· MATLAB代做|FPGA代做|simulink代做—— 2020/7/14
· MATLAB代做|FPGA代做|simulink代做—— 2020/5/30
· MATLAB代做|FPGA代做|simulink代做—— 2020/5/30
· MATLAB代做|FPGA代做|simulink代做—— 2020/2/1
· MATLAB代做|FPGA代做|simulink代做—— 2019/12/11
· MATLAB代做|FPGA代做|simulink代做—— 2019/12/11
· MATLAB代做|FPGA代做|simulink代做—— 2019/12/11
· Alexnet网络结构 2019/11/20
· MATLAB代做|FPGA代做|simulink代做—— 2019/9/15
· MATLAB代做|FPGA代做|simulink代做—— 2019/8/29
Copyright 2017-2024 © 嘉兴麦特莱博软件开发工作室
  • 网站备案号:浙ICP备18008591号-1