转自http://blog.csdn.net/snake168/archive/2009/11/24/4865712.aspx
The One是什么?
这是The One主页上的原文:The Opportunistic Network Environment simulator.
the one 的网址 http://www.netlab.tkk.fi/tutkimus/dtn/theone/
the one的结构
1 .report包:用来指定导出哪些类型的报表,具体可查阅readme.txt文档。
上图为这些类的继承关系,可在配置文件settings中配置,然后反射注入四类订阅者(由图可知为 ConnectionListener,UpdateListener,MessageListener,ContactTimesReport四种接口 的集合,定义在core包中)里面,然后在不同的事件发生后,对四个订阅者队列进行遍历(四个队列存放在类core.SimScenario中)
2 .routing包:用来指定消息的路由策略,按组指定。
上图为该包的继承关系,如果是研究算法 的同学,注重点就应该就是这个包了,如:DirectDeliveryRouter--只是简单地向最后接收者传递,不会传给别的结点中 转,EpidemicRouter--洪范传输,还有1.3中新添的EnergyAwareRouter,就具有能源这个概念了,因为从现在DTN网络的 利用来考虑,能源的消耗很关键。还有一些实现了现今比较流行的dtn路由算法的类
使用 :只需继承MessageRouter,覆盖对应的方法,然后加入自己的实现,再在settings配置文件中配置则可。
3 .movement包:用来指定结点的移动策略,亦为按组指定。
上图为该包的继承关系,其中,大部分的移动策略(继承MapBaseMovement)都是基于给定的地图文件移动(还可以分为不同的路线类型,如 人行道,汽车道等),也有部分为随机移动(RandomWaypoint和RandomWalk)和事件驱动(ExternalMovement和 ExtendedMovementModel)
4 .input包:分为两个类型,一类为继承ExternalEvent的消息实体类,基本为每个消息对应一个实体
上图为各类消息实体类的继承关系
第二类为实现EventQueue接口的外部事件
其中DTN2Events为与DTNSim2的事件与The One事件的对接
5 .core包:包括一些核心的类和核心的接口等
具体执行流程应该是这样的:
a.读取配置文件。
b.初始化模拟环境,把report,routing等都配置好,并把host生成。
c.初始化模拟时间
d.检验当前时间是否小于模拟时间:是,则跳到e,否,则跳到f
e.模拟环境update,回到d
f.end
其中主要的流程在world.update方法里面,包括:触发事件(消息传输,丢包等),移动host等。
发现的问题
举个例子:如EpidemicRouter(即洪范路由算法),覆盖了父类的update方法
public void update() {
//super.update做了三件事:传输完成的终止传输,连接断开的终端传输,ttl小于零的丢包处理
super.update();
//检查
if (isTransferring() || !canStartTransfer()) {
return; // transferring, don't try other connections yet
}
//检查
// Try first the messages that can be delivered to final recipient
if (exchangeDeliverableMessages() != null) {
return; // started a transfer, don't try others (yet)
}
//问题在此
// then try any/all message to any/all connection
this.tryAllMessagesToAllConnections();
}
protected Connection tryAllMessagesToAllConnections(){
//检查
List<Connection> connections = getConnections();
if (connections.size() == 0 || this.getNrofMessages() == 0) {
return null;
}
//消息按优先级排序
List<Message> messages =
new ArrayList<Message>(this.getMessageCollection());
this.sortByQueueMode(messages);
//问题在此
return tryMessagesToConnections(messages, connections);
}
protected Connection tryMessagesToConnections(List<Message> messages,
List<Connection> connections) {
for (int i=0, n=connections.size(); i<n; i++) {
Connection con = connections.get(i);
//如果可以传输,就传输该消息,并返回传输的消息。
Message started = tryAllMessages(con, messages);
//如果传输了,则返回了
if (started != null) {
return con;
}
}
return null;
}