Veins源碼閱讀—connectionManager模塊

記一次深度的踩坑,在這個坑中摸爬滾打了幾天之後,發現進錯坑了。留給後續使用veins做車聯網仿真的入坑者,一點啓示。
原來的目的:
我本來是打算實現RSU和Car有不同的通信距離。在修改了ini文件中的maxInterfDistdrawMaxIntfDist之後通過仿真頁面觀察到,車輛和RSU的覆蓋範圍發生了變化,而且在通信過程中數據包傳輸的距離也正好是maxInterfDist 的範圍。我們就錯誤的認爲,這裏就是實現RSU和Car不同通信範圍的地方。然後就開始了深度踩坑之旅。
結論:
如果你要實現RSU和Car不同的通信範圍,只需要修改他們mac層的發送功率即可。connectionManager模塊僅僅是對他們直接的連接進行管理,即對哪些模塊進行連接(網卡端口之間),哪些結點去掉連接。但是具體的數據包能不能收到,則是根據發送功率,接收功率進行確定的。仿真頁面太迷惑人了,即使仿真過程中有數據包過去,也不一定真的接收到(因爲功率問題)。具體的可以在仿真的過程中看具體的輸出,在連接範圍內只能收到AirFrame,但是在處理的過程中會發現並沒有收到數據包。
然後我們就來看看connectionManager模塊具體是做什麼的?
connectionManager模塊

  • ConnectionManager.ned

在這裏插入圖片描述
從上面的註釋我們可以看出,管理協調所有節點之間的連接,並且動態的處理門的創建。因此它週期性的和移動模塊和信道接入模塊進行通信。
maxInterfDist 是任何傳輸的最大上界。

  • ConnectionManager.h&ConnectionManager.cc
    在這裏插入圖片描述
    頭文件就定義了一個虛函數,計算最大的通信範圍。
    在這裏插入圖片描述
    這裏僅僅是讀取ini文件中定義的最大通信範圍,然後返回。
    這裏介紹另一種寫法,更具功率、頻率等,使用自由空間衰落模型進行計算。不過這裏的需要ned文件和頭文件都需要做出相應的改動。
   double interfDistance;

    //the minimum carrier frequency for this cell
    double carrierFrequency = par("carrierFrequency").doubleValue();
    //maximum transmission power possible
    double pMax             = par("pMax").doubleValue();
    if (pMax <=0) {
        error("Max transmission power is <=0!");
    }
    //minimum signal attenuation threshold
    double sat              = par("sat").doubleValue();
    //minimum path loss coefficient
    double alpha            = par("alpha").doubleValue();

    //const
    double waveLength     = (BaseWorldUtility::speedOfLight()/carrierFrequency);

    //minimum power level to be able to physically receive a signal
    double minReceivePower = pow(10.0, sat/10.0);

    ccEV << "max interference distance:" << interfDistance << endl;

    return interfDistance;
  • BaseConnectionManager.h
    這個函數就是最重要的函數,這裏僅介紹每個函數是幹什麼的。
    在這裏插入圖片描述
    首先在頭文件中聲明瞭一個網格座標類,大概意思就是,將整個仿真背景根據最大傳輸距離劃分爲若干個網格,然後用有一個座標來表示每一個網格。
    在這裏插入圖片描述
    這裏是因爲C++中沒有hash set,新建了一個類來模擬hash set.

在這裏插入圖片描述
這裏是主要的函數,很多函數之間是相互調用的關係。首先是initialize初始化的函數。然後就是從
在這裏插入圖片描述
ChannelAccess::receiveSignal函數開始,逐步進行調用,根據這個順序,依次閱讀源碼的註釋即可。
注:
在車聯網的仿真中,這一塊並不需要做出修改。只是能夠幫助你理解Veins是如果如何工作起來的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章