如何使用ns2在aodv中添加计时器

时间:2016-07-30 11:00:59

标签: timer adhoc ns2

at aodv当节点收到路由请求时,它将检查它是否具有到目的地的有效路由,如果它没有有效路由,它将重新广播路由请求。我想在节点重新广播路由请求之前添加定时器。在定时器时间期间,如果节点接收具有相同ID的RREQ(这意味着节点接收RREQ两次),则丢弃RREQ,否则重新广播RREQ。我不知道如何编写这部分的代码。 计时器的代码 1.计时器是在aodv.h中定义的

    class RouteRequestTimer : public Handler {
    public: 
    RouteRequestTimer(AODV* a) : agent(a) { busy_ = 0; }
    void handle(Event*);
    void start(double time);
    void stop(void);
    inline int busy(void) { return busy_; }
    private:
    AODV *agent;
    Event intr;
    int busy_;
    };
  1. 计时器已在路由代理aodv.h中声明

    friend class  RouteRequestTimer;
    RouteRequestTimer rrtimer;
    
  2. 在aodv.cc中,实现句柄功能

    void RouteRequestTimer::handle(Event*) {
    busy_ = 0;
    #define interval 0.5
    fprintf (stderr, "This is a test for the usage of timer.\n");
    Scheduler::instance().schedule(this, &intr, interval);
    }
    void RouteRequestTimer::start(double time) {
    Scheduler &s = Scheduler::instance();
    assert(busy_ == 0);
    busy_ = 1;
    s.schedule(this, &intr, time);
    }
    void RouteRequestTimer::stop(void) {
    Scheduler &s = Scheduler::instance();
    assert(busy_);
    s.cancel(&intr);
    busy_ = 0;
    }
    
  3. 计时器已在aodv.cc初始化

    AODV::AODV(nsaddr_t id) : ..., rrtimer(this), ... {
    }
    
  4. 计时器用于接收路径请求的函数

    void
    AODV::recvRequest(packet *p){
    …
    …
    …
    Scheduler::instance().schedule(&rrtimer, p->copy(), inerval);  
    …
    }
    
  5. 然后我重新编译ns2并完成编译,没有错误。 当我使用aodv运行网络的tcl代码时,会出现此错误

    调度程序:事件UID无效

    请如何解决此错误以及如何在定时器上检查收到的路由请求ID,如果收到了具有相同ID的RREQ,则丢弃该数据包,否则将其转发。

    提前致谢

1 个答案:

答案 0 :(得分:1)

您必须按照以下步骤在ns2中实现计时器:

1)在aodv.h文件中定义你的计时器类,如下所示

class MyTimer : public Handler {
  public:
    MyTimer(AODV* a) : agent(a) {}
    void handle(Event*);
  private:
    AODV *agent;
    Event intr;
};

2)将此类的对象定义为aodv.h中AODV类的属性:

MyTimer mtimer;

3)将MyTimer类作为aodv.h中AODV的友元类

friend class MyTimer;

4)在AODV.cc中,您必须定义MyTimer的功能。在handle函数中,编写要在计时器到期时执行的代码:

void MovePacketToSendingBufferTimer::handle(Event* p) {

}

5)在AODV.cc中找到AODV类的构造函数并调用MyTimer类的构造函数:

AODV::AODV(nsaddr_t id) : Agent(PT_AODV),
          mtimer(this){
            ///body of constructor
}

6)现在您的计时器已准备就绪。根据计时器的使用情况,您可以使用以下代码行在代码的任意位置调用处理程序:

Scheduler::instance().schedule(&mtimer, new Event(), 0.5);

执行MyTimer类的上述行处理程序后将在0.5秒后执行 这是ns2定时器的一个有用示例:ns2-timers