赞
踩
SPIN协议是一类基于协商、以数据为中心的路由协议。SPIN协议假设所有的网络节点都是潜在的Sink节点,某一个要发送数据的节点把数据传送给任何需要该数据的节点,并通过协商机制减少网络中数据传输的数据量。节点只广播其他节点没有的数据以减少冗余数据,从而有效地减少了能量消耗。
SPIN协议在节点过程中使用三种类型的数据包:
ADV:广播数据包,当一个节点需要发送数据时,就向周围广播一个带有本节点属性、类型等信息的一个数据包该数据包通常要远远小于数据本身的大小。(元数据)
REQ:请求包,如果接收到ADV的节点需要该数据就发送一个REQ请求包。
DATA:数据包,接收REQ后,要发送数据的节点就发送一个DATA包,DATA中包含有效数据。
本实验使用matlab简单仿真SPIN协议,创建200*200的图形,随机创建400个节点,不断随机选择一个源节点,经如下操作:
(1)结点A采集到数据m。向外广播带有m元数据(元数据指数据的属性)的adv数据包。
(2)邻居结点B收到A的adv数据包,根据其携带的元数据判断自身是否需要数据m。如果不需要,则销毁adv数据包。需要则生成相应的req数据包,向外广播。
(3)结点A收到B的req数据包请求,生成相应的data数据包相外广播。
(4)结点B收到A的data数据包,进行数据m的存储。
(5)结点B继续向外广播带有m元数据的adv数据包,从而数据m在网络中被传递。将数据遍历整个网络,直到有某个节点能量小于0时,结束循环。
该实验仿真了SPIN协议的基本工作,还有待优化完善。
- clear;%清除内存变量
- l=200;
- w=200;%区域边长200m
- R=20; %通信半径
- node_num=400;%采集节点数目
- data=1000;%数据包(比特)
- min_data=100;%元数据包(bit)
-
- Eo=5; %初始能量
- %threshold_E=0.5; %能量阈值
- Eda=5*0.000000001;%传输能量
- Eelec=50*0.000001;%接受能量 J/bit
- Efs=10*0.000000001;%耗散能量,小于临界值。J/bit/m^2
- Emp=0.0013*0.000000001;%耗散能量,大于临界值. J/bit/m^2
- d0=sqrt(Efs/Emp);%临界值
-
- sink_x=100;%基站坐标
- sink_y=100;
-
- figure(1);
- %画基站与节点:
- plot(sink_x,sink_y,'p','markerfacecolor','yellow','Linewidth',5)
- hold on
-
- %随机设置节点
- for i=1:node_num
- Node{i}.x=l*rand(1,1);
- Node{i}.y=w*rand(1,1);
- plot(Node{i}.x,Node{i}.y,'ob','markerfacecolor','blue')
- %用蓝o表示
- hold on
- N_E(i)=Eo;%设置初始能量为E0
- Node{i}.flag = 0;%0表示未接收ADV和数据,1表示已接收ADV,2表示已有数据
- Node{i}.adv = 0;%记录节点接收来自哪一个节点的adv
- Node{i}.req{1}.ip= 0;%记录谁发来的req
- end
-
- Node{node_num+1}.x=sink_x;
- Node{node_num+1}.y=sink_y;
- N_E(node_num+1)=Eo;%设置初始能量为E0
- Node{node_num+1}.flag = 0;
- Node{node_num+1}.adv = 0;%记录节点接收来自哪一个节点的adv
- Node{node_num+1}.req{1}.ip= 0;%记录谁发来的req
-
- %记录每个节点的邻居信息
- for i=1:node_num
- k=0;
- for j=1:node_num+1
- if (i~=j)&&(sqrt((Node{j}.x-Node{i}.x)^2+(Node{j}.y-Node{i}.y)^2)<=R)
- k=k+1;
- Node{i}.Neb{k}.x=Node{j}.x;
- Node{i}.Neb{k}.y=Node{j}.y;
- Node{i}.Neb{k}.ip=j;
- end
- end
- Node{i}.Neb_num=k;
- end
-
-
- t=0;
- turn = 0; %传递数据的次数
- is_die = 1; %网络死亡则为0
-
- while 1
- turn = turn + 1
-
- %随机选取发送数据的源节点
- order = round(rand(1,1)*node_num-1)+1;
- plot(Node{order}.x,Node{order}.y,'ob','markerfacecolor','red');%用红o表示
- Node{order}.flag = 2;
- run_list(1) = order;
- while is_die
- t=t+1;
- frame=getframe(gcf);%绘制git动图
- imind=frame2im(frame);
- [imind,cm] = rgb2ind(imind,256);
- if t==1
- imwrite(imind,cm,'3.gif','gif', 'Loopcount',inf,'DelayTime',1e-4);
- else
- imwrite(imind,cm,'3.gif','gif','WriteMode','append','DelayTime',1e-4);
- end
- for i=1:length(run_list)
- id = run_list(i);
- if id == node_num+1
- continue
- end
- for j = 1:Node{id}.Neb_num %画‘ADV’
- if Node{Node{id}.Neb{j}.ip}.flag == 0
- Node{Node{id}.Neb{j}.ip}.flag=1;
- Node{Node{id}.Neb{j}.ip}.adv = id;
- text((Node{id}.x+Node{id}.Neb{j}.x)/2+3,(Node{id}.y+Node{id}.Neb{j}.y+3)/2,'\fontsize{5}ADV','Color','blue');
- X = [Node{id}.x;Node{id}.Neb{j}.x];
- Y = [Node{id}.y;Node{id}.Neb{j}.y];
- line(X,Y,'color','k','LineWidth',1)
- %画邻居节点
- plot(Node{id}.Neb{j}.x,Node{id}.Neb{j}.y,'ob','markerfacecolor','green');
- hold on
- %发送ADV能量损耗
- d = sqrt((X(2)-X(1))^2+(Y(2)-Y(1))^2);
- if d<=d0
- N_E(id)=N_E(id)-min_data*Eelec-min_data*Efs*d^2;
- else
- N_E(id)=N_E(id)-min_data*Eelec-min_data*Emp*d^4;
- end
- if N_E(id)<=0
- plot(Node{id}.x,Node{id}.y,'ob','markerfacecolor','black');
- text(Node{id}.x,Node{id}.y,{id},'FontSize',7)
- is_die = 0
- break
- end
- %接收ADV能量损耗
- N_E(Node{id}.Neb{j}.ip)=N_E(Node{id}.Neb{j}.ip)-min_data*Eelec;
- if N_E(Node{id}.Neb{j}.ip)<=0
- plot(Node{id}.Neb{j}.x,Node{id}.Neb{j}.y,'ob','markerfacecolor','black');
- text(Node{id}.Neb{j}.x,Node{id}.Neb{j}.y,{Node{id}.Neb{j}.ip},'FontSize',7)
- is_die = 0
- break
- end
- end
- if is_die==0
- break
- end
- end
- if is_die==0
- break
- end
- end
- frame=getframe(gcf);%绘制git动图
- imind=frame2im(frame);
- [imind,cm] = rgb2ind(imind,256);
- for g=1:10
- imwrite(imind,cm,'3.gif','gif','WriteMode','append','DelayTime',1e-4);
- end
-
- if is_die==0
- break
- end
-
- for i=1:length(run_list) %画‘REQ’
- id = run_list(i);
- if id == node_num+1
- Node{id}.req_num=0;
- continue
- end
- n=0;
- for j = 1:Node{id}.Neb_num
- if (Node{Node{id}.Neb{j}.ip}.flag == 1) % &&(N_E(Node{id}.Neb{j}.ip)>threshold_E)
- if Node{Node{id}.Neb{j}.ip}.adv==id
- n=n+1;
- Node{id}.req{n}.ip= Node{id}.Neb{j}.ip;
- text((Node{id}.x+Node{id}.Neb{j}.x)/2,(Node{id}.y+Node{id}.Neb{j}.y)/2,'\fontsize{5}REQ','Color','green');
- %发送REQ能量损耗
- d = sqrt((Node{id}.x-Node{id}.Neb{j}.x)^2+(Node{id}.y-Node{id}.Neb{j}.y)^2);
- if d<=d0
- N_E(Node{id}.Neb{j}.ip)=N_E(Node{id}.Neb{j}.ip)-min_data*Eelec-min_data*Efs*d^2;
- else
- N_E(Node{id}.Neb{j}.ip)=N_E(Node{id}.Neb{j}.ip)-min_data*Eelec-min_data*Emp*d^4;
- end
-
- if N_E(Node{id}.Neb{j}.ip)<=0
- plot(Node{id}.Neb{j}.x,Node{id}.Neb{j}.y,'ob','markerfacecolor','black');
- text(Node{id}.Neb{j}.x,Node{id}.Neb{j}.y,{Node{id}.Neb{j}.ip},'FontSize',7)
- is_die = 0
- break
- end
- %接收REQ能量损耗
- N_E(id)=N_E(id)-min_data*Eelec;
- if N_E(id)<=0
- plot(Node{id}.x,Node{id}.y,'ob','markerfacecolor','black');
- text(Node{id}.x,Node{id}.y,{id},'FontSize',7)
- is_die = 0
- break
- end
- end
- end
- end
- if is_die==0
- break
- end
- Node{id}.req_num=n;
- end
- frame=getframe(gcf);%绘制git动图
- imind=frame2im(frame);
- [imind,cm] = rgb2ind(imind,256);
- for g=1:10
- imwrite(imind,cm,'3.gif','gif','WriteMode','append','DelayTime',1e-4);
- end
- if is_die==0
- break
- end
- list=[];
- m=0;
- for i=1:length(run_list) %发送 DATA
- id = run_list(i);
- if Node{id}.req_num == 0
- continue
- end
- for k=1:Node{id}.req_num
- m=m+1;
- Node{Node{id}.req{k}.ip}.flag = 2;
- list(m)=Node{id}.req{k}.ip;
- text((Node{id}.x+Node{Node{id}.req{k}.ip}.x)/2-3,(Node{id}.y+Node{Node{id}.req{k}.ip}.y)/2-3,'\fontsize{7}DATA','Color','black');
- %画邻居节点
- plot(Node{Node{id}.req{k}.ip}.x,Node{Node{id}.req{k}.ip}.y,'ob','markerfacecolor','red');
- hold on
- %发送DATA能量损耗
- d = sqrt((Node{id}.x-Node{Node{id}.req{k}.ip}.x)^2+(Node{id}.y-Node{Node{id}.req{k}.ip}.y)^2);
- if d<=d0
- N_E(id)=N_E(id)-data*Eelec-data*Efs*d^2;
- else
- N_E(id)=N_E(id)-data*Eelec-data*Emp*d^4;
- end
- if N_E(id)<=0
- plot(Node{id}.x,Node{id}.y,'ob','markerfacecolor','black');
- text(Node{id}.x,Node{id}.y,{id},'FontSize',7)
- is_die = 0
- break
- end
- %接收ADV能量损耗
- N_E(Node{id}.req{k}.ip)=N_E(Node{id}.req{k}.ip)-data*Eelec;
- if N_E(Node{id}.req{k}.ip)<=0
- plot(Node{Node{id}.req{k}.ip}.x,Node{Node{id}.req{k}.ip}.y,'ob','markerfacecolor','black');
- text(Node{Node{id}.req{k}.ip}.x,Node{Node{id}.req{k}.ip}.y,{Node{id}.req{k}.ip},'FontSize',7)
- is_die = 0
- break
- end
- end
- if is_die==0
- break
- end
- end
- frame=getframe(gcf);%绘制git动图
- imind=frame2im(frame);
- [imind,cm] = rgb2ind(imind,256);
- for g=1:10
- imwrite(imind,cm,'3.gif','gif','WriteMode','append','DelayTime',1e-4);
- end
- if is_die==0
- break
- end
- is_end = 1;
- for i=1:node_num+1
- if Node{i}.flag ~= 2
- is_end = 0;
- end
- end
- if is_end
- break
- end
- run_list = list;
-
- end
-
- if is_die==0
- turn
- break
- end
- clf;
- run_list=[];
- for i = 1:node_num+1
- plot(Node{i}.x,Node{i}.y,'ob','markerfacecolor','blue');
- Node{i}.flag = 0;%0表示未接收ADV和数据,1表示已接收ADV,2表示已有数据
- Node{i}.adv = 0;%记录节点接收来自哪一个节点的adv
- Node{i}.req{1}.ip= 0;%记录谁发来的req
- hold on;
- end
- end
- figure(2)
- A = cat(2,N_E); %绘制剩余能量图
- axis equal;
- axis([0,55,0,0.5]);
- bar(A);
- title('剩余能量图','Fontsize',20,'Color','m');
数据传递:
剩余能量:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。