官方淘宝店 易迪拓培训 旧站入口
首页 > 无线通信 > 通信技术学习讨论 > 问一个ns修改功率问题

问一个ns修改功率问题

12-11
ns里有mac模块和无线信道模块
无线信道里可以定义发送功率Pt_,如果我想从mac模块里修改无线信道模块中的Pt_该如何改呢?
谢谢

可以直接在你所使用的tcl仿真脚本里改,如下所示(我使用的是ns-2.27):
# ==========================
#设置传输半径
#       -注意: 默认的载波监听范围是传输半径的2.2倍
#       默认的干扰范围和载波监听范围是相等的
# ==========================
#Phy/WirelessPhy set Pt_ 8.56486e-4  #40m
#Phy/WirelessPhy set Pt_ 7.214e-3  #100m
#Phy/WirelessPhy set Pt_ 3.652e-2  #150m
#Phy/WirelessPhy set Pt_ 0.1154    #200m
#Phy/WirelessPhy set Pt_ 0.2818    #250m
#Phy/WirelessPhy set Pt_ 0.5843    #300m
#设置MAC层的基本发送速率和数据发送速率
#Mac/802_11 set basicRate_ 1mb
#Mac/802_11 set dataRate_ 2mb
如果想以分组为单位修改发射功率也可以,也很简单,具体怎么操作我记不得了,你可以在
ns-maillist里搜索一下就OK了

我的问题是这样的
我想从mac层里直接下达修改wirelessPhy里的Pt
值,不知道这样该如何在C++代码里改
ns里类封装的太好了我想了一下很难这么改,不知道你有什么好方法
多谢了

你好!
你是不是想对每一个发出去的分组单独设置发射功率?
如果是这样的话,可能就有点棘手了
我刚才看了一下源文件,把我的方案给你大致说一个
仅供参考,如有不对之处还请多多包含
以下的分析仅针对单信道的情况,至于多信道的情况,我还没有涉及
首先谈一下NS中的相关部分的实现:
        在 mac层发送的分组,最终都要调用transmit(...)进行发送
        这将调用 WirelessPhy::recv(...)函数
        进而调用了WirelessPhy::SendDown(...)函数,在该函数中填充了该发射分组的一些信息,其中就包括该分组的发射功率信息
        进而调用了WirelessChannel::recv(...)函数
        进而调用了WirelessChannel::SendUp(...)函数,在该函数中计算了由该分组的发射功率所决定的载波监听所覆盖的范围,并为在该覆盖范围内的每一个节点schedule了一个传播延迟之后的recv事件
        当传播延迟时间到了之后,就会调用每一个节点上的网络接口类WirelessPhy::recv(...)函数
        这将调用该接口的WirelessPhy::SendUp(...)函数,在该函数中根据该分组头中所记载的发射功率信息来计算接收功率,然后再进行下一步的操作
因此,如果你想对mac层发送的每一个分组都单独设置发射功率的话,你可以这么来做:
1.自定义一个分组头,该分组头的任务就是携带你针对该分组所设置的发射功率的数值,
至于如何加入一个新的分组头这是你自己的工作了,应该很简单的
2.在mac层决定发送某一个分组时,就把该分组的发射功率的信息记录到上面的分组头中

3.修改Mac802_11::transmit(...),在函数开始处其中加入下面的代码:
        ((WirelessChannel*)this->netif_->channel_)->varipowerOn=true;
        这是为了告诉WirelessChannel分组的发射功率已经改变了
4.修改WirelessPhy::sendDown(Packet *p),将其中的一行代码:
        p->txinfo_.stamp((MobileNode*)node(), ant_->copy(), Pt_, lambda_);
        将其中的变量 Pt_ 替换为你分组头中所携带的发射功率的数值
5.修改WirelessChannel::calcHighestAntennaZ(Phy *tifp),该函数实现的最后一行代
码是:
        distCST_ = TwoRayGetDist(wifp->getCSThresh(), wifp->getPt(), 1.0, 1.0, highestZ , highestZ);
        将变量 wifp->getPt() 替换为你分组头中所携带的发射功率的数值
这样的话,我认为就能够实现为每个分组单独设置发射功率的目的了
建议你再看一遍分组在各层之间的流动过程
如果有错误,还请包涵:)
btw: 你是做功率控制的么?

Top