ONE学习记录

来源:互联网 发布:数据元与元数据的区别 编辑:程序博客网 时间:2024/05/04 15:36

转自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;
    }

原创粉丝点击