⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zbbroadcast.m

📁 在matlab实现的zigbee源代码
💻 M
📖 第 1 页 / 共 2 页
字号:
                for j = 1: forward(u, 3)-1
                    tn1f = [Fu(j) , tneighbor(Fu(j), 1: info(Fu(j), 4) + 1)];
                    C = setdiff(C, tn1f);
                end
            end
            
            if length(S) <= 0 | length(C) <=0
                forward(i, 1) = 3;  % still need to forward, but no selected forward nodes
                if info(i, 5) > 0   % must be true: at least have a parent, except root
                    NF = neighbor(i, 1: info(i, 5));
                    for j = 1 : info(i, 5)
                        numReceive = numReceive + 1;
                        if forward(NF(j), 1) <= 0
                            forward(NF(j), 1) = 1;  % non-forward
                            forward(NF(j), 2) = i;
                            if drawzb == 1
                                figure(3);
                                plot(info(NF(j), 2), info(NF(j), 3), 'k.');
                                line([info(i, 2), info(NF(j), 2)], [info(i, 3), info(NF(j), 3)], 'color', 'k');
                                figure(5);
                                plot(tx(NF(j)), ty(NF(j)), 'k.');
                                line([tx(i), tx(NF(j))], [ty(i), ty(NF(j))], 'color', 'k');
                            end
                        end
                    end
                end
            end
            
            % OOS, Step 2, construct the trees
            forest = [];
            forest = zeros(length(C), 4);
            % 1: index
            % 2: network ID
            % 3: level
            % 4: status: 0: not processed, 1: processed
            forest(:, 1)=C'; % S*C should be empty
            for j = 1: size(forest, 1)
                forest(j, 2) = info(forest(j, 1), 1);
                forest(j, 3) = Lm - info(forest(j, 1), 6);
            end
            forest = sortrows(forest, [3, 2]);
            % OOS, Step 3, select forward nodes
            F = [];
            for j = 1:size(forest, 1)
                if forest(j, 4) > 0
                    continue;
                end
                t1 = forest(j, 1);
                t2 = tneighbor(t1, 1);  % parent of t1
                if t2 > 0 & length(find(S==t2)) > 0
                    if length(intersect(F, t2)) > 0
                        disp('*********My approach: a forward node already chosen');
                    end
                    F = union(F , t2);
                    % F = [F, t2];
                    t3 = tneighbor(t2, 1);  % parent of t2
                    if t3 > 0
                        t4 = find(forest(:, 1)==t3);
                        if length(t4) > 0   % at most 1 item in t4
                            % length(t4)
                            forest(t4(1), 4) = 1;
                        end
                    end
                    k = j + 1;
                    while(k <= size(forest, 1))
                        if tneighbor(forest(k, 1), 1) ~= t2
                            break;
                        end
                        forest(k, 4) = 1;   % processed
                        k = k + 1;
                    end
                else
                    t3 = intersect(tneighbor(t1, 2:(info(t1, 4)+1)), S);
                    if length(intersect(F, t3)) > 0
                        disp('*********My approach: a forward node already chosen');
                    end
                    F = union(F, t3(1));
                    % F = [F, t3(1)];                        
                end
                forest(j, 4) = 1;            
            end
            NF = [];
            NF = setdiff(neighbor(i, 1 : info(i, 5)), F);
        end
        
        % Forwarding
        forward(i, 1) = 3;  % already forward
        if drawzb == 1 & i ~= s
            figure(3);
            plot(info(i, 2), info(i, 3), 'k.', 'MarkerSize', 25);
            figure(5);
            plot(tx(i), ty(i), 'k.', 'MarkerSize', 25);
        end
        
        t1 = length(F);
        if t1 > 0
            forward(i, 4: 4 + t1 - 1) = F;
            forward(i, 3) = t1;
            for j = 1 : t1
                if F(j) <= 0
                    continue;
                end
                numReceive = numReceive + 1;
                if forward(F(j), 1) == 1 | forward(F(j), 1) == 3
                    continue;
                end
                % Self-pruning
                tt = [];
                tt = tocover(F(j), 1:todegree(F(j)));
                tt = setdiff(tt, [i, tneighbor(i, 1:info(i, 4)+1)]);
                todegree(F(j)) = length(tt);
                if todegree(F(j)) <= 0	% self-pruning
                    forward(F(j), 1) = 1;
                    if drawzb == 1
                        figure(3);
                        line([info(i, 2), info(F(j), 2)], [info(i, 3), info(F(j), 3)], 'Color', 'k');
                        plot(info(F(j), 2), info(F(j), 3), 'k.');
                        figure(5);
                        line([tx(i), tx(F(j))], [ty(i), ty(F(j))], 'Color', 'k');
                        plot(tx(F(j)), ty(F(j)), 'k.');
                    end
                    etimer(F(j)) = 0;
                    if approach2 == 4
                        disp('This forward node is self-pruned and does not need to forward');
                    end
                    continue;
                end
                tocover(F(j), 1:todegree(F(j))) = tt;
                
                if forward(F(j), 1) == 0
                    % Update status
                    forward(F(j), 2) = i;
                    forward(F(j), 1) = 2;
                    % Add timer for a candidate forward node
                    if useLQI == 0
                        % Random waiting time
                        etimer(F(j)) = rand * etimerscale;
                    end
                    if drawzb == 1
                        figure(3);
                        line([info(i, 2), info(F(j), 2)], [info(i, 3), info(F(j), 3)], 'Color', 'k');
                        plot(info(F(j), 2), info(F(j), 3), 'ko', 'MarkerSize', 3);
                        figure(5);
                        line([tx(i), tx(F(j))], [ty(i), ty(F(j))], 'Color', 'k');
                        plot(tx(F(j)), ty(F(j)), 'ko', 'MarkerSize', 3);
                    end
                end
                
                if useLQI == 1
                    lqi0 = ps-afa*10*log10(sqrt((info(i, 2)-info(F(j), 2))^2 + (info(i, 3)-info(F(j), 3))^2));
                    % lqi0
                    lqi = lqi0-cigma*randn;
                    % lqi
                    if lqi>=(lqi0-gama)
                        time1 = k2 * lqi0 / todegree(F(j));
                    else
                        time1 = k1*(lqi0-lqi) + k2*lqi0 / todegree(F(j));
                        % time2 = time1;
                    end
                    time1 = time1 * kscale;
                    if forward(F(j), 1) == 0
                        etimer(F(j)) = time1;
                        lasttime(F(j)) = time1;
                    else
                        forward(F(j), 2) = i;
                        etimer(F(j)) = time1 - (lasttime(F(j)) - etimer(F(j)));   % t > 0
                        if etimer(F(j)) <= 0
                            % disp('new timer less than 0');
                            etimer(F(j)) = 0.001 * rand;
                        end
                        lasttime(F(j)) = etimer(F(j));
                    end
                end
            end
        end
        
        t1 = length(NF);
        if t1 > 0
            for j = 1 : t1
                numReceive = numReceive + 1;
                if approach2 ~= 1   % on-tree flooding receive it and drop it
                    if forward(NF(j), 1) == 0
                        forward(NF(j), 1) = 1;  % non-forward
                        forward(NF(j), 2) = i;
                        if drawzb == 1
                            figure(3);
                            line([info(i, 2), info(NF(j), 2)], [info(i, 3), info(NF(j), 3)], 'Color', 'k');
                            plot(info(NF(j), 2), info(NF(j), 3), 'ko', 'MarkerSize', 3);
                            figure(5);
                            line([tx(i), tx(NF(j))], [ty(i), ty(NF(j))], 'Color', 'k');
                            plot(tx(NF(j)), ty(NF(j)), 'ko', 'MarkerSize', 3);
                        end
                    elseif forward(NF(j), 1) == 2
                        % Self-pruning
                        tt = [];
                        tt = tocover(NF(j), 1:todegree(NF(j)));
                        tt = setdiff(tt, [i, tneighbor(i, 1:info(i, 4)+1)]);
                        todegree(NF(j)) = length(tt);
                        if todegree(NF(j)) <= 0	    % self-pruning
                            forward(NF(j), 1) = 1;
                            %                                 if drawzb == 1
                            %                                     figure(3);
                            %                                     plot(info(NF(j), 2), info(NF(j), 3), 'k.');
                            %                                     figure(5);
                            %                                     plot(tx(NF(j)), ty(NF(j)), 'k.');
                            %                                 end
                            etimer(NF(j)) = 0;
                            % disp('This forward node does not need to forward');
                            continue;
                        end
                        tocover(NF(j), 1:todegree(NF(j))) = tt;
                    end 
                end
            end
        end
        % fishish a forward
    end % for
end % while

% Output results
numInitial = size(find(forward(:, 1)==0), 1);    % should be zero if network is connected
numNonforward = size(find(forward(:, 1)==1), 1);
numAlreadyforward = size(find(forward(:, 1)==3), 1);
timeDelay = -etimer(s);  %  = -min(etimer) - 1;
numForwardoverhead = 0;
for i = 1:maxn
    if forward(i, 1) ~= 3
        continue;
    end
    numForwardoverhead = numForwardoverhead + forward(i, 3);
    %     numReceive = numReceive + info(i, 5);
end
numAlreadyforward
numNonforward
numReceive
timeDelay

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -