目的:每隔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层参数