- 论坛徽章:
- 0
|
如果在NS中做扩展代理模块。则需要新写这个模块。应用这个模块就要在tcl脚本中加入一段绑定的话:
set val(chan) Channel/WirelessChannel ;# channel type
set val(prop) Propagation/TwoRayGround ;# radio-propagation model
set val(netif) Phy/WirelessPhy/OFDM ;# network interface type
set val(mac) Mac/802_16/MBS ;# MAC type
set val(ifq) Queue/DropTail/PriQueue ;# interface queue type
set val(ll) LL ;# link layer type
set val(ant) Antenna/OmniAntenna ;# antenna model
set val(ifqlen) 50 ;# max packet in ifq
set val(nn) 3 ;# number of mobilenodes
set val(rp) DSDV ;# routing protocol
set val(x) 600 ;# X dimension of topography
set val(y) 600 ;# Y dimension of topography
set val(stop) 200.0 ;# time of simulation end
如上,如果我们在mac层应用的协议是802.11,则会写
set val(mac) Mac/802_11
当我们需要自己开发一个mac层协议时,我们首先需要考虑添加的协议名称。协议中的子类型。如协议名为802_16,802.16 mesh模式中有两种形式的节点,mesh base station 和 mesh sub station。于是需要在实现协议时,继承于802.16类,定义两个子类:802_16MBS,802_16MSS。通过一定的绑定机制,在tcl脚本中就可以写
set val(mac) Mac/802_16/MBS
或者 set val(mac) Mac/802_16/MSS
这两句话在tcl脚本中的意思是分别定义两种节点,一种节点是MBS类型。另一种是MSS类型。
具体定义方式:
#============================================
# Initial variances about C++ class type
#============================================
set val(chan) Channel/WirelessChannel ;# channel type
set val(prop) Propagation/TwoRayGround ;# radio-propagation model
set val(netif) Phy/WirelessPhy/OFDM ;# network interface type
set val(mac) Mac/802_16/MBS ;# MAC type
set val(ifq) Queue/DropTail/PriQueue ;# interface queue type
set val(ll) LL ;# link layer type
set val(ant) Antenna/OmniAntenna ;# antenna model
set val(ifqlen) 50 ;# max packet in ifq
set val(nn) 3 ;# number of mobilenodes
set val(rp) DSDV ;# routing protocol
set val(x) 600 ;# X dimension of topography
set val(y) 600 ;# Y dimension of topography
set val(stop) 200.0 ;# time of simulation end
### some variances initial ###
#============================================
# set Trace and Topo
#============================================
*
* tcl code
*
#============================================
# Configure for Node
#============================================
$ns node-config -adhocRouting $val(rp) \
-llType $val(ll) \
-macType Mac/802_16/MBS \
-ifqType $val(ifq) \
-ifqLen $val(ifqlen) \
-antType $val(ant) \
-propType $val(prop) \
-phyType $val(netif) \
-channel [new $val(chan)] \
-topoInstance $topo \
-agentTrace OFF \
-routerTrace OFF \
-macTrace ON \
-movementTrace OFF
在上面代码下面定义节点:
#============================================
# Initial node - MBS
#============================================
set node_(0) [$ns node]
$node_(0) set X_ 200
$node_(0) set Y_ 200
$node_(0) set Z_ 0.0
$ns initial_node_pos $node_(0) 30
[$node_(0) set mac_(0)] set-channel 0
若需要定义MSS类型的节点,则接着写:
#============================================
# Initial node - MSS
#============================================
$ns node-config -macType Mac/802_16/MSS \ ;#此处只能写这些,不能把路由,ll层等的绑定再写一遍
-macTrace ON
set node_(1) [$ns node]
$node_(1) set X_ 300
$node_(1) set Y_ 300
$node_(1) set Z_ 0.0
$ns initial_node_pos $node_(1) 30
[$node_(1) set mac_(0)] set-channel 0
set node_(2) [$ns node]
$node_(2) set X_ 200
$node_(2) set Y_ 300
$node_(2) set Z_ 0.0
$ns initial_node_pos $node_(2) 30
[$node_(2) set mac_(0)] set-channel 4
这样,就声明了MBS和MSS的节点。具体工作过程就要看c++的实现函数了。
那么怎样完成c++与otcl在此处的绑定呢?方法如下:
1,先为父类写绑定函数:
/**
* TCL Hooks for the simulator for wimax mac
*/
static class Mac802_16Class : public TclClass {
public:
Mac802_16Class() : TclClass("Mac/802_16") {}
TclObject* create(int, const char*const*) {
return (new Mac802_16());
}
} class_mac802_16;
2,为子类写绑定函数:
/**
*TCL Hooks for the simulator for wimax mac
*/
static class Mac802_16MBSClass : public TclClass {
public:
Mac802_16MBSClass() : TclClass("Mac/802_16/MBS") {}
TclObject* create(int, const char*const*){
return(new Mac802_16MBS());
}
} class_mac802_16MBS;
通过上述步骤,则实现了声明。当在tcl中写 -macType Mac/802_16/MBS \时,ns会自动寻找相应的解析函数,于是调用new Mac802_16MBS();完成对该类的初始化,形成这个类的一个对象。
版权声明
:转载时请以超链接形式标明文章原始出处和作者信息及
本声明
http://citynight.blogbus.com/logs/11389299.html
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/54783/showart_1006184.html |
|