NS2之移动节点能量模型

  1. #include <stdarg.h>  
  2. #include <float.h>  
  3.   
  4. #include "random.h"  
  5. #include "energy-model.h"  
  6. #include "mobilenode.h"  
  7. #include "god.h"  
  8.   
  9. static class EnergyModelClass : public TclClass  
  10. {  
  11. public:  
  12.     EnergyModelClass ():TclClass ("EnergyModel") {}  
  13.     TclObject *create (int argc, const char *const *argv) {  
  14.         if (argc == 8) {  
  15.             MobileNode *n=(MobileNode*)TclObject::lookup(argv[4]);  
  16.             return (new EnergyModel(n, atof(argv[5]),   
  17.                         atof(argv[6]), atof(argv[7])));  
  18.         } else {  
  19.             Tcl::instance().add_error("Wrong arguments to ErrorModel");  
  20.             return 0;  
  21.         }  
  22.     }  
  23. } class_energy_model;  
  24.   
  25. void EnergyModel::DecrTxEnergy(double txtime, double P_tx)   
  26. {  
  27.     double dEng = P_tx * txtime;  
  28.     if (energy_ <= dEng)  
  29.         energy_ = 0.0;  
  30.     else  
  31.         energy_ = energy_ - dEng;  
  32.     if (energy_ <= 0.0)  
  33.         God::instance()->ComputeRoute();  
  34. }  
  35.   
  36.   
  37. void EnergyModel::DecrRcvEnergy(double rcvtime, double P_rcv)   
  38. {  
  39.     double dEng = P_rcv * rcvtime;  
  40.     if (energy_ <= dEng)  
  41.         energy_ = 0.0;  
  42.     else  
  43.         energy_ = energy_ - dEng;  
  44.     if (energy_ <= 0.0)  
  45.         God::instance()->ComputeRoute();  
  46. }  
  47.   
  48. void EnergyModel::DecrIdleEnergy(double idletime, double P_idle)   
  49. {  
  50.     double dEng = P_idle * idletime;  
  51.     if (energy_ <= dEng)  
  52.         energy_ = 0.0;  
  53.     else  
  54.         energy_ = energy_ - dEng;  
  55.     if (energy_ <= 0.0)  
  56.         God::instance()->ComputeRoute();  
  57. }  
  58.   
  59. // XXX Moved from node.cc. These wireless stuff should NOT stay in the   
  60. // base node.  
  61. void EnergyModel::start_powersaving()  
  62. {  
  63.     snh_ = new SoftNeighborHandler(this);  
  64.     snh_->start();  
  65.       
  66.     afe_ = new AdaptiveFidelityEntity(this);  
  67.     afe_->start();  
  68.   
  69.     state_ = EnergyModel::POWERSAVING;  
  70.     state_start_time_ = Scheduler::instance().clock();  
  71. }  
  72.   
  73. void EnergyModel::set_node_sleep(int status)  
  74. {  
  75.     Tcl& tcl=Tcl::instance();  
  76.     //static float last_time_gosleep;  
  77.     // status = 1 to set node into sleep mode  
  78.     // status = 0 to put node back to idle mode.  
  79.     // time in the sleep mode should be used as credit to idle   
  80.     // time energy consumption  
  81.     if (status) {  
  82.         last_time_gosleep = Scheduler::instance().clock();  
  83.         //printf("id=%d : put node into sleep at %f\n",  
  84.         // address_,last_time_gosleep);  
  85.         sleep_mode_ = status;  
  86.         if (node_->exist_namchan())   
  87.             tcl.evalf("%s add-mark m1 blue hexagon",node_->name());  
  88.     } else {  
  89.         sleep_mode_ = status;  
  90.         if (node_->exist_namchan())   
  91.             tcl.evalf("%s delete-mark m1", node_->name());   
  92.         //printf("id= %d last_time_sleep = %f\n",  
  93.         // address_, last_time_gosleep);  
  94.         if (last_time_gosleep) {  
  95.             total_sleeptime_ += Scheduler::instance().clock() -  
  96.                 last_time_gosleep;  
  97.             last_time_gosleep = 0;  
  98.         }  
  99.     }     
  100. }  
  101.   
  102. void EnergyModel::set_node_state(int state)  
  103. {  
  104.     switch (state_) {   
  105.     case POWERSAVING:  
  106.     case WAITING:  
  107.         state_ = state;  
  108.         state_start_time_ = Scheduler::instance().clock();  
  109.         break;  
  110.     case INROUTE:  
  111.         if (state == POWERSAVING) {  
  112.             state_ = state;  
  113.         } else if (state == INROUTE) {  
  114.             // a data packet is forwarded, needs to reset   
  115.             // state_start_time_  
  116.             state_start_time_= Scheduler::instance().clock();  
  117.         }  
  118.         break;  
  119.     default:  
  120.         printf("Wrong state, quit...\n");  
  121.         abort();  
  122.     }  
  123. }  
  124.   
  125. void EnergyModel::add_neighbor(u_int32_t nodeid)  
  126. {  
  127.     neighbor_list_item *np;  
  128.     np = neighbor_list.head;  
  129.     for (; np; np = np->next) {  
  130.         if (np->id == nodeid) {  
  131.             np->ttl = maxttl_;  
  132.             break;  
  133.         }  
  134.     }  
  135.     if (!np) {      // insert this new entry  
  136.         np = new neighbor_list_item;  
  137.         np->id = nodeid;  
  138.         np->ttl = maxttl_;  
  139.         np->next = neighbor_list.head;  
  140.         neighbor_list.head = np;  
  141.         neighbor_list.neighbor_cnt_++;  
  142.     }  
  143. }  
  144.   
  145. void EnergyModel::scan_neighbor()  
  146. {  
  147.     neighbor_list_item *np, *lp;  
  148.     if (neighbor_list.neighbor_cnt_ > 0) {  
  149.         lp = neighbor_list.head;  
  150.         np = lp->next;  
  151.         for (; np; np = np->next) {  
  152.             np->ttl--;  
  153.             if (np->ttl <= 0){  
  154.                 lp->next = np->next;  
  155.                 delete np;  
  156.                 np = lp;  
  157.                 neighbor_list.neighbor_cnt_--;  
  158.             }   
  159.             lp = np;  
  160.         }  
  161.         // process the first element  
  162.         np = neighbor_list.head;  
  163.         np->ttl--;  
  164.         if (np->ttl <= 0) {  
  165.             neighbor_list.head = np->next;  
  166.             delete np;  
  167.             neighbor_list.neighbor_cnt_--;  
  168.         }  
  169.     }  
  170. }  
  171.   
  172.   
  173. void SoftNeighborHandler::start()  
  174. {  
  175.     Scheduler::instance().schedule(this, &intr, CHECKFREQ);  
  176. }  
  177.   
  178. void SoftNeighborHandler::handle(Event *)  
  179. {  
  180.     Scheduler &s = Scheduler::instance();  
  181.     nid_->scan_neighbor();  
  182.     s.schedule(this, &intr, CHECKFREQ);  
  183. }  
  184.   
  185. void AdaptiveFidelityEntity::start()  
  186. {  
  187.     sleep_time_ = 2;  
  188.     sleep_seed_ = 2;  
  189.     idle_time_ = 10;  
  190.     nid_->set_node_sleep(0);  
  191.     Scheduler::instance().schedule(this, &intr,   
  192.                        Random::uniform(0, idle_time_));  
  193. }  
  194.   
  195. void AdaptiveFidelityEntity::handle(Event *)  
  196. {  
  197.     Scheduler &s = Scheduler::instance();  
  198.     int node_state = nid_->state();  
  199.     switch (node_state) {  
  200.     case EnergyModel::POWERSAVING:  
  201.         if (nid_->sleep()) {  
  202.             // node is in sleep mode, wake it up  
  203.             nid_->set_node_sleep(0);  
  204.             adapt_it();  
  205.             s.schedule(this, &intr, idle_time_);  
  206.         } else {  
  207.             // node is in idle mode, put it into sleep  
  208.             nid_->set_node_sleep(1);  
  209.             adapt_it();  
  210.             s.schedule(this, &intr, sleep_time_);  
  211.         }  
  212.         break;  
  213.     case EnergyModel::INROUTE:  
  214.         // 100s is the maximum INROUTE time.  
  215.         if (s.clock()-(nid_->state_start_time()) <   
  216.             nid_->max_inroute_time()) {  
  217.             s.schedule(this, &intr, idle_time_);  
  218.         } else {  
  219.             nid_->set_node_state(EnergyModel::POWERSAVING);  
  220.             adapt_it();  
  221.             nid_->set_node_sleep(1);  
  222.             s.schedule(this, &intr, sleep_time_);   
  223.         }  
  224.         break;  
  225.     case EnergyModel::WAITING:  
  226.         // 10s is the maximum WAITING time  
  227.         if (s.clock()-(nid_->state_start_time()) < MAX_WAITING_TIME) {  
  228.             s.schedule(this, &intr, idle_time_);  
  229.         } else {  
  230.             nid_->set_node_state(EnergyModel::POWERSAVING);  
  231.             adapt_it();  
  232.             nid_->set_node_sleep(1);  
  233.             s.schedule(this, &intr, sleep_time_);   
  234.         }  
  235.         break;  
  236.     default:  
  237.         fprintf(stderr, "Illegal Node State!");  
  238.         abort();  
  239.     }  
  240. }  
  241.   
  242. void AdaptiveFidelityEntity::adapt_it()  
  243. {  
  244.     float delay;  
  245.     // use adaptive fidelity  
  246.     if (nid_->adaptivefidelity()) {  
  247.         int neighbors = nid_->getneighbors();  
  248.         if (!neighbors)   
  249.             neighbors = 1;  
  250.         delay = sleep_seed_ * Random::uniform(1,neighbors);   
  251.             set_sleeptime(delay);  
  252.     }  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验内容1. 在上一个实验的基础上,建立ad hoc节点拓扑模型,网络中节点均具有路由转发功能; 2. 进入~/tarballs/ns-allinone-3.2x/ns-3.2x/examples/wireless$ 目录,在wireless文件夹下,有很多wifi传输的示例。在wifi-simple-adhoc-grid.cc代码基础上修改,文件拷贝到scratch文件夹下,重命名为你的姓名缩写+学号,例如学生姓名钢铁侠,学号20191314,c文件命名为gtx20191314.cc; 3. 读懂wifi-simple-adhoc-grid.cc代码,掌握在NS-3中网络拓扑布局,ad hoc传输方式、网络路由的简单配置等,成功运行wifi-simple-adhoc-grid.cc; 4. 掌握拓扑建模方法,在wifi-simple-adhoc-grid.cc代码中扩展建立到100个节点节点初始呈现网格布局; 5. 深入研究移动模型建模方法,完成对移动模型参数设置,使得节点移动在可视化界面更加明显; 6. 深入研究信道模型建模方法,在代码中完成对信道模型的替换,例如Friis、LogDistancePropagationLossModel信道模型。通过射频参数,了解发射机、路径损耗和接收机间增益的计算方法。可以根据参数配置想要的发射距离; 7. 掌握网路层路由配置方法,可以配置多种ad hoc路由模式,例如OLSR、aodv等。查阅不同路由协议的工作原理和方法; 8. 掌握统计模型的使用方法,可以统计相应节点的时延、丢包率等重要指标; 9. 掌握能耗模型的使用方法,配置节点能量,设备能量,可以统计节点能量消耗; 10. 掌握统计数据作图方法,对于获得的统计数据,图形化的形式得出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值