TinyOS下TOSSIM仿真CTP

参考: http://blog.sina.com.cn/s/blog_67419c420100i664.html
最近在学习TinyOS,刚学着用TinyOS自带的仿真工具,才发现仿真真的是个好东西。跟着下面的步骤做一遍就知道是什么意思了,下面是在Ubuntu下终端的大体演示。
执行命令
         $   cd    /opt/tinyos-2.1.1/apps/tests/TestNetwork ( TestNetWork文件的源代码里带有仿真需要的文件,待会解释)
         $  make micaz sim    
我在Ubuntu12.04下装的TinyOS-2.1.1的在运行这一步会报错,后来查出来是gcc版本过高的问题,我把gcc降到gcc (Ubuntu/Linaro 4.5.3-12ubuntu2) 4.5.3就行了,参看这个http://blog.csdn.net/a183635870/article/details/50423959
 
会显示如下成功提示:***Successfully built micaz TOSSIM library
.
         $  export PYTHONPATH=$TOSROOT/support/sdk/python
         $  python test.py     即运行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):
       if 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算法为每个节点生成噪声模型:
        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()

你可能感兴趣的:(TinyOS)