【CSMA/CA有效接入】 IEEE802.15.4家庭网络高效节能的基于时隙CSMA/CA的有效接入算法matlab仿真

1.软件版本

matlab2013b

2.系统描述

        通过降低闲置的监听周期来减少能量损耗。同时,减少能量损耗通过减小每帧对等节点的overhead。这个接入方法基于对想要传输(want to transmit ,transmissions of frame bursts and traffic differentiation)的子节点的排序。该方案周期性适应动态网络的频道接入组织。 如果更多的节点处于活跃状态,那么他们传输过程中可以避免冲突。

A_IEEE802_15_4接入算法

        对IEEE802-15-4的接入算法进行仿真研究,分析其对应的吞吐量和能耗。针对IEEE802.15.4接入算法,本课题主要研究基于时隙CSMA/CA接入算法。

        IEEE 802.15.4标准是目前最具影响的低功耗、低速无线传感器网络技术标准,它主要定义了物理层和MAC层规范。基于IEEE 802.15.4的无线技术以其更低的安装和维护成本正逐步取代现存的有线技术应用。例如在楼宇自动化、家庭/环境监控、工业控制和智能仪表领域都有应用。

        这里,为了对比原有算法和改进算法,这里,我们分别对原来的算法和改进后的算法进行分析,分别对2种情况进行仿真。

        1.不同节点个数下的网络吞吐量;

        2.不同节点个数下的网络能耗;

        即,我们需要对算法在不同节点数下的吞吐量和能耗分别进行仿真分析,通过这四种代码的仿真,可以有效分析改进算法在不影响网络吞吐量的前提下,对能耗问题的改善。

       这里采用的算法是时隙CSMA/CA算法。关于该算法的理论,这里就不做介绍了,相关的参考论文比较多。

B_IEEE802_15_4家庭网络高效节能接入方法

        当节点数目越来越多的时候,由于对信道的竞争的越来越激烈,单个节点接入信道成功从而发送数据的概率会随之下降。那些没能够竞争到信道的节点就会进入新的退避过程。整个网络的总体功耗在这个过程当中为持续上升状态。

        这里,我们通过算法的改进,来降低接入的能耗:

        改进一:减少网络中的碰撞次数,当碰撞次数较多的时候,需要更多次数的重传,从而导致消耗更多的能力和信道资源。这里,我们通过设计一个自适应接入算法,有效减少碰撞次数。主要是根据当前情况下的碰撞次数,来实时的更新算法的参数。

        改进二:降低每帧开销。减少能量损耗通过减小每帧对等节点的overhead。

        以上的改进,可具体参考我提供的两篇硕士论文。如果有不明白的,可以在修改中,我给你再写清楚。

3.部分源码

clc;
clear;
close all;
warning off;
addpath 'func\'

%定义网络节点数目
Min_Num = 5;
Max_Num = 80;
SET     = [Min_Num:5:Max_Num];
Inder   = 0;
%参数初始化

for Note_Num = SET
    Note_Num
    Inder = Inder + 1;
    %参数初始化
    parameter;
    
    %部分参数初始化
    for i = 1:Note_Num
        ArrivalTime(i)  = func_randn_times(ArrivalTimes);  
        PacketLength(i) = func_randn_times(PacketLengths);
        CW(i)           = CW_CONSTANS; 
        BE(i)           = BE_CONSTANS;%(0,2^BE - 1) 
        maxNBBackoff(i) = 2^BE(i)-1; 
    end

    for t = 1:Simu_Time
        %修改退避准则
        for i = 1:Note_Num
            if t == ArrivalTime(i)
               if Buffer_sizes(i) < Buffer_Level - PacketLength(i)
                  PacketBuff      = func_FIFO_buffer(PacketBuff,i,PacketLength(i),depth);
                  Buffer_sizes(i) = Buffer_sizes(i) + PacketLength(i);
                  HasPacket(i)    = 1;
                  if maxNBBackoff(i) == 2^BE(i)-1
                     maxNBBackoff(i) = floor(rand(1)*CW(i));
                  end
               end
               %更新到达时间和帧长,产生随机时间
               ArrivalTime(i)  = func_randn_times(ArrivalTimes) + PacketLength(i) + t;
               PacketLength(i) = func_randn_times(PacketLengths);
            end
            
            if HasPacket(i) == 1 & IsBussy == 0
               %退避时间=0 
               if maxNBBackoff(i) == 0 
                  CollisionNodes = func_Add(CollisionNodes,i);
                  IsStart        = 1;
               else
                  %退避时间=0则 退避时间-1
                  maxNBBackoff(i) = maxNBBackoff(i) - 1;
               end
            end
        end

        %信道改为忙碌
        if IsStart == 1
           IsBussy = 1;
           n       = CollisionNodes(1);
           %信道中只有一个站点发送数据则为正常发送情况
           if n == 1
              Trans_Time  = floor(t+3+ACK+PacketBuff(CollisionNodes(2),2));
              %没有发生竞争
              IsCollision = 0;
           else
              Trans_Time  = floor(t+2.5+func_max_frame_len(PacketBuff,CollisionNodes));
              %发生竞争
              IsCollision = 1;
           end
           IsStart=0;        
        end

        %达到站点的等待时间
        if t == Trans_Time & IsBussy == 1
           if IsCollision == 0
              n               = CollisionNodes(2);
              Buffer_sizes(n) = Buffer_sizes(n) - PacketBuff(n,2);
              Throughput      = Throughput + PacketBuff(n,2)* TimeSlot * Dat_Rate;
              PacketBuff      = func_push2(PacketBuff,n,depth);
              k               = PacketBuff(n,1);
              %如果没有数据等待发送
              if k ==0
                 HasPacket(n) = 0;
                 maxNBBackoff(n) = 2^BE(i)-1;
              else
                 maxNBBackoff(n) = floor(rand(1)*CW(n));
              end
           else
              n = CollisionNodes(1);
              for i = 1:n
                  j               = CollisionNodes(i+1);
                  maxNBBackoff(j) = floor(rand(1)*CW(j));
              end
           end
           CollisionNodes = zeros(1,Note_Num+1);
           Trans_Time     = 0;
           IsBussy        = 0;
           Collition      = 0;
        end
    end
    %吞吐率
    Throughput_avg(Inder)  = Throughput/(Simu_Time* TimeSlot * Dat_Rate);
end

figure;
plot(SET,100*Throughput_avg,'b-o');
axis([1,Max_Num,0,100]);
grid on;
xlabel('网络节点数目');
ylabel('吞吐率(%)');

save dat1.mat Max_Num SET Throughput_avg

4.仿真结论

 

 

 

 

 

5.参考文献

[1]龙昭华, 苏美君, 李景中,等. 一种基于IEEE802.15.4的自适应CSMA/CA接入方法:, 2012.A01-67

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/125302258