SPIN路由算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SPIN路由算法
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)
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
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');
数据传递:
剩余能量:。