OMNET ++:如何在INET 4.0中的离散NxN空间中移动节点?

时间:2018-07-20 22:00:06

标签: omnet++ inet

顾名思义,我想将AdhocHost移动到离散的(100m x 100m)空间中。也就是说,例如,假设节点在(0,0)m中,然后等待一秒钟,然后将其“传送”到(0,1)m,而不会跨越两个位置之间的距离。
我该怎么办?

2 个答案:

答案 0 :(得分:1)

编写移动性模型。将实际的整数坐标存储为状态。创建一个每秒触发的计时器事件,并在该事件上根据您的规则修改坐标。您可以从头开始,也可以以固定式出行模块为例。

关于INET中的移动性模型:https://inet.omnetpp.org/users-guide/chap22.html

答案 1 :(得分:0)

所以这是我使用一些小技巧来做到的。 我的出行模型基于TractorMobility
从类TractorMobility扩展后,我添加了另一个名为Coord的{​​{1}}变量(代表虚拟最后位置)。该变量的作用与vLastPosition的{​​{1}}变量相同,并存储主机的最后位置。然后,在移动主机并设置lastPosition变量时,我是根据TractorMobility坐标的整数部分进行设置的。
因此,我的移动模块仍然“认为”主机不断移动,而主机仅在其位置的整数部分更改时移动。
我的模块的lastPosition文件是:

vLastPosition

这是我的自定义移动性类(.ned)的头文件:

import inet.mobility.single.TractorMobility;
import inet.mobility.contract.IMobility;

simple OfflinePhaseMobility extends TractorMobility like IMobility
{
    parameters:
        double hopSize @unit(m) = default(1m);
        @class(inet::OfflinePhaseMobility);
}

这是我的OfflinePhaseMobility.h文件:

#ifndef OFFLINEPHASEMOBILITY_H_
#define OFFLINEPHASEMOBILITY_H_

#include "inet/common/INETDefs.h"
#include "inet/mobility/single/TractorMobility.h"

namespace inet{
class OfflinePhaseMobility : public TractorMobility{
protected:
    virtual void setTargetPosition() override;
    virtual void move() override;
    Coord vLastPosition;
};
}//ns inet

#endif /* OFFLINEPHASEMOBILITY_H_ */

OfflinePhaseMobility.cc中的移动性配置:

#include "OfflinePhaseMobility.h"
namespace inet{

Define_Module(OfflinePhaseMobility);

void OfflinePhaseMobility::setTargetPosition()
{
    int sign;
    Coord positionDelta = Coord::ZERO;
    switch (step % 4) {
        case 0:
            positionDelta.x = x2 - x1;
            break;

        case 1:
        case 3:
            sign = (step / (2 * rowCount)) % 2 ? -1 : 1;
            positionDelta.y = (y2 - y1) / rowCount * sign;
            break;

        case 2:
            positionDelta.x = x1 - x2;
            break;
    }
    step++;
    targetPosition = vLastPosition + positionDelta;
    nextChange = simTime() + positionDelta.length() / speed;
}

void OfflinePhaseMobility::move(){
        simtime_t now = simTime();
        if (now == nextChange) {
            vLastPosition = targetPosition;
            EV_INFO << "reached current target position = " << vLastPosition << endl;
            setTargetPosition();
            EV_INFO << "new target position = " << targetPosition << ", next change = " << nextChange << endl;
            lastVelocity = (targetPosition - vLastPosition) / (nextChange - simTime()).dbl();
        }
        else if (now > lastUpdate) {
            ASSERT(nextChange == -1 || now < nextChange);
            vLastPosition += lastVelocity * (now - lastUpdate).dbl();
        }
        double hopSize = par("hopSize");
int numHopsX = vLastPosition.x / hopSize;
int numHopsY = vLastPosition.y / hopSize;
double candidateX = (numHopsX * hopSize);
double deltaX = vLastPosition.x - candidateX;
if(deltaX <= hopSize/2)
    lastPosition.x = candidateX;
else
    lastPosition.x = candidateX + hopSize;
lastPosition.y = (numHopsY * hopSize);
}


}//ns inet

如您所见,我将速度设置为1mps。您可能还已经意识到omnetpp.ini参数是我预定位置之间的距离。
就那么简单!希望这对遇到相同问题并且不希望从头开始编写移动性模块的人有所帮助。