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协议已没有问题,接下去就是对这些调试信息的分析,这应该是下一个话题了。 |
|