2017-06-16 141 views
0

我正在節點模型中實現無線路由協議,該模型使用Ieee80211Nic類型的網絡接口卡,並將其設置爲ad-hoc模式(Ieee80211MgmtAdhoc)。我想使用來自NIC的RSSI值作爲路由協議中的指標之一。
如何從NIC獲取特定鄰居節點(由其MAC地址標識)的RSSI值?Omnet ++/INET:如何從802.11網卡獲取RSSI?

編輯

在INET 3.6源代碼一些挖後,我發現,Ieee80211NIC組分由下列模塊(或層)(以自上而下的順序)的:

  • MGMT(只在一個站STA使用在基礎設施模式)(可以是類型Ieee80211MgmtAP,Ieee80211MgmtSTA,Ieee80211MgmtAdhoc的)
  • MAC
  • 無線電

我進一步分析了Ieee80211MgmtSTA源代碼,並發現它實現了以下方法,該方法記錄所接收的信號強度(bss.setRxPower(AP-> RXPOWER)):

void Ieee80211MgmtSTA::sendScanConfirm() 
{ 
    EV << "Scanning complete, found " << apList.size() << " APs, sending confirmation to agent\n"; 

    // copy apList contents into a ScanConfirm primitive and send it back 
    int n = apList.size(); 
    Ieee80211Prim_ScanConfirm *confirm = new Ieee80211Prim_ScanConfirm(); 
    confirm->setBssListArraySize(n); 
    auto it = apList.begin(); 
    //XXX filter for req'd bssid and ssid 
    for (int i = 0; i < n; i++, it++) { 
     APInfo *ap = &(*it); 
     Ieee80211Prim_BSSDescription& bss = confirm->getBssList(i); 
     bss.setChannelNumber(ap->channel); 
     bss.setBSSID(ap->address); 
     bss.setSSID(ap->ssid.c_str()); 
     bss.setSupportedRates(ap->supportedRates); 
     bss.setBeaconInterval(ap->beaconInterval); 
     bss.setRxPower(ap->rxPower); 
    } 
    sendConfirm(confirm, PRC_SUCCESS); 
} 

然而,在Ieee80211MgmtAdhoc型的情況下,信道掃描(其由代理模塊控制)未實現。因此,不可能檢索特定節點的Rx電源。

有沒有人設法實現一個代理模塊,在Adhoc模式下進行頻道掃描?
或者有其他方法可以獲取RSSI信息嗎?

+0

ad-hoc管理模塊的實現實際上相當有限。我正在考慮進行以下更改以啓用讀取RSSI:1.向Ieee80211MgmtAdhoc類添加信標廣播; 2.添加一個表格來保存相鄰節點的RSSI等級; 3.修改SNIRReceiverBase類(無線電模塊)中的computeReceptionIndication()方法,將RSSI讀數添加到附加到MAC幀的ReceptionIndication結構中。 >>這個想法是從信標幀讀取RSSI並將其添加到鄰居節點的表中 – zanlik

回答

0

那麼,你做了你的工作嗎?
正如我們所知,存在一種實現的方法,其記錄接收到的信號強度bss.setRxPower(ap->rxPower)
但是在同一個文件中,我們可以發現ap的變量最初是在storeAPInfo(const MACAddress& address, const Ieee80211BeaconFrameBody& body)的函數中。
見下文:

void Ieee80211MgmtSTA::storeAPInfo(const MACAddress& address, const Ieee80211BeaconFrameBody& body) 
{ 
    APInfo *ap = lookupAP(address); 
    if (ap) { 
     EV << "AP address=" << address << ", SSID=" << body.getSSID() << " already in our AP list, refreshing the info\n"; 
    } 
    else { 
     EV << "Inserting AP address=" << address << ", SSID=" << body.getSSID() << " into our AP list\n"; 
     apList.push_back(APInfo()); 
     ap = &apList.back(); 
    } 

    ap->channel = body.getChannelNumber(); 
    ap->address = address; 
    ap->ssid = body.getSSID(); 
    ap->supportedRates = body.getSupportedRates(); 
    ap->beaconInterval = body.getBeaconInterval(); 
    //XXX where to get this from? 
    //ap->rxPower = 。。。 
} 

正如我們所看到的,AP-> RXPOWER沒有初始這意味着,我們在sendScanConfirm()功能中獲得的價值將始終爲零。那麼,有沒有其他方法可以獲得RSSI?

0

挖掘到的源代碼之後,I`ve發現在文件FlatReceiverBase一個有趣的功能

bool computeIsReceptionPossible(const IListening *listening, const IReception *reception, IRadioSignal::SignalPart part) const 

哪條路徑可以是「#包括」 INET /物理層/基層/ packetlevel/FlatReceiverBase」。參見下面:

bool FlatReceiverBase::computeIsReceptionPossible(const IListening *listening, const IReception *reception, IRadioSignal::SignalPart part) const 
{ 
    if (!NarrowbandReceiverBase::computeIsReceptionPossible(listening, reception, part)) 
     return false; 
    else { 
     const FlatReceptionBase *flatReception = check_and_cast<const FlatReceptionBase *>(reception); 
     W minReceptionPower = flatReception->computeMinPower(reception->getStartTime(part), reception->getEndTime(part)); 
     bool isReceptionPossible = minReceptionPower >= sensitivity; 
     EV_DEBUG << "Computing whether reception is possible: minimum reception power = " << minReceptionPower << ", sensitivity = " << sensitivity << " -> reception is " << (isReceptionPossible ? "possible" : "impossible") << endl; 
     return isReceptionPossible; 
    } 
} 

所以,我們可以發現,在這個函數中,我們可以得到的接收電力minReceptionPower變量之後,我們可以使用嵌入數學運算符mW2dBm轉換接收功率RSSI值。 注意,如果追蹤源,我們可以發現這個模塊是在Ieee80211Radio模塊初始化的。 我希望可以幫助遇到同樣問題的人。

相關問題