one代码框架学习

来源:互联网 发布:两张表的数据对比分析 编辑:程序博客网 时间:2024/05/18 12:40

     
core包:仿真的核心组件,例如 描述DTN主机和连接的类
gui包:GUI相关的类,包含子包playfield(其中包含在视图区中代表图形对象的类)
ui包:一般用户接口类和基于文本的控制类
report包:接收输出
test包:包含一系列单元和系统测,用于检测系统是否正常运行

(G)UI类从核心包中将Sim Scenario和World classes实例化,依次从routing包中建立路由模块实例,从movement包中建立移动模型实例。在仿真中,路由和移动模块为report包提供报告模块的输出。

Movement models
Movement models provide coordinates, speeds and pause times for the nodes.

MovementModel类:
1.所有移动模型都是对其扩展
2.为一个节点请求新路径提供接口,并询问何时可获得下一条路径
  •   Random Waypoint对象给出简单的zig-zag(人字)路径
  •   MapBasedMovement对象限制路径组件在定义于地图数据的路径段

map子包:为基于地图的移动模型提供工具类            

  • SimMap类:提供地图数据的描述
  • DijkstraPathFinder类:利用数据寻找到地图上两点间的最短路径
  • PointsOfInterest类:依次照顾读取POI数据,并根据定义的配置,选择合适的POI

MapBasedMovement类:
对原有移动模型扩展,添加与地图相关的特性,例如读取和缓存地图数据
  • MapRouteMovement和ShortestPathMapBasedMovement也利用地图数据,且使用DijkstraPathFinder类,以获得路径站点和其他地图目的地的最短路径。


Routing modules
MessageRouter类:
1. 所有路由模式都是对其扩充
2. 为所有路由模型提供基本的接口和功能

  • ActiveRouter:First Contact, Epidemic, Spray and Wait, Direct delivery, PRoPHET 和 MaxProp。
          主动路由模式是DTN已知路由算法的实现。
         
           1.  MaxProp路由模式:需要一些存储在maxprop中的帮助类
           
  
  • PassiveRouter:直接继承 MessageRouter类。

MessageRouter类所关心的信息:
  • 在节点缓存中存储的当前节点的数据存储信息
  • 在激活链接中当前正在接收的信息
  • 做为最后接收者所接收的信息,被移至应用层,所以不存在于信息缓存
1. 当一个节点想要向另一个节点传输数据,它就询问相关连接对象来开始传输,并依次将请求转发给其他节点。其他节点调用路由模块中的receiveMessage 方法,之后路由模块检查它是否想要接收此信息。如果在信息缓存中已有这个数据,路由模块可能将信息丢弃。利用返回值方式,路由模块也能够标志其他节点是否应该发相同的数据或停止转发。
MessageRouter类接收任意输入数据。

2. 除了信息接收方法,MessageRouter类也拥有相应的类来处理:信息成功传输、转发被丢弃、需要新建信息或应从缓存中将信息删除。
     实现这些方法相当的直接,他们最重要的任务是通知注册过的事件监听者某些事件,例如报告模块或GUI事件组。

3.类中还包含两个未提供实现的重要的方法:
   changedConnection:每当新的连接出现或旧的连接失效时被调用。
    updatemethods:每个更新轮被调用。
    主动路由的子类必须提供这两种方法的实现,从而能够反映连接机会和控制进行中的处理。


ActiveRouter类
  • 扩展了MessageRouter类,提供大多数普通任务的实现,例如发送信息给直接连接的主机,或使用一套给定接口以一定顺序发送一系列信息。
  • 它还为更新方法提供了简单的实现。如果在信息传递结束前连接被断开,更新实现就终止传输。它也将生存时间(TTL)期满的信息丢弃。
  • 一个简单的路由模块不需要太多功能,ActiveRouter最简单的扩展只需要几行代码。

Extending the simulator
    当模拟开始时,利用java的API,将路由模块、移动模型、事件产生器和报告模块动态载入。用户只需创建新的类、在配置文件中定义它的名字,模拟就会在场景开始时自动将它载入。
    对于 路由的扩展,通常扩展ActiveRouter类更方便。最重要的是覆写更新方法。完成正在进行中的传输和交换可交付的信息可以委托给ActiveRouter的父类,但是进一步路由选择的逻辑必须由路由模块自身实现。如果路由模块需要记录所有连接,甚至当它在传输信息时,就要覆写changedConnection方法来完成重要的行为。例如PRoPHET路由模块用这种方法记录节点的相遇。

    新的 移动模型可以通过扩展MovementModel类来创建,覆写至少getInitialLocation和getPath这两种方法。
  • getInitialLocation方法:在模拟开始时,节点获得初始位置
  • getPath方法:询问节点将使用的新的路径
   路径是路标序列,节点以移动模型决定的速度从一个路标移动到另一个路标。MovementModel类也提供配置和产生统一速度和等待时间分配的能力。

   
    事件产生器应当创建在input包中,必须实现EventQueue接口。利用接口,模拟器能够询问下一个事件何时到期,那一时间在哪里,也能够询问事件。当事件被处理后,它获得一个参考给所有模拟节点,所以它能够通过调用正确的方法为DTN的主机对象创建信息、设置连接或终止传输。

   报告模块在report包中,提供产生模拟的可定制统计资料和报告的方法。所有自定义模块必须继承Report类并实现一种或多种事件监听接口。
  • MessageListener接口:接收与信息相关的事件,例如建立新的信息或将其从一个节点转发给另一个节点。
  • ConnectionListener接口:记下两节点间连接的开与关。
  • MovementListener接口:跟踪移动节点新的目的地。
  • UpdateListener接口:每当节点更新,就记录







0 0
原创粉丝点击