NS2 获取接收功率方法

功率模型
 1)向下发送WirelessPhy::sendDown
  a、首先考虑能量是否耗尽
  b、p->txinfo_.stamp((MobileNode*)node(), ant_->copy(), Pt_, lambda_);
     将发送节点的节点信息和功率、波长加入包信息中。Pt_为发送功率
  c、channel_->recv(p, this);//发送给信道
 

2)向上接收WirelessPhy::sendUp
 计算接收功率是通过mobole/TwoRayGround::Pr函数
 WirelessPhy::sendUp中调用Pr函数
 {
  s.stamp((MobileNode*)node(), ant_, 0, lambda_);
  Pr = propagation_->Pr(&p->txinfo_, &s, this);
  //p->txinfo_中已有发送节点信息,s中写入自身信息,从而可以求得接收功率
  printf("%lf\n",CSThresh_*10000000000);//显示
  if (Pr < CSThresh_) {//功率太低,无法探测。但是仍然产生了事件
   pkt_recvd = 0;//用于判断是否需要丢弃
   goto DONE;
  }
  if (Pr < RXThresh_) {//功率可以探测到,但是无法正常接收
   pkt_recvd = 1;
   hdr->error() = 1;//标记为错误
  }
  pkt_recvd = 1;
  p->txinfo_.RxPr = Pr;//上层接收到的包中的该域即为接收功率
  降低能量,若接收后能量降为非正数,则能量=0
 }
    
  ***此时默认参数:
   a、不可感知CSThresh_        :1.559 e-09    接近174m
   b、可感知但不可接收RXThresh_:3.652 e-10    距离250m

 


 3)实现记录接收功率初步想法
  AODV::recv(Packet *p, Handler*) {
   double rxPr=p->txinfo_.RxPr;//接收频率在经过物理层后 Pr函数计算而来的结果保存在了向上提交的包中
   printf("%lf ",rxPr*10000000000);
   


 4)获取包的上一个转发节点和源节点
  ns_addr_t src_ip=HDR_IP(p)->src_; //ip层 包的源地址
  nsaddr_t src_cmn=HDR_CMN(p)->prev_hop_; //链路层 包的上一转发地址
  注:返回值区别:
   typedef int32_t nsaddr_t;
   struct ns_addr_t {
    int32_t addr_;
    int32_t port_;}

 

 

 

附:

传播模型底层方法:


 底层实现


  1、mobile/tworayground.h中的class TwoRayGround : public Propagation
   定义了函数virtual double Pr(PacketStamp *tx, PacketStamp *rx, WirelessPhy *ifp);来获得接收功率。


  2、在mac/wireless-phy.cc L183中通过
   obj = TclObject::lookup("Propagation/TwoRayGround"));//貌似为新建一个对象,不合适
   和propagation_ = (Propagation*) obj;
   获得传播模型。


  3、Pr函数参数
   PacketStamp s;//用于保存自身节点的接收时的信息
   s.stamp((MobileNode*)node(), ant_, 0, lambda_);//L345  WirelessPhy::sendUp(Packet *p)中  node为自身节点
   //void stamp(MobileNode *n_节点, Antenna *a_天线, double xmitPr_接收功率, double lam_波长)
   Pr = propagation_->Pr(&packet->txinfo_, &s, this);//每个包Packet都有底层描述域txinfo_

你可能感兴趣的:(NS2)