汽车发票抵扣联什么用:在Tinyos 2.x下用TOSSIM仿真CTP协议

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 07:24:52
1.让节点间可以通信

不做任何设置的话,TOSSIM中的节点是无法互相通信的。因此我们要先配置网络拓扑结构。TOSSIM默认使用基于信号强度的模型,因而需要每两个节点间的增益,这是由radio对象中的add()方法实现的,代码如下:

t = Tossim([])
r = t.radio()
r.add(src, dest, gain);


其中src中源节点,dest是目的节点,gain是源到目的的增益。由于源到目的与目的到源的增益可能是不同的,因而要分开指定。


一般的仿真,网络中都会有至少上百个节点,手动一个个添加增益是不大现实的。我们用一个文件记录所有节点对间的增益,一行一个,每行的格式如下:
gain <源节点号> <目的节点号> <增益>

<..>内用具体数值代替。

用python脚本可以轻松地将这些增益值添加到radio对象,假设文件名为topo.txt:

f = open("topo.txt","r")
lines = f.readlines()
for line in lines:
 s = line.split()
 if (len(s) > 0):
  if s[0] == "gain":
  r.add(int(s[1]), int(s[2]), float(s[3])


另外,TOSSIM使用CPM算法仿真RF模块的噪声。该算法需要先读入若干个噪声记录,然后生成噪声模型。我们使用斯坦福大学Meyer实验室提供的噪声记录meyer-heavy.txt,它是每行一个噪声值。接下来我们先为10个节点各自添加噪声值:

noise = open("meyer-heavy.txt", "r")
lines = noise.readlines()
for line in lines:
 str = line.strip()
 if (str != ""):
  val = int(str)
  for i in range(0, 10):
  m = t.getNode(i)
  m.addNoiseTraceReading(val)


再用CPM算法为每个节点生成噪声模型:

for i in range(0,10):
 t.getNode(i).createNoiseModel()


现在节点间终于可以通信了。何以见得?拿最简单的示例程序tinyos-2.x/apps/RadioCountToLedsC来试试手先:

1) 在tinyos-2.x/apps/RadioCountToLedsC目录下新建一个test.py文件,写入如下内容:

#!/usr/bin/env python
from TOSSIM import *
from random import *
import sys

nrNodes = 225
t = Tossim([])
r = t.radio()

f = open("topo.txt", "r")
lines = f.readlines()
for line in lines:
 s = line.split()
 if len(s) > 0:
  if s[0] == "gain":
  r.add(int(s[1]), int(s[2]), float(s[3]))

noise = open("meyer-short.txt", "r")
lines = noise.readlines()

for line in lines:
 str = line.strip()
 if(str != ""):
  val = int(str)
  for i in range(0,nrNodes):
  m = t.getNode(i)
  m.addNoiseTraceReading(val)

for i in range(0, nrNodes):
 t.getNode(i).createNoiseModel()

for i in range(0, nrNodes):
 time = randint(t.ticksPerSecond(), 10 * t.ticksPerSecond())
 t.getNode(i).bootAtTime(time)

t.addChannel("RadioCountToLedsC", sys.stdout)
t.addChannel("boot", sys.stdout)

for i in range(0, 100000):
 t.runNextEvent()



2) 从上面的代码可以看到,test.py需要读入两个文件topo.txt和meyer-short.txt,去
tinyos-2.x/apps/tests/TestNetwork/找到它们并拷到当前目录下。

3) 编译TOSSIM程序:make micaz sim,修改test.py权限:chmod +x test.py,运行之:./test.py,接着便是华丽的刷屏...仔细的看下输出,可以看到各节点的发送和接收状况。


2. 仿真CTP协议
接下来要仿真的CTP协议比RadioCountToLedsC可要复杂的多,但仿真的方法还是一样的。我们先使用tinyos- 2.x/apps/tests/TestNetwork中现成的代码进行仿真,看看效果如何。先了解下这个程序的功能:用到了collection和 dissemination,设了一个根节点,周期性的把当前节点的父节点地址、ETX值等信息通过汇聚树发送到基站,发送周期可以通过 dissemination来改变。

闲话少说,先仿真之:

make micaz sim
export PYTHONPATH=$TOSROOT/support/sdk/python
python test.py


输出许多调试信息,大多数都是ForwardingEngine的,怎么不见路由引擎和链路估计的信息呢?且看test.py,内容与上次的差别不大。注意到TreeRouting的channel被注释了,而LinkEstimator的压根就没加。加之:

t.addChannel("TreeRouting", sys.stdout)
t.addChannel("LI", sys.stdout)


再仿真一次,可以就看到路由引擎和链路估计的信息。

至此,仿真CTP协议已没有问题,接下去就是对这些调试信息的分析,这应该是下一个话题了。