现在的位置: 首页 > 综合 > 正文

(转)NS2定时检测节点mac是否空闲

2012年11月25日 ⁄ 综合 ⁄ 共 1486字 ⁄ 字号 评论关闭

目的:每隔0.0005秒检测某一无线节点mac的忙闲情况

实现方案:

方案一、用handler类循环进行打印is_idle()的值。

    实现:参考season29,模仿dsr协议中的mobihandler类,在mac-802_11.h中建立一个IdleTimer类

   class IdleTimer : public Handler {
   public:
    IdleTimer(Mac802_11 *I) {
    interval = 0.0005;
    Idle = I;
    }
   void start() {
    Scheduler::instance().schedule(this, &intr, 0.0005);
    }
    void handle(Event *e); 
   private:
    double interval;
    Event intr;
    Mac802_11 *Idle;
   };

   将IdleTimer在Mac802_11类中设成友元类,并声明一个IdleTimer it。

   在mac-802_11.cc中对IdleTimer类的handle函数定义

  void IdleTimer::handle(Event * e){
     int isid;
     isid=Idle->is_idle();
     fprintf(stdout, "%d\n",isid);     //打印是否idle,1-空闲,0-繁忙
        Scheduler::instance().schedule(this, &intr, interval);
  }

   在Mac802_11::Mac802_11()中启动定时器it.start(),注意要在函数名最后加上it(this)

   即Mac802_11::Mac802_11() :
    Mac(), phymib_(this), macmib_(this), mhIF_(this), mhNav_(this),
    mhRecv_(this), mhSend_(this),
    mhDefer_(this), mhBackoff_(this),it(this)     //不知道这是干吗的

这个方案的重大问题:没法确定是哪个节点的mac的忙闲情况,得到的1、0数量也大约是应有数量的n(节点数)倍。

方案二:用command函数

     在Mac802_11的command()函数中加个判断

     if (argc == 2) {
        if (strcmp(argv[1],"check-idle") == 0) {
            fprintf(stdout,"%2.9f   %d\n",Scheduler::instance().clock(),is_idle());   //打印出时间和忙闲情况
            return TCL_OK;
            }   
        }

     在tcl文件中

 

set n0_mac [$n0 set mac_(0)]    #[]中的意思似乎是选定节点0的mac层,整句是把n0_mac来代表节点0的mac层
for {set i 0} {$i < 38001} {incr i} {
$ns at [expr 1+$i*0.0005] "$n0_mac cmd check-idle"
}   #从1秒到20秒,每隔0.0005秒check节点0的忙闲情况

 

  运行的时候ns **.tcl > **.data,各个时刻的节点忙闲情况就在**.data中显示了。

 

转自:kevinking的个人空间

转这篇日志的作用在于如何在TCL脚本中为每个节点设置MAC层参数

抱歉!评论已关闭.