The ONE设置文件包含一系列变量,有些很有迷惑性,如hosts是包括上界但不包括上界,即[a, b)。本文给出The ONE变量含义及其单位。

1. 概述

# 仿真时间,单位是秒,浮点型double,43200s = 12h
Scenario.endTime = 43200  
# 更新间隔,单位是秒,浮点型double
Scenario.updateInterval = 0.1  

# 传输速度(比特率),单位是字节每秒(bytes per second), 整点型int, 250kBps=2Mbps
btInterface.transmitSpeed = 250k
# 传输范围range,单位是米,浮点型double
btInterface.transmitRange = 10  

# 到达目的节点等待时间(min, max),时间为秒,浮点型double   minimum and maximum wait times (seconds) after reaching destination
Group.waitTime = 0, 120      
# 移动的速度(min, max),单位m/s, 浮点型double, minimum and maximum speeds (m/s) when moving on a path
Group.speed = 0.5, 1.5   
# 消息生存时间time-to-live,单位为分minutes,整型Integer, default=infinite
Group.msgTtl = 300  
# 缓冲区大小,单位为字节byte,整型Integer
Group.bufferSize = 50M  

Events1.class = MessageEventGenerator
# 消息产生间隔(min, max),单位为秒,整型int
Events1.interval = 25,35   
# 消息大小范围(min, max),单位为byte,整型int
Events1.size = 500k,1M  
# range of message source/destination addresses,值得注意的是包括下界不包括上界,即[0, 126) 
Events1.hosts = 0,126

2. 上下界

(1)endTimeupdateInterval

Scenario.endTime = 50
Scenario.updateInterval = 1

第一次运行world.update是在1s(值得注意的是,0s没有运行world.update),最后一次是50s,world.update总共被执行50次。

(2)产生消息

Scenario.endTime = 50
Events1.class = MessageEventGenerator
Events1.interval = 2

第一次产生消息是在2s(值得注意的是,0s没有产生消息),最后一次产生消息是在25s,Event1在整个仿真中共产生25个消息。另,处理事件是在updateHosts之前。在2s时,先产生消息,运行updateHosts时,新消息已经产生了。

3. Message和Connection的顺序

getMessageCollection()得到节点的缓冲区,即消息的集合。消息的顺序是没法保证的,因为消息是用HashMap存储的。

//MessageRouter.java
private HashMap<String, Message> messages;
public Collection<Message> getMessageCollection() {
    return this.messages.values();
}

然而,getConnections取得的连接集合是有序,因为是用ArrayList存储,顺序是按插入的顺序。更直白的说,哪条连接先与该节点建立连接,就在前面。相关源代码如下:

//ActiveRouter.java
protected List<Connection> getConnections() {
    return getHost().getConnections();
}

//DTNHost.java
public List<Connection> getConnections() {
    List<Connection> lc = new ArrayList<Connection>();

    for (NetworkInterface i : net) {
        lc.addAll(i.getConnections());
    }

    return lc;
}

//NetworkInterface.java
protected List<Connection> connections; //connected hosts
public List<Connection> getConnections() {
    return this.connections;
}

//ConnectionEvent.java
public void processEvent(World world) {
    DTNHost from = world.getNodeByAddress(this.fromAddr);
    DTNHost to = world.getNodeByAddress(this.toAddr);

    from.forceConnection(to, interfaceId, this.isUp);
}

//DTNHost.java 在forceConnection()
if (up) {
    ni.createConnection(no);
} else {
    ni.destroyConnection(no);
}

待完善……

本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2022-03-27 13:45

results matching ""

    No results matching ""