本文将以自己的一个实例来进行详解:
我的ns-3版本为 ns-3-dev
/home/repos/ns-3-allinone/ns-3-dev/
本文将把一个高速公路车联自组网的模型添加到ns-3中。
一、编写代码
这一步,就要是编写相关的代码
本文代码见: http://download.csdn.net/detail/barcodegun/3710431
二、把自己编写的模块加入ns-3中
1. 文件结构
本文是一个高速公路车联自组网的模型,vanet
a. 在repos/ns-3-allinone/ns-3-dev/src目录下,添加新的模块
ns-3的模块,都在src目录下。自己创建的模块,也复制到此目录下。
我在 src 目录下新建 vanet 文件夹
gpf@guopengfei:~/repos/ns-3-allinone/ns-3-dev/src$ mkdir vanet
vanet 目录下文件结构
src/
vanet/
examples/
vanet-highway-test.cc
wscript
model/
controller.cc
controller.h
...
vehicle.cc
vehicle.h
test/
examples-to-run.py
vanet-temp-test.cc
wscript
文件初步说明:
examples主要是作者编写的该模块的相关例子。用户的实际例子,不需要放在这里,可以放在scratch目录下编译及执行。
model 主要为作者编写的该模块的核心代码。
test 主要为作者在编写代码过程中,编写的相关测试程序。
2.修改src/vanet/wscript文件
a. 把 src/spectrum/wscript 这个文件复制到 vanet目录下。
复制一个模版程序,直接修改该程序。
b. 我的src/vanet/wscript文件:
def build(bld):
obj = bld.create_ns3_module('vanet', ['network', 'propagation', 'core', 'wifi', 'mobility'])
obj.source = [
'model/controller.cc',
'model/highway.cc',
'model/lane-change.cc',
'model/model.cc',
'model/obstacle.cc',
'model/vehicle.cc',
]
obj_test = bld.create_ns3_module_test_library('vanet')
obj_test.source = [
'test/vanet-temp-test.cc',
]
headers = bld.new_task_gen('ns3header')
headers.module = 'vanet'
headers.source = [
'model/controller.h',
'model/highway.h',
'model/lane-change.h',
'model/model.h',
'model/obstacle.h',
'model/vehicle.h',
]
if (bld.env['ENABLE_EXAMPLES']):
bld.add_subdirs('examples')
c. 相关语法说明:
obj = bld.create_ns3_module('vanet', ['network', 'propagation', 'core', 'wifi', 'mobility'])
// vanet为创建的组件名, 最后文档生成后,将在repos/ns-3-allinone/ns-3-dev/build/debug/ns3/ 目录下,生成一个 vanet-module.h的文件
以后用户自己编写程序, #include "ns3/vanet-module.h" 就可以直接调用用户编写的这个模块了。
后面的network,propagation ... 是该模块在代码编写过程中,需要信赖的相关组件。
obj.source 表示该模块的源代码
obj_test 为该模块的测试相关文档
headers = bld.new_task_gen('ns3header') 是固定格式,用户不用改变。
headers.module = 'vanet'
headers.source = ... 用户对 .h头文件进行设置.
3.修改 src/vanet/examples/wscript
同上,先把src/spectrum/examples/wscript 这个文件复制到 vanet/examples目录下,再修改该文件,
我的文件:
def build(bld):
if not bld.env['ENABLE_EXAMPLES']:
return;
obj = bld.create_ns3_program('vanet-highway-test',
['core', 'mobility', 'network', 'wifi', 'vanet'])
obj.source = 'vanet-highway-test.cc'
4.修改 src/vanet/test/examples-to-run.py
同上,先把 src/spectrum/test/examples-to-run.py 复制到 vanet/test目录下,再修改该文件,
我的文件:
...
cpp_examples = [
("vanet-highway-test", "True", "True"),
]
# A list of Python examples to run in order to ensure that they remain
# runnable over time. Each tuple in the list contains
#
# (example_name, do_run).
#
# See test.py for more information.
python_examples = []
5. 在 src/wscript文件中添加该组件
gpf@guopengfei:~/repos/ns-3-allinone/ns-3-dev/src$ vim wscript
all_modules = [
'core',
'network',
'config-store',
'internet',
'propagation',
'point-to-point',
...
'tools',
'visualizer',
'point-to-point-layout',
'csma-layout',
'template',
'vanet',
]
注意上面最后一行 'vanet', 是我添加的该组件。
三、编译,完成最后的添加:
./waf configure --enable-examples --enable-tests
./waf build
显示结果:
Modules built:
aodv applications bridge
config-store core csma
csma-layout dsdv emu
energy flow-monitor internet
lte mesh mobility
mpi netanim network
nix-vector-routing ns3tcp ns3wifi
olsr point-to-point point-to-point-layout
propagation spectrum stats
tap-bridge template test
tools topology-read uan
vanet virtual-net-device visualizer
wifi wimax
注意上面的vanet ,表示此模块已经成功添加。
执行完成后,用户编写代码时:
#include "ns3/vanet-module.h"
即包含此模块。
vanet-module.h 文件在 repos/ns-3-allinone/ns-3-dev/build/debug/ns3/目录下,如果用户的组件为 new-template,则生成的组件名为 new-template-module.h,使用时引用该组件头文件即可。