TinyOS下TOSSIM仿真CTP

TinyOS的仿真真的是个好东西,跟着下面的步骤做一遍就知道是什么意思了,下面是在Ubuntu下终端的大体演示。
执行命令

cd /opt/tinyos-2.1.1/apps/tests/TestNetwork
make micaz sim    

TestNetWork文件的源代码里带有仿真需要的文件,待会再解释 。
我在Ubuntu12.04下装的TinyOS-2.1.1的在运行这一步会报错,后来查出来是gcc版本过高的问题,把gcc降到gcc (Ubuntu/Linaro 4.5.3-12ubuntu2) 4.5.3就行了,参看这个 https://my.oschina.net/u/3744410/blog/1802019

会显示如下成功提示:***Successfully built micaz TOSSIM library

运行test.py,即输入:

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

如果成功的话屏幕会出现一堆带有类似下图所示信息: 调试的输出信息

等会再来解释上面的这些信息都是干嘛的,首先说下test.py是干嘛用的,我们要先配置网络拓扑结构使TOSSIM中的节点能相互通信,TOSSIM默认使用基于信号强度的模型,因而需要每两个节点间的增益,这是由radio对象中的add()方法实现的,代码如下:

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

其中src中源节点,dest是目的节点,gain是源到目的的增益。由于源到目的与目的到源的增益可能是不同的,因而要分开指定。 一般的仿真,网络中都会有至少上百个节点,手动一个个添加增益是不大现实的。我们用一个文件记录所有节点对间的增益,一行一个,每行的格式如下:

gain <源节点号> <目的节点号> <增益>
<..>内用具体数值代替。

用python脚本可以轻松地将这些增益值添加到radio对象,test.py文件里的下面这段代码就是做这个事的。

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

其中sparse-grid.txt中我们看到类似后面的语句gain 0 1 -90.80,这就是表明0号点到1号点的增益,一般-70 -80的都是能通信的, -120或者更小就无法通信了。
另外,TOSSIM使用CPM算法仿真RF模块的噪声。该算法需要先读入若干个噪声记录,然后生成噪声模型。我们使用斯坦福大学Meyer实验室提供的噪声记录meyer-heavy.txt,它是每行一个噪声值。下面的test.py代码是为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算法为每个节点生成噪声模型:

扫描二维码关注公众号,回复: 78683 查看本文章
for i in range(0,10):
    t.getNode(i).createNoiseModel()

那么我们做了这些东西都是干嘛的?说白了就是构造虚拟的点你来设定他们之间的通信增益啥的,然后用来调试你的代码。
test.py里还有下面的代码,这代码就是打开dbg通道的,下面代码即表明Forwarder和TestNetworkC的deg信息都会打印出来,终端打的DEBUG (x)表示的是第x个节点的deg信息。如果自己想随意添加deg信息,只要带上字样就行,参考下面的代码。

#t.addChannel("AM", sys.stdout)
#t.addChannel("TreeRouting", sys.stdout)
#t.addChannel("TestNetworkC", sys.stdout)
#t.addChannel("Route", sys.stdout)
#t.addChannel("PointerBug", sys.stdout)
#t.addChannel("QueueC", sys.stdout)
#t.addChannel("Gain", sys.stdout)
  t.addChannel("Forwarder", sys.stdout)
  t.addChannel("TestNetworkC", sys.stdout)
#t.addChannel("App", sys.stdout)
#t.addChannel("Traffic", sys.stdout)
#t.addChannel("Acks", sys.stdout)
while (t.time() < 1000 * t.ticksPerSecond()):
        t.runNextEvent()

猜你喜欢

转载自my.oschina.net/u/3744410/blog/1802120