m基于matlab的IEEE802.15.4家庭网络高效节能的有效接入方法

88 阅读4分钟

1.算法描述

我们主要从三个方面进行研究。

 

第一,需要研究基于IEEE802.15.4的接入算法;

 

第二,在研究IEEE802.15.4的接入算法之后,研究IEEE802.15.4家庭网络的接入算法;

 

第三,研究减少能量损耗的方法,从而实现高效,低能耗的IEEE802.15.4家庭网络的接入方案;

 

       在做了上面三个方面的研究之后,对于本课题,我们所采用的方案,总的来讲为:

 

       首先,考虑到家庭网络,需要低成本,且家庭中各个使用设备的分散性,我们需要使用无线网络进行接入,即利用无线传感器的自组网,将家庭中的各个设备,如电脑,Ipad,电视等进行互联,形成一个新的无线网络,并通过广域互联网接口和外部网络连接。

 

       然后,实现家庭无线网络的高效低能耗的接入。

 

A_IEEE802_15_4接入算法

 

        在本研究工作的第一步,需要对IEEE802-15-4的接入算法进行仿真研究,分析其对应的吞吐量和能耗。

 

        针对IEEE802.15.4接入算法,本课题主要研究基于时隙CSMA/CA接入算法。

 

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

 

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

 

        main1.m : 不同节点个数下的网络吞吐量;

 

        main2.m : 不同节点个数下的网络能耗;

 

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

 

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

 

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

 

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

 

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

 

2.仿真效果预览

matlab2022a仿真结果如下:

1.png

2.png

3.png 3.MATLAB部分代码预览 `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);

              %如果没有发生碰撞,则CW不变

              CW(n)           = CW_CONSTANS;

              BE(n)           = BE_CONSTANS;

              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);

                  %如果发生碰撞,则CW进行实时调整

                  CW(j)           = func_cw_change(CW,j);

                  BE(j)           = BE_CONSTANS;

                  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

01_067_m`