在NS2中,如果选择使用Propagation/TwoRayGround作为无线信号传输模式,则默认的无线节点的传输范围 transmission range (TX_range)为250m,载波侦听范围physical carrier sensing range (PCS_range)是550m。
通常,载波侦听范围是信号传输范围的2.2倍,如果自己设置的话最好也按照2.2倍来计算设置,比如说30m–>66m等等。
进入到…\ns-allinone-2.29\ns-2.29\tcl\lib下,打开ns-default.tcl文件,查找"Phy/WirelessPhy"字符串,看到如下:
Phy/WirelessPhy set CPThresh_ 10.0
Phy/WirelessPhy set CSThresh_ 1.559e-11
Phy/WirelessPhy set RXThresh_ 3.652e-10
Phy/WirelessPhy set bandwidth_ 2e6
Phy/WirelessPhy set Pt_ 0.28183815
Phy/WirelessPhy set freq_ 914e+6
Phy/WirelessPhy set L_ 1.0
Phy/WiredPhy set bandwidth_ 10e6
其中,RXThresh_ 指的是receiving threshold (RTX),其值3.652e-10是由节点传输范围250m计算出来的。CSThresh_ 指的是carrier-sense threshold (CTX),它是由载波侦听范围550m计算出来的。因此,当我们想设定一个新的节点传输范围,只需要修改为对应的RXThresh_的值即可,那么如何求得一个节点传输范围对应的RXThresh_值呢?这就要用以下的方法:
- 打开 …\ns-allinone-2.34\ns-2.34\indep-utils\propagation 目录下的threshold.cc文件
- 将56行处 include<iostream.h> 改为 include ,并在下一行插入:
using namespace std;
,然后再添加一行#include<string.h>
- 执行命令
g++ -o hello threshold.cc
,可以看到在propagation文件夹下生成了一个可执行文件hello.exe - 执行
./hello -m TwoRayGround -fr 2.4e+9 250
,其中-m后的TwoRayGround为无线传传输模式,-fr后的2.4e+9为频率,250即为要修改到的节点传输范围,此处先用默认值试一下会运行出什么结果。可以得到:
可以看到最后得到的RXThresh_的值3.652e-10即为ns-default.tcl中的默认值(可见NS-2中默认的无线节点的传输范围确实为250m)。 - 执行
./hello -m TwoRayGround -fr 2.4e+9 550
,可以得到:
可以看到最后得到的RXThresh_的值1.55924e-11,这即为ns-default.tcl中CSThresh_的默认值。 - 假设要修改节点传输范围为20000m,则执行
./hello -m TwoRayGround -fr 2.4e+9 20000
,可以得到:
可得RXThresh_应该设置为8.91754e-18;
执行./hello -m TwoRayGround -fr 2.4e+9 44000
,可得:
可得CSThresh_应该设置为3.80675e-19; - 在自己的tcl脚本中,在
$ns_ node-config
与set node_(1) [$ns_ node]
之前加上:
Phy/WirelessPhy set CSThresh_ 3.80675e-19
Phy/WirelessPhy set RXThresh_ 8.91754e-18