TOSSIM仿真之网络配置

  无线传感器网络时用到仿真软件TOSSIM,仿真时遇到一个核心问题就是网络的配置。如某论文里这样写到:"本文采用TOSSIM软件对xx算法和xx算法进行仿真,具体的网络配置为:600个节点随机分布于400m×400m区域中,无线信道对称,标准室内环境,背景噪声为-105.0dBm,高斯白噪声为4dB,节点传输速率为1Mbps,节点灵敏度为-108.0dBm,传输距离为50m"。一直不是很明白这些参数在仿真中是如何实现的,今天看了三份英文文档,稍微了解了一些。

  原来,TinyOS1.x中,传输过程中发生的错误是以概率的方式实现的。TOSSIM默认会查看“lossy.nss”文件,里面的内容格式如下:

  <mote ID>:<mote ID>:bit error rate

  例如:

  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

 
原文地址:https://www.cnblogs.com/yulele/p/2951957.html