⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.cpp

📁 OMNeT++ for RFID ALOHA collision protocol
💻 CPP
字号:
//
// This file is part of an OMNeT++/OMNEST simulation example.
//
// Copyright (C) 1992-2005 Andras Varga
//
// This file is distributed WITHOUT ANY WARRANTY. See the file
// `license' for details on this and other legal matters.
//


#include <omnetpp.h>

/**
 * Aloha server; see NED file for more info.
 */
class AServer : public cSimpleModule
{
  private:
    // state variables, event pointers
    bool channelBusy;
    cMessage *endRxEvent;
    double txRate;

    long currentCollisionNumFrames;
    simtime_t recvStartTime;

    // statistics
    long totalFrames;
    long collidedFrames;
    simtime_t totalReceiveTime;
    simtime_t totalCollisionTime;
    double currentChannelUtilization;

    cOutVector collisionMultiplicityVector;
    cOutVector collisionLengthVector;
    cOutVector channelUtilizationVector;

  public:
    AServer();
    virtual ~AServer();

  protected:
    virtual void initialize();
    virtual void handleMessage(cMessage *msg);
    virtual void finish();
};

Define_Module(AServer);

AServer::AServer()
{
    endRxEvent = NULL;
}

AServer::~AServer()
{
    cancelAndDelete(endRxEvent);
}

void AServer::initialize()
{
    txRate = par("txRate");
    endRxEvent = new cMessage("end-reception");
    channelBusy = false;

    currentCollisionNumFrames = 0;
    totalFrames = 0;
    collidedFrames = 0;
    WATCH(currentCollisionNumFrames);
    WATCH(totalFrames);
    WATCH(collidedFrames);

    totalReceiveTime = 0.0;
    totalCollisionTime = 0.0;
    currentChannelUtilization = 0;
    WATCH(totalReceiveTime);
    WATCH(totalCollisionTime);
    WATCH(currentChannelUtilization);

    collisionMultiplicityVector.setName("collision multiplicity");
    collisionLengthVector.setName("collision length");
    channelUtilizationVector.setName("channel utilization");

    if (ev.isGUI()) displayString().setTagArg("i2",0,"x_off");
}

void AServer::handleMessage(cMessage *msg)
{
    if (msg==endRxEvent)
    {
        ev << "reception finished\n";
        channelBusy = false;

        // update statistics
        simtime_t dt = simTime() - recvStartTime;
        if (currentCollisionNumFrames==0)
        {
            totalReceiveTime += dt;
        }
        else
        {
            totalCollisionTime += dt;
            collisionMultiplicityVector.record(currentCollisionNumFrames);
            collisionLengthVector.record(dt);
        }
        currentChannelUtilization = totalReceiveTime/simTime();
        channelUtilizationVector.record(currentChannelUtilization);

        currentCollisionNumFrames = 0;

        // update network graphics
        if (ev.isGUI())
        {
            displayString().setTagArg("i2",0,"x_off");
            displayString().setTagArg("t",0,"");
        }
    }
    else
    {
        totalFrames++;
        double endReception = simTime() + msg->length() / txRate;
        if (!channelBusy)
        {
            ev << "started receiving\n";
            recvStartTime = simTime();
            channelBusy = true;
            scheduleAt(endReception, endRxEvent);
            if (ev.isGUI())
            {
                displayString().setTagArg("i2",0,"x_yellow");
                displayString().setTagArg("t",0,"RECEIVE");
                displayString().setTagArg("t",2,"#808000");
            }
        }
        else
        {
            ev << "another frame arrived while receiving -- collision!\n";

            collidedFrames++;
            if (currentCollisionNumFrames==0)
                currentCollisionNumFrames = 2;
            else
                currentCollisionNumFrames++;

            if (endReception > endRxEvent->arrivalTime())
            {
                cancelEvent(endRxEvent);
                scheduleAt(endReception, endRxEvent);
            }

            // update network graphics
            if (ev.isGUI())
            {
                displayString().setTagArg("i2",0,"x_red");
                displayString().setTagArg("t",0,"COLLISION");
                displayString().setTagArg("t",2,"#800000");
                char buf[32];
                sprintf(buf, "Collision! (%ld frames)", currentCollisionNumFrames);
                bubble(buf);
            }
        }
        channelBusy = true;
        delete msg;
    }
}

void AServer::finish()
{
    ev << "duration: " << simTime() << endl;
    ev << "total frames: " << totalFrames << endl;
    ev << "collided frames: " << collidedFrames << endl;
    ev << "total receive time: " << totalReceiveTime << endl;
    ev << "total collision time: " << totalCollisionTime << endl;
    ev << "channel utilization: " << currentChannelUtilization << endl;

    recordScalar("duration", simTime());
    recordScalar("total frames", totalFrames);
    recordScalar("collided frames", collidedFrames);
    recordScalar("total receive time", totalReceiveTime);
    recordScalar("total collision time", totalCollisionTime);
    recordScalar("channel utilization", currentChannelUtilization);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -