功率模型
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_