当前位置:   article > 正文

SPIN路由算法

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协议的基本工作,还有待优化完善。

  1. clear;%清除内存变量
  2. l=200;
  3. w=200;%区域边长200m
  4. R=20; %通信半径
  5. node_num=400;%采集节点数目
  6. data=1000;%数据包(比特)
  7. min_data=100;%元数据包(bit
  8. Eo=5; %初始能量
  9. %threshold_E=0.5; %能量阈值
  10. Eda=5*0.000000001;%传输能量
  11. Eelec=50*0.000001;%接受能量 J/bit
  12. Efs=10*0.000000001;%耗散能量,小于临界值。J/bit/m^2
  13. Emp=0.0013*0.000000001;%耗散能量,大于临界值. J/bit/m^2
  14. d0=sqrt(Efs/Emp);%临界值
  15. sink_x=100;%基站坐标
  16. sink_y=100;
  17. figure(1);
  18. %画基站与节点:
  19. plot(sink_x,sink_y,'p','markerfacecolor','yellow','Linewidth',5)
  20. hold on
  21. %随机设置节点
  22. for i=1:node_num
  23. Node{i}.x=l*rand(1,1);
  24. Node{i}.y=w*rand(1,1);
  25. plot(Node{i}.x,Node{i}.y,'ob','markerfacecolor','blue')
  26. %用蓝o表示
  27. hold on
  28. N_E(i)=Eo;%设置初始能量为E0
  29. Node{i}.flag = 0;%0表示未接收ADV和数据,1表示已接收ADV,2表示已有数据
  30. Node{i}.adv = 0;%记录节点接收来自哪一个节点的adv
  31. Node{i}.req{1}.ip= 0;%记录谁发来的req
  32. end
  33. Node{node_num+1}.x=sink_x;
  34. Node{node_num+1}.y=sink_y;
  35. N_E(node_num+1)=Eo;%设置初始能量为E0
  36. Node{node_num+1}.flag = 0;
  37. Node{node_num+1}.adv = 0;%记录节点接收来自哪一个节点的adv
  38. Node{node_num+1}.req{1}.ip= 0;%记录谁发来的req
  39. %记录每个节点的邻居信息
  40. for i=1:node_num
  41. k=0;
  42. for j=1:node_num+1
  43. if (i~=j)&&(sqrt((Node{j}.x-Node{i}.x)^2+(Node{j}.y-Node{i}.y)^2)<=R)
  44. k=k+1;
  45. Node{i}.Neb{k}.x=Node{j}.x;
  46. Node{i}.Neb{k}.y=Node{j}.y;
  47. Node{i}.Neb{k}.ip=j;
  48. end
  49. end
  50. Node{i}.Neb_num=k;
  51. end
  52. t=0;
  53. turn = 0; %传递数据的次数
  54. is_die = 1; %网络死亡则为0
  55. while 1
  56. turn = turn + 1
  57. %随机选取发送数据的源节点
  58. order = round(rand(1,1)*node_num-1)+1;
  59. plot(Node{order}.x,Node{order}.y,'ob','markerfacecolor','red');%用红o表示
  60. Node{order}.flag = 2;
  61. run_list(1) = order;
  62. while is_die
  63. t=t+1;
  64. frame=getframe(gcf);%绘制git动图
  65. imind=frame2im(frame);
  66. [imind,cm] = rgb2ind(imind,256);
  67. if t==1
  68. imwrite(imind,cm,'3.gif','gif', 'Loopcount',inf,'DelayTime',1e-4);
  69. else
  70. imwrite(imind,cm,'3.gif','gif','WriteMode','append','DelayTime',1e-4);
  71. end
  72. for i=1:length(run_list)
  73. id = run_list(i);
  74. if id == node_num+1
  75. continue
  76. end
  77. for j = 1:Node{id}.Neb_num %画‘ADV’
  78. if Node{Node{id}.Neb{j}.ip}.flag == 0
  79. Node{Node{id}.Neb{j}.ip}.flag=1;
  80. Node{Node{id}.Neb{j}.ip}.adv = id;
  81. 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');
  82. X = [Node{id}.x;Node{id}.Neb{j}.x];
  83. Y = [Node{id}.y;Node{id}.Neb{j}.y];
  84. line(X,Y,'color','k','LineWidth',1)
  85. %画邻居节点
  86. plot(Node{id}.Neb{j}.x,Node{id}.Neb{j}.y,'ob','markerfacecolor','green');
  87. hold on
  88. %发送ADV能量损耗
  89. d = sqrt((X(2)-X(1))^2+(Y(2)-Y(1))^2);
  90. if d<=d0
  91. N_E(id)=N_E(id)-min_data*Eelec-min_data*Efs*d^2;
  92. else
  93. N_E(id)=N_E(id)-min_data*Eelec-min_data*Emp*d^4;
  94. end
  95. if N_E(id)<=0
  96. plot(Node{id}.x,Node{id}.y,'ob','markerfacecolor','black');
  97. text(Node{id}.x,Node{id}.y,{id},'FontSize',7)
  98. is_die = 0
  99. break
  100. end
  101. %接收ADV能量损耗
  102. N_E(Node{id}.Neb{j}.ip)=N_E(Node{id}.Neb{j}.ip)-min_data*Eelec;
  103. if N_E(Node{id}.Neb{j}.ip)<=0
  104. plot(Node{id}.Neb{j}.x,Node{id}.Neb{j}.y,'ob','markerfacecolor','black');
  105. text(Node{id}.Neb{j}.x,Node{id}.Neb{j}.y,{Node{id}.Neb{j}.ip},'FontSize',7)
  106. is_die = 0
  107. break
  108. end
  109. end
  110. if is_die==0
  111. break
  112. end
  113. end
  114. if is_die==0
  115. break
  116. end
  117. end
  118. frame=getframe(gcf);%绘制git动图
  119. imind=frame2im(frame);
  120. [imind,cm] = rgb2ind(imind,256);
  121. for g=1:10
  122. imwrite(imind,cm,'3.gif','gif','WriteMode','append','DelayTime',1e-4);
  123. end
  124. if is_die==0
  125. break
  126. end
  127. for i=1:length(run_list) %画‘REQ’
  128. id = run_list(i);
  129. if id == node_num+1
  130. Node{id}.req_num=0;
  131. continue
  132. end
  133. n=0;
  134. for j = 1:Node{id}.Neb_num
  135. if (Node{Node{id}.Neb{j}.ip}.flag == 1) % &&(N_E(Node{id}.Neb{j}.ip)>threshold_E)
  136. if Node{Node{id}.Neb{j}.ip}.adv==id
  137. n=n+1;
  138. Node{id}.req{n}.ip= Node{id}.Neb{j}.ip;
  139. text((Node{id}.x+Node{id}.Neb{j}.x)/2,(Node{id}.y+Node{id}.Neb{j}.y)/2,'\fontsize{5}REQ','Color','green');
  140. %发送REQ能量损耗
  141. d = sqrt((Node{id}.x-Node{id}.Neb{j}.x)^2+(Node{id}.y-Node{id}.Neb{j}.y)^2);
  142. if d<=d0
  143. N_E(Node{id}.Neb{j}.ip)=N_E(Node{id}.Neb{j}.ip)-min_data*Eelec-min_data*Efs*d^2;
  144. else
  145. N_E(Node{id}.Neb{j}.ip)=N_E(Node{id}.Neb{j}.ip)-min_data*Eelec-min_data*Emp*d^4;
  146. end
  147. if N_E(Node{id}.Neb{j}.ip)<=0
  148. plot(Node{id}.Neb{j}.x,Node{id}.Neb{j}.y,'ob','markerfacecolor','black');
  149. text(Node{id}.Neb{j}.x,Node{id}.Neb{j}.y,{Node{id}.Neb{j}.ip},'FontSize',7)
  150. is_die = 0
  151. break
  152. end
  153. %接收REQ能量损耗
  154. N_E(id)=N_E(id)-min_data*Eelec;
  155. if N_E(id)<=0
  156. plot(Node{id}.x,Node{id}.y,'ob','markerfacecolor','black');
  157. text(Node{id}.x,Node{id}.y,{id},'FontSize',7)
  158. is_die = 0
  159. break
  160. end
  161. end
  162. end
  163. end
  164. if is_die==0
  165. break
  166. end
  167. Node{id}.req_num=n;
  168. end
  169. frame=getframe(gcf);%绘制git动图
  170. imind=frame2im(frame);
  171. [imind,cm] = rgb2ind(imind,256);
  172. for g=1:10
  173. imwrite(imind,cm,'3.gif','gif','WriteMode','append','DelayTime',1e-4);
  174. end
  175. if is_die==0
  176. break
  177. end
  178. list=[];
  179. m=0;
  180. for i=1:length(run_list) %发送 DATA
  181. id = run_list(i);
  182. if Node{id}.req_num == 0
  183. continue
  184. end
  185. for k=1:Node{id}.req_num
  186. m=m+1;
  187. Node{Node{id}.req{k}.ip}.flag = 2;
  188. list(m)=Node{id}.req{k}.ip;
  189. 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');
  190. %画邻居节点
  191. plot(Node{Node{id}.req{k}.ip}.x,Node{Node{id}.req{k}.ip}.y,'ob','markerfacecolor','red');
  192. hold on
  193. %发送DATA能量损耗
  194. d = sqrt((Node{id}.x-Node{Node{id}.req{k}.ip}.x)^2+(Node{id}.y-Node{Node{id}.req{k}.ip}.y)^2);
  195. if d<=d0
  196. N_E(id)=N_E(id)-data*Eelec-data*Efs*d^2;
  197. else
  198. N_E(id)=N_E(id)-data*Eelec-data*Emp*d^4;
  199. end
  200. if N_E(id)<=0
  201. plot(Node{id}.x,Node{id}.y,'ob','markerfacecolor','black');
  202. text(Node{id}.x,Node{id}.y,{id},'FontSize',7)
  203. is_die = 0
  204. break
  205. end
  206. %接收ADV能量损耗
  207. N_E(Node{id}.req{k}.ip)=N_E(Node{id}.req{k}.ip)-data*Eelec;
  208. if N_E(Node{id}.req{k}.ip)<=0
  209. plot(Node{Node{id}.req{k}.ip}.x,Node{Node{id}.req{k}.ip}.y,'ob','markerfacecolor','black');
  210. text(Node{Node{id}.req{k}.ip}.x,Node{Node{id}.req{k}.ip}.y,{Node{id}.req{k}.ip},'FontSize',7)
  211. is_die = 0
  212. break
  213. end
  214. end
  215. if is_die==0
  216. break
  217. end
  218. end
  219. frame=getframe(gcf);%绘制git动图
  220. imind=frame2im(frame);
  221. [imind,cm] = rgb2ind(imind,256);
  222. for g=1:10
  223. imwrite(imind,cm,'3.gif','gif','WriteMode','append','DelayTime',1e-4);
  224. end
  225. if is_die==0
  226. break
  227. end
  228. is_end = 1;
  229. for i=1:node_num+1
  230. if Node{i}.flag ~= 2
  231. is_end = 0;
  232. end
  233. end
  234. if is_end
  235. break
  236. end
  237. run_list = list;
  238. end
  239. if is_die==0
  240. turn
  241. break
  242. end
  243. clf;
  244. run_list=[];
  245. for i = 1:node_num+1
  246. plot(Node{i}.x,Node{i}.y,'ob','markerfacecolor','blue');
  247. Node{i}.flag = 0;%0表示未接收ADV和数据,1表示已接收ADV,2表示已有数据
  248. Node{i}.adv = 0;%记录节点接收来自哪一个节点的adv
  249. Node{i}.req{1}.ip= 0;%记录谁发来的req
  250. hold on;
  251. end
  252. end
  253. figure(2)
  254. A = cat(2,N_E); %绘制剩余能量图
  255. axis equal;
  256. axis([0,55,0,0.5]);
  257. bar(A);
  258. title('剩余能量图','Fontsize',20,'Color','m');

 

数据传递:

 

剩余能量:

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/944434
推荐阅读
相关标签
  

闽ICP备14008679号