如何在ns2中添加一个新的协议

如何在ns2中添加一个新的协议,第1张

如果我们要往NS2中添加自己的模块,那么我们至少要实现两个类:

一, 首先要有一个类继承自TclObject类或者其子类,例如这个Mac802_16类的继承关系为:TclObject/NsObject/Mac /Mac802_16.这个类里面实现了C++类里面的变量与Otcl类的变量的绑定关系,以及我们的模块要实现的一系列算法等等,这个类负责的就是协议 的实现。

这个类,一般需要有构造函数中执行变量的绑定,使用bind()函数,将Otcl变量与C++的成员变量绑定起来。

声 明为protected的command()函数:为Otcl类提供方法,对Otcl中的类的方法进行翻译并执行;对于没有考虑到的或者不能解析的命令, 调用该C++类的父类的command方法。当在Otcl类中调用某个方法时,首先去tcl类中查找并执行该方法;若查找失败,则在该Otcl类对应的 C++类的command方法中查找,若查找仍然失败,则沿着该类的父类一直往上找,尝试调用它们的command方法;若所有父类的command方法 都不能解析,则报告该命令无法执行。

其他的成员变量和成员函数,这是用于实现自己的算法模块的内容。

二,其次我们要定义一个声明为static的类,继承自TclClass类,这个类实现了C++环境里面的类与Otcl环境里面的类的关联,简单点来说,这个类负责与Otcl环境进行关联。取最开头的那段代码

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

这 一段代码里面,包含了一个将Otcl的类名作为参数传给其父类的构造函数;一个create方法:创建一个C++类的对象实例并返回;该方法的返回类定义 为TclObject*。C++类的类型包含在create方法中,Otcl类的类型包含在TclClass类的构造函数中,因此可以实现C++类和 Otcl类的连接。

接下来,如果我们要实现的类完成以后,将头文件和源文件放置于~ns目录下自己新建的一个子目录,然 后打开~ns/Makefile文件,将“类名.o”添加到该Makefile的OBJ_CC宏定义中,对ns进行编译的时候就能够能够找到该模块的源文 件并将其编译到ns中;如果类中定义了一些变量,打开~ns/tcl/lib/ns-default.tcl文件,为该类对应的Otcl类设置一些初始 值。最后,对Makefile执行指令:make clean,make,对整个ns重新编译,我们的模块就可以添加到ns2中了。

ns2中无论添加什么协议,在添加完之后,都要执行命令:make和make install如果你不执行的话,每次使用的ns可执行文件并不是最新编译的那个。你的问题在于没有运行make install

其实 只需要编写一个.tcl脚本文件

set val(mac)Mac/802_11

然后要配置节点参数时 指定

$ns_ node-config- -macType $val(mac)即可

附上例子一枚:

set val(chan) Channel/WirelessChannel#Channel Type

set val(prop) Propagation/TwoRayGround # radio-propagation model

set val(netif) Phy/WirelessPhy# network interface type

set val(mac)Mac/802_11 # MAC type

set val(ifq)Queue/DropTail # 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) 10 # number of mobilenodes

set val(rp) DumbAgent # routing protocol

set val(x) 600

set val(y) 600

Mac/802_11 set dataRate_ 11Mb

#Phy/WirelessPhy set CSThresh_ 10.00e-12

#Phy/WirelessPhy set RXThresh_ 10.00e-11

#Phy/WirelessPhy set Pt_ 0.1

#Phy/WirelessPhy set Pt_ 7.214e-3

# Initialize Global Variables

set ns_ [new Simulator]

set tracefd [open infra.tr w]

$ns_ trace-all $tracefd

# set up topography object

set topo [new Topography]

$topo load_flatgrid $val(x) $val(y)

# Create God

create-god $val(nn)

# Create channel

set chan_1_ [new $val(chan)]

$ns_ node-config -adhocRouting $val(rp) \

-llType $val(ll) \

-macType $val(mac) \

-ifqType $val(ifq) \

-ifqLen $val(ifqlen) \

-antType $val(ant) \

-propType $val(prop) \

-phyType $val(netif) \

-topoInstance $topo \

-agentTrace OFF \

-routerTrace OFF \

-macTrace ON \

-movementTrace ON \

-channel $chan_1_

for {set i 0} {$i <[expr $val(nn)]} {incr i} {

set node_($i) [$ns_ node]

$node_($i) random-motion 0 # disable random motion

set mac_($i) [$node_($i) getMac 0]

$mac_($i) set RTSThreshold_ 3000

$node_($i) set X_ $i

$node_($i) set Y_ 0 # Horizontal arrangement of nodes

$node_($i) set Z_ 0.0

}

#Set Node 0 and Node $val(nn) as the APs. Thus the APs are the ends of the horizontal line. Each STA receives different power levels.

set AP_ADDR1 [$mac_(0) id]

$mac_(0) ap $AP_ADDR1

set AP_ADDR2 [$mac_([expr $val(nn) - 1]) id]

$mac_([expr $val(nn) - 1]) ap $AP_ADDR2

#$mac_([expr $val(nn) - 1]) set BeaconInterval_ 0.2

$mac_(1) ScanType ACTIVE

for {set i 3} {$i <[expr $val(nn) - 1]} {incr i} {

$mac_($i) ScanType PASSIVE #Passive

}

$ns_ at 1.0 "$mac_(2) ScanType ACTIVE"

Application/Traffic/CBR set packetSize_ 1023

Application/Traffic/CBR set rate_ 256Kb

for {set i 1} {$i <[expr $val(nn) - 1]} {incr i} {

set udp1($i) [new Agent/UDP]

$ns_ attach-agent $node_($i) $udp1($i)

set cbr1($i) [new Application/Traffic/CBR]

$cbr1($i) attach-agent $udp1($i)

}

set base0 [new Agent/Null]

$ns_ attach-agent $node_(1) $base0

set base1 [new Agent/Null]

$ns_ attach-agent $node_(8) $base1

$ns_ connect $udp1(4) $base0

$ns_ connect $udp1(5) $base1

$ns_ at 2.0 "$cbr1(4) start"

$ns_ at 4.0 "$cbr1(5) start"

$ns_ at 10.0 "$node_(4) setdest 300.0 1.0 30.0"

$ns_ at 20.0 "stop"

$ns_ at 20.0 "puts \"NS EXITING...\" $ns_ halt"

proc stop {} {

global ns_ tracefd

$ns_ flush-trace

close $tracefd

exit 0

}

puts "Starting Simulation..."

$ns_ run


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11895124.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存