无线传感器网络时用到仿真软件TOSSIM,仿真时遇到一个核心问题就是网络的配置。如某论文里这样写到:"本文采用TOSSIM软件对xx算法和xx算法进行仿真,具体的网络配置为:600个节点随机分布于400m×400m区域中,无线信道对称,标准室内环境,背景噪声为-105.0dBm,高斯白噪声为4dB,节点传输速率为1Mbps,节点灵敏度为-108.0dBm,传输距离为50m"。一直不是很明白这些参数在仿真中是如何实现的,今天看了三份英文文档,稍微了解了一些。
原来,TinyOS1.x中,传输过程中发生的错误是以概率的方式实现的。TOSSIM默认会查看“lossy.nss”文件,里面的内容格式如下:
例如:
0:1:0.012333
1:0:0.009112
1:2:0.013196
表示 0号节点 发送1bit数据给 1号节点,出错的概率是1.2%,1号节点 发送1bit数据给 0号节点,出错的概率是0.9%,依次类推。
在TinyOS2.x中,噪声模型更加复杂。无线链路的好坏主要由两个因素决定:无线信号(radio)的强弱和节点所处环境的背景噪声。因此,为了使仿真更加逼真,这两个数值都必须提供。南加州大学的研究人员已经构建了一个链路层模型。下面依次讲下这两个关键因素:
无线信号在传输过程中,可能会产生反射、衍射等,导致信号强度发生变化,这种变化可以总结为两个方面:
(1)相对于距离的增长,信号强度呈指数次衰减;
(2)如果距离一定,信号强度是随机的,呈对数正态分布。
另一个关键因素就是背景噪声,TOSSIM采用CPM(近模式匹配算法)仿真节点接收时遇到的射频噪声。CPM采用一个噪声记录作为输入,产生一个统计学模型,仿真射频脉冲及相关现象。下面是一段TinyOS文档中给出的仿真脚本:
#! /usr/bin/python from TOSSIM import * import sys t = Tossim([]) r = t.radio() f = open("topo.txt", "r") for line in f: //这段循环给出了节点间的信号强度 s = line.split() if s: print " ", s[0], " ", s[1], " ", s[2]; r.add(int(s[0]), int(s[1]), float(s[2])) t.addChannel("RadioCountToLedsC", sys.stdout) t.addChannel("Boot", sys.stdout) noise = open("meyer-heavy.txt", "r") //这段循环给出了每个节点的噪声模型 for line in noise: str1 = line.strip() if str1: val = int(str1) for i in range(1, 4): t.getNode(i).addNoiseTraceReading(val) for i in range(1, 4): print "Creating noise model for ",i; t.getNode(i).createNoiseModel() //创建了噪声模型,后面开始启动节点 t.getNode(1).bootAtTime(100001); t.getNode(2).bootAtTime(800008); t.getNode(3).bootAtTime(1800009); for i in range(100): t.runNextEvent()
问题的关键是如何生成上面的“topo.txt”和“meyer-heavy.txt”。TOSSIM有一个工具可以根据理论模型构建一个网络拓扑结构。这个工具是用Java写的,叫作net.tinyos.sim.PropagationModel。该工具使用一个配置文件作为输入,输出一个文档,里面给出了节点间的信号衰减,及单个节点的背景噪声。命令如下所示:
java net.tinyos.sim.PropagationModel config.txt
在配置文件config.txt中,我们设置网络参数,工具会自动生成相应的数据。
配置文件中内容怎么写,我们以一些实例说明:
例:49个节点均匀分布于100m×100m的正方形区域中,放在一个足球场环境中,背景噪声为-105.0dBm,标准差为4.0dB的高斯白噪声。最终的配置文件为:
PATH_LOSS_EXPONENT = 4.7;
SHADOWING_STANDARD_DEVIATION = 3.2;
D0 = 1.0;
PL_D0 = 55.4;
NOISE_FLOOR = -105.0;
S11 = 0.9;
S12 = -0.7;
S21 = -0.7;
S22 = 1.2;
WHITE_GAUSSIAN_NOISE = 4;
TOPOLOGY = 2;
NUMBER_OF_NODES = 49;
TERRAIN_DIMENSIONS_X = 100.0;
TERRAIN_DIMENSIONS_Y = 100.0;
其中:
D0:规定了一对节点间的最小距离,通常是1m;
PL_D0、PATH_LOSS_EXPONENT、SHADOWING_STANDARD_DEVIATION三个参数设置需根据环境:
WHITE_GAUSSIAN_NOISE:给出了附加的高斯白噪声的标准差(4dB-5dB之间);
NOISE_FLOOR:是网络所处的背景噪声(-110dBm到-104dBm之间);
S = [S11 S12; S21 S22]:[3.7 -3.3; -3.3 6.0]表示高水平不对称;[0.9 -0.7; -0.7 1.2]表示低水平不对称;
TOPOLOGY:有四个值可供选择。1表示GRID,区域被划分成网格,每个格中放置一个节点;2表示UNIFORM,可以看作GRID的一种变形,同样是将整个区域划分成一个个小区域,不过每个小区域中节点是随机放置的;3表示RANDOM,节点随机分布于整个区域中;4表示FILE,节点的位置又文件给出。
NUMBER_OF_NODES:如果是GRID或UNIFORM,每个节点的区域都必须是正方形;如果网络位置由用户直接给出,则不需要给出节点数。
TERRAIN_DIMENSIONS_X:网络所处区域的长度。
TERRAIN_DIMENSIONS_Y:网络所处区域的宽度。如果是均匀分布,X和Y必须相同。
GRID_UNIT:节点间距离,网络分布为GRID时需要使用。
TOPOLOGY_FILE:用户规定的节点位置的文件名。
写好网络配置文件后,运行命令:
$ javac LinkLayerModel.java
$ java LinkLayerModel configurationFileName
即可得到这样的拓扑文件,仿真时直接使用即可:
gain 1 2 -58.3
gain 2 1 -60.5
gain 1 3 -72.8
gain 3 1 -75.3
gain 2 3 -77.9
gain 3 2 -75.4
noise 1 -107.3 5
noise 2 -105.2 5
noise 3 -103.1 5
主要参考文档:
TinyOS1.x中TOSSIM网络配置:http://www.cs.berkeley.edu/~pal/pubs/nido.pdf
TinyOS2.x中TOSSIM网络配置:http://docs.tinyos.net/tinywiki/index.php/TOSSIM#Variables
配置文件格式:http://www.tinyos.net/tinyos-2.x/doc/html/tutorial/usc-topologies.html