ONE readme study

1.这个是DTN的专用仿真器,提供了移动追踪的生成工具,运行不同路由协议下的DTN 消息仿真,提供可视化界面,交互显示实时仿真结果以及仿真结束后的结果。

2.Compiling(编译)

直接去官方网站下载对应版本的源代码,然后进入one那个文件夹,可以看到一个compile.bat的批处理文件,在shell里面运行./compile.bat就完成了编译。

至于在Eclipse下的编译,暂时先不管吧

3.Running(运行)

使用./one.sh来运行脚本

语法概要: one.sh [-b runcount] [conf-files]
在windows下是:
one.bat [-b runcount] [conf-files] 

选项说明:-b

意思是以批处理模式来运行,不启动GUI界面,只是在terminal中打印出过程信息。后面的runcount的意思是运行的次数,如果有多个的话,用逗号分隔开。

参数:conf-files

里面存放的是仿真参数,可以读取多个配置文件,它们按顺序来读取,后面的文件的值会覆盖前面的,这个就比如说默认第一个读取的是default那个,所以新的配置文件只需要改动一些就可以用,比如epidemic,就只改了名字,其它的还是用默认的

4.Configuring(配置)

1)所有的仿真参数都被写在配置文件中,这些文件通常是包含有键值对的文本文件,大多数的变量的语法是:

Namespace.key=value       //如果参数不止一个,用逗号隔开

Namespace以大写开始,并且使用驼峰式写法,key也是使用驼峰式写法,但是首字母小写,Namespace粗略地定义了这些设置能够作用到的仿真环境的部分。很多(但不是全部)namespaces都等于类名,特别是movement models, report modules, routing modules都遵从这种惯例。

2)数字可以用“.”来表示10进制的分隔符,也就是表示小数,并且可以用"k","M","G"后缀表示千,兆等,boolean类型的设置可以接受"true","false","0"或者"1"

3)很多设置定义了外部的数据文件,这些文件的路径可以是绝对的也可以是相对的,但是路径必须使用“/”分隔符

4)使用"#"来进行注释

5)如果有default_settings.txt存在,那么它永远都是第一个被读取,其他的配置文件以参数的形式跟在后面,定义更多的设置,或者重写前面的文件的设置。意思就是,你可以在前面的配置文件中先定义一些大多数都会用到的设置,然后使用不同的配置文件来运行不同的,特别是仿真。


5.Run Indexing

是一种功能,可以允许你仅仅使用一个配置文件就可以运行大量的不同的配置。意思就是,你提供一组设置,以方括号的形式,比如 

MovementModel.rngSeed=[1;2;3;4;5]          //原型是  Namespace.key=[run1value;run2value;run3value;etc]
然后,如果你如下运行仿真:

./one.sh -b 5 my_config.txt

这样的话就会依次运行仿真,这里必须使用batch模式,要不然会默认使用第一个index打开GUI

这样的好处是,比如你有2组不同的设置,每一组都有超过一个设置(比如说第一组2个,第二组3个),那么如果你运行的时候把-b后面的参数设置为6的话,系统会自动对他们进行排列组合,运行6种不同的组合 

(一)Movement Models

1.Movement Models用来管理nodes在仿真中移动的方式。他们为nodes提供位置,速度和暂停时间。

2.基本的安装提供了5种movement models: 1)random waypoint, 2)map based movement,3)shortest path map based movement,4)map route movement,5)external movement

除了external movement之外,其它的都有配置速度和暂停时间分布, 在最大和最小值已知的情况下,movement model 在已知的范围内定义均匀分布的随机值。 在external model 中,speeds and pause time 都从所给数据中提取。

1)当node使用
random waypoint movement model 的时候,它的位置会在仿真区域里面随机分配。nodes会以固定的速率朝着目标直接移动,停顿一会儿,然后获取新的位置。然后就这样一直持续直到仿真结束。

2)Map-based movement model将node的movement限制在预先设定好的路径中。用户能为不同的node groups定义各种不同的paths,比如,汽车不能在室内和人道上行驶。在设定movement model的时候就引入外部的mapFile,默认有4个。

a) 最基本的map-based movement model (MapBasedMovement) 将nodes分配在map中的节点处,然后就朝着下一个相邻的节点移动,当移动到下一个节点的时候,随机选取下一个相邻的节点移动,但是不能选择来的路,除非无路可选。一旦node已经移动了10-100个连接处,那么它就暂停一会儿,然后继续开始移动。

//我觉得这种适合人的行走路线

b) 更加随机的map-based movement model是ShortestPathMapBasedMovement,它使用Dijkstra的最短距离算法来计算出它的路径。当一个node到达了它目前需要到的节点以后,并且已经停留了一会儿,然后一个新的随机的节点又产生了,然后这个node就按照最小路径朝那个节点运动过去。

对于这一种model,map data还可以包含
Points of Interest(POIs) 。与其随机地选择下一个节点作为终点,这个movement model 可以被配置成给定一个递属于某个POI group的并且服从一定可配置的概率分布的POI。可以有任意数量的POI groups,每个group都可以有任意数量的POIs。POIs可以用来模拟比如说shops,restaurants,tourist attactions等等。

4)Route based movement model (MapRouteMovement)使nodes按照既定的路线来移动,比如公共汽车,tram等等,只需要在route上面定义一些stops,然后nodes就会使用最小路径stop-by-stop的移动,并且在stops那里停留一段时间(在配置里面说明多少时间)。

以tram为例,routeFile就是data里面的tramN.wkt文件,然后是routeType,选择到了折回还是从头开始。等等。

3. 所有的movement models也能够决定什么时候node是 active 的(moves and can be connected to),什么时候不是 active的,除了external movement之外,所有的movement models都可以设定多个仿真时间间隔,然后那个group的nodes仅仅在那段时间里面是active的。

接下来这一大段话都是说明怎样创建地图和相关的东西

movement model的设定是通过"movementModel"这个key,value必须是movement package里面有效的movement model类,对于所有movement models都适用的设置从MovementModel这个类里面读取,其它特定的就从特定的类里面读取。参见javadoc文档和配置文件的实例。

(二)Routing modules and message creation

Routing modules 定义了在仿真的过程中messages是怎样被处理的。有6种active routing modules (First Contact, Epidemic, Spray and Wait, Direct Delivery, PRoPHET and MaxProp),还有passive router,它是用于external 路由仿真。active routing modules就是DTN的路由算法的实现。

关于passive routing,我暂时没有花时间去了解。

总之关于routing module的用法就是在各个node group中定义设置“router”这个参数, 所有的routers不能互相交互,只有同类的router可以和同类的router一起工作,所以,通常来说,对所有的group使用相同的router是更有意义的 。所以这个一般是在Group的时候就定义,这样就可以是所有Group都默认使用相同的routing算法。

(三)Reports

Reports可以用来创建仿真的summary data,connections and messages 的 detailed data,用于进一步后期处理的文件(比如说用来创建图像的Graphviz,以及用于和其它程序交互的接口)等等。对于任意一个仿真,可以有任意个reports,report的数量通过设置"Report.nrofReports"参数来确定。report类的名字通过设定“Report.reportN”参数来确定,其中N为从1开始的整数。参数值必须是report package中的有效report类的名字。所有report的输出路径必须使用Report.reportDir设置,详情参见一些配置文件。如果没有"output"设置,那么生成的report文件名就是“ReportClassName_ScenarioName.txt”.

所有的reports都有很多可以使用 ReportClassName.settingKey来定义的配置设置 。具体参见javadoc

(四)Host Groups

host group的意思就是一组共享movement 和 routing module setting的nodes。不同的groups可以设置不同的参数值,这样它们就能表示不同类型的nodes。基础设置可以在名为"Group"的namespace中进行设置,不同的node groups可以在自己特定的namespace(比如说Group1,Group2)种重写这些设定,而且也可以定义新的设置。

默认的情况,就是先在Group中设定,比如说Group.nrogHosts=40,那么如果在Group1中没有提及,就默认为40个,比如说要是在Group4中重写了Group4.nrofHosts=2,那么Group4就改为2个host了。
 

The Settings

有很多settings需要来配置,具体的详情参见javadoc,特别是report, routing 和 movement model类。下面列举一些可能最为重要的一些设置:

1.Scenario Settings

1) Scenario.name

这个就是scenario的名字,比如说Epidemic,比如说default_scenario比如,hcs_floating,所有report files都默认使用这个名字

2) Scenario.simulateConnections

connections是不是应该被simulated,写true或者false,如果你仅仅对movement modeling 感兴趣,那就可以disable这个,这样可以得到更快的仿真,但是,通常来说,你会希望这个是开着的(默认设置是true)

3) Scenario.updateInterval

隔多少时间update一次,这个参数的值增加就会得到更快的simulation,但是随之而来的是精度的降低。从0.1到2这个区间的值比较适合仿真。默认值为0.1,我看大多数的配置文件也都配置的是0.1。

4) Scenario.endTime

设定仿真的时间,表示多久以后结束,默认设置是"8k"

5) Scenario.nrofHostGroups

表示此仿真有多少node groups,默认值为6

2.Host Group Settings(在Group或者GroupN namespace中使用)

1) groupID

Group的标识符(可以是一个字符串或者字符),作为host name的前缀,显示在gui和report中。host的full name是groupID+networkAddress。例子中好像都是一个字母。

2)nrofHosts

这个group中的host的数量

//我发现在默认设置中,transmitRange和transmitSpeed都是在interface处进行设置

3) transmitRange

就是这个host的radio devices的范围(以meters计算),我觉得好像就是蓝牙,wifi之类的东西的模拟范围,例子中写的是“10”,也就是10米的意思

4) transmitSpeed

host的radio devices的传输速率(bytes/second),注意,这里是byte,也就是Byte, 1byte=8bit,所以例子中本来想使用2Mbps,实际写的时候写的是250k,因为250k Bps = 2M bps。

5) movementModel

就是这个group里面所有的host都使用的movement model。可以先在Group里面设置一个,比如说默认的是ShortestPathMapBasedMove ment,然后再在具体的GroupN里面设置具体的,必须是movement package中已有的有效的类,比如说MapRouteMovement。

6) waitTime

最小和最大等待时间的时间区间(seconds),定义当从当前路径到达一个目的地之后,需要在同一个地方停留多久。在时间区间中产生一个新的随机数字用于新的路径。默认值是 “0,120”

7) speed

最小和最大的速率区间(m/s),定义node移动得有多快,在速率区间产生一个新的随机数字用于新的路径。默认值为"0.5,1.5"

8) bufferSize

node的message buffer的大小(bytes),当buffer满了以后,node不能再接收任何messages,直到它从buffer里面drop掉老的message。默认值是“5M”,特定值是“50M”。

9) router

用于route messages 的 router module,必须是routing package里面的有效的类。默认的是“PassiveRouter”。

10) activeTimes

group中的nodes应该被active的时间区间(start1,end1,start2,end2, ...),如果没有定义区间的话,那么nodes将一直处于active的状态。默认的设置是没有设置,也就是说默认nodes都处于active的状态。

11) msgTtl

就是说这个group里面创建的messages的存活时间( 仿真的分钟,也许和实际的分钟不一样 )。nodes每分钟都会check他们的messages的ttl是不是过期了,然后drop掉过期的messages。如果没有定义ttl,那么就是无限大。默认的设置是60,但是被注释掉了。

3.Group and movement model specific settings (only meaningful for certain movement models)

1) pois -这个仅仅能适用于ShortestPathMapBasedMove ment类型的movement models,貌似也没有被改过

Poins Of interest indexes and probabilities (poiIndex1,poiProb1,poiIndex2,poiProb2,...),indexes为整数,probabilities是范围在0.0-1.0之间的十进制的数值。

在/data文件夹中有很多wkt类型的文件。

2) okMaps -这个settings只能用于任意的MapBasedMovement类型的movement model。

确定哪个map node类型(参照map file indexes)对于group来说是ok的。nodes不会经过对于他们来说不ok的map nodes。默认情况下,所有map nodes都ok。

我只看到配置文件中的car Group有这个设置。取值为1。也许是这样的,就是后面有个设置是mapFile,因为第一个,即mapFile1=data/roads.wkt,所以鉴于汽车只能走公路,所以设定为1。不过这个有待于进一步考证。

3) routeFile -前提就是使用了 MapRouteMovement 类型的movement model

这个setting定义了route需要被读取的地方(route文件)。这个route file通常在data这个文件夹中,wkt格式,里面的内容哦是以LINESTRING加上括号,然后括号里面是一系列的数字,每个数字代表的是要停留的stop。

比如说tram,就使用data文件夹中的tramN.wkt文件就OK

4) routeType -前提也是使用了 MapRouteMovement 类型的movement model

定义了route type。2种选择,一种叫Circular(取值为1),意思是当到达这个path的最后一个node的时候,下一个node就是第一个node。另一种叫ping-pong(取值为2),意思是当到达这个path的最后一个node的时候,反方向进行。具体实现要看java源代码(movement.map.MapRoute这个类)。

4.Movement Model Settings

1) MovementModel.rngSeed

所有movement models的随机数产生器的种子。如果seed以及所有和movement model相关的设置都一样的话,那么所有的nodes在不同的仿真中都会按照同样的方式来移动(也就是所有的都是同样的目的地,速度,等待时间)。

默认的设置值是1

2) MovementModel.worldSize

仿真world的大小(meters),两个由逗号分开的数值:width,height,默认的是4500,3400

3) PointsOfInterest.poiFileN -这个仅仅适用于 ShortestPathMapBasedMovement

定义了POI坐标应该从哪里读取,都是使用WKT文件。结尾处的N必须是正整数。比如poiFile1,poiFile2,这个通常也跟默认值一样,也就是说就把那些什么shops,parks之类的东西导进来,貌似也从来没有被改过。

4) MapBasedMovement.nrofMapFiles

寻找在settings file 中有多少map file的settings,在赫尔辛基的地图上有4个文件,都是默认值,没有被改过

5) MapBasedMovement.mapFileN

跟上面的POI一样,就是导入WKT文件,详情看配置文件,这个通常也就跟默认值一样,就是把那些road,shop之类的导进来。

这个也没有被改过,4个地图文件依次被导进去。

5.Report Settings

1) Report.nrofReports

意思是导入多少个report modules。有了这个数字以后,具体的每一个report的语法就是比如说“Report.report1=MessageStatsReport”,后面这个值必须是report package中已有的


2) report.reportDir

输出文件存放的地方,可以是绝对路径或者相对路径,一般就使用默认值,在/report 文件目录下

3) Report.warmup



6.Event Generator Settings

1) Events.nrof

默认值是1

2) EventsN.class

要导入的generator类的名字,这个类必须在输入package中找得到。如果上面的nrof是1的话,那么这个N就一直是1,然后将package里面的其中一个类的名字赋值给它,比如说   Event1.class=MessaeEventGenerator

7.Other Settings

Optimization.randomizeUpdateOrder
 

GUI

GUI的主窗口分成了3个部分,主体部分显示node的movement,仿真和GUI控制,以及一些信息。右边的部分用于选择node,下面的部分是用于logging和breakpoints(断点,暂时不知道是什么意思)。

1.主体部分

1)主体部分的最上面的部分是用于仿真和GUI控制的。

第一部分显示的是当前已仿真的时间,接着是仿真速率(simulated seconds per second,可能就是每秒钟仿真的时间),再接下来的4个按钮分别是停止,步进,快进,快进到给定的时间。

多次点击step按钮,仿真就会step-by-step地运行。

Fast Forward 可以用于跳过那些仿真中不感兴趣的部分。在快进中,GUI update的速率设定为一个很大的值。

下一个下拉菜单就是为了设定GUI update速率。Speed 1代表GUI 每个simulated second更新一次,Speed 10代表每隔10秒更新一次。负数代表减慢更新速度。

这里我后来发现一个问题,就是GUI这个上面的速度并不会更改任何仿真速度,仿真速度是由配置文件的参数来决定的,在GUI上面的更改只是更改了显示更新的速率,和实际仿真速率毫无关系。

接下来的下拉菜单用于放大和缩小主体部分

最后一个按钮screen shot将当前主体部分保存为png格式的图片

2)中间的部分就是显示

比如说显示一些node的位置,map的path,node的标识符(c23,w87什么的),node之间的connections等等。

所有的node都被显示成一个小矩形,然后他们的radio range显示为一个绿色的圆环包围在这个矩形周围。node的标识符和网络地址(一个数字)(就像前面说的c23,w87一样)就显示在小矩形旁边。如果一个node有携带message,那么每个message都被表示成为一个绿色或者蓝色的实心的矩形,若有多个messages的话,就蓝绿重叠起来放置。如果一个node携带了超过10条messages,那么会另外产生一列矩形,每10条一个红色的矩形,不过仍然和蓝色的交错。

你可以通过点击鼠标将任何区域作为中央

通过滑动轴可以调整显示的大小(功能和最上面的最右边的放大镜的功能一样)

2.右边部分

这个部分是为了选定一个node来进行深入地观察。当你点击一个node的时候,在窗口主体部分的最下边会显示这个node当前的详细信息。

有一个下拉菜单可以选取这个node所有携带的messages

点击routing information按钮,一个新的窗口就弹出来了,这个窗口中包含了routing module的信息。当一个node被选择以后,窗口主体就直接以此node为中心了,除此之外,当前node所在的运行的路径也会以红色显示出来。

3.Logging(最下面的部分)

如果分成2部分的话,那么一个是control,一个是log。

从control部分,你可以选择你想在log中显示什么样的messages。你还可选择在特定类型的event发生的时候,simulation是否应该停下来(在pause那边的check box上打勾)。

所有在log窗口中的nodes和message names都是按钮,你可以点击它们,并且得到详细的信息。
 




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值