OMnet++ 初學者教程 第一節 入門
- 2021 年 3 月 31 日
- 筆記
- omnet++, OMNet++系列 初學者教程, 初學者教程
第1部分-入門
1.1模型
首先,讓我們從一個包含兩個節點的「network」開始。節點將做一些簡單的事情:一個是節點將創建一個數據包,而兩個節點將繼續來回傳遞相同的數據包。我們將節點稱為tic
和toc
。稍後,我們將逐步改進此模型,並在每個步驟中引入OMNeT ++功能。
這是您從頭開始實施首次模擬所採取的步驟。
1.2設置項目
通過輸入omnetpp
終端來啟動OMNeT ++ IDE 。(我們假設您已經安裝了有效的OMNeT ++。如果沒有,請安裝最新版本,並根據需要諮詢_安裝指南_。)進入IDE後,從菜單中選擇「新建」->「 OMNeT ++項目」。
將出現一個嚮導對話框。輸入tictoc
作為項目名稱,在詢問有關_項目_的初始內容時選擇「_Empty _Project」,然後單擊「完成」。你將在_Project Explorer中_看到一個空項目。(注意:某些OMNeT ++版本會package.ned
在項目中生成文件。我們現在不需要它:通過選擇文件並單擊Delete刪除文件。)
該項目將保存屬於我們模擬的所有文件。在我們的示例中,項目由一個目錄組成。對於較大的模擬,通常將項目的內容分類到src/
和simulations/
文件夾中,並一般將其放在這兩個子文件夾下。
Note 注意!
使用IDE完全是可選的。命令行也上可以使用OMNeT ++的幾乎所有功能(某些圖形密集型和互動式功能(如序列圖瀏覽和結果繪圖)除外)。可以使用任何文本編輯器來編輯模型源文件,並且OMNeT ++提供了用於特殊任務的命令行工具,例如生成文件,將消息文件轉換為C ++,結果文件查詢和數據導出等。要在沒有IDE的情況下繼續操作,只需創建一個目錄,然後使用您喜歡的文本編輯器在其中創建以下NED,C ++和ini文件。
1.3添加NED文件¶
OMNeT ++使用NED文件來定義組件並將它們組裝成更大的單元,例如網路。我們開始通過添加NED文件來實現我們的模型。要將文件添加到項目中,請在左側的_項目資源管理器_面板中右鍵單擊項目目錄 ,然後 從菜單中選擇_NEW->網路描述文件Network Description File(NED 網路描述文件)_。提示您輸入文件名時輸入tictoc1.ned
。
創建文件後,可以在OMNeT ++ IDE的「_編輯器」區域_中編輯該文件。OMNeT ++ IDE的NED編輯器有兩種模式:「_Design」_和「Source」。您可以使用編輯器底部的標籤在它們之間切換。在Design 模式下,可以使用滑鼠和右側的調色板以圖形方式編輯拓撲。在_Source模式(源程式碼模式)_下,可以直接編輯NED源程式碼文本。在其中一種模式下所做的更改將立即反映在另一種模式下,因此您可以在編輯期間自由地在兩種模式之間切換,並選擇在更方便的任何一種模式下進行更改。(NED文件是純文本文件,因此您甚至可以使用外部文本編輯器來編輯它們,儘管您會錯過語法高亮顯示,內容輔助,交叉引用和其他IDE功能。(那就不用外部編輯器唄!))
切換到「_Source」_模式,然後輸入以下內容
simple Txc1
{// 定義一個簡單模組
gates:
input in;
output out;
}
//
// Txc1的兩個實例(tic和toc)雙向連接
// Tic 和 toc 會互相發送資訊
//
network Tictoc1
{//定義一個網路模組
submodules:
//網路模組由兩個子模組組成嗎,子模組的兩個組成部分tic,toc
tic: Txc1;
toc: Txc1;
connections:
// 子模組之間的連接,但相箭頭表示單向鏈接,{}中間定義連接的傳輸延時是100ms
tic.out --> { delay = 100ms; } --> toc.in;
tic.in <-- { delay = 100ms; } <-- toc.out;
}
完成後,切換回_Design_模式。您應該會看到類似以下內容的內容:
文件中的第一個塊聲明Txc1
為簡單模組類型。簡單模組在NED級別上是原子的(最小模組,不可被拆分了)。它們也是活動組件(意思是組成其他大模組的組件),其行為是用C++實現的。該聲明還說 Txc1
有一個名為輸入的門in
和一個名為的輸出門out
。
第二個塊聲明Tictoc1
作為network(網路)。Tictoc1
是由兩個子模組組裝而成的,並且這兩個子模組tic,``toc
都是Txc1
的實例, tic
的輸出門(gate)連接到toc
的輸入門(gate),反之亦然。兩種方式都有100ms的傳播延遲。
筆記
您可以在《OMNeT ++模擬手冊》中找到有關NED語言的詳細說明 。(也可以在doc
OMNeT ++安裝目錄中找到該手冊。)
1.4添加C ++文件
現在,我們需要在C ++中實現Txc1簡單模組的功能。txc1.cc
通過從項目的上下文菜單中選擇「新建」->「源文件」(或從IDE主菜單中選擇「_File」->「New」->「File 」)_來創建一個文件名(指定文件夾創建文件,注意填寫後綴,不然默認創建.h文件),然後輸入以下內容:
#include <string.h>
#include <omnetpp.h>
using namespace omnetpp;
/**
* 類Txc1繼承cSimpleModule,在Tictoc1 網路結構中,tic和toc鬥士Txc1類的實例,
* 他們在模擬程式開始運行的時候就會被創建
*/
class Txc1 : public cSimpleModule
{
protected:
// The following redefined virtual function holds the algorithm.
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};
// The module class needs to be registered with OMNeT++
// 定義的類Txc1都需要在OMNET++註冊後才可以被使用
Define_Module(Txc1);
void Txc1::initialize()
{
// 模擬開始最初運行的程式.
// 引導運行tic-toc-tic-toc進程,
// 其中一個模組需要發送第一條資訊,我們讓tic先發送。
// 首先判斷是tic還是toc
if (strcmp("tic", getName()) == 0) {
// 在out門(gate) 發送第一條資訊,我們在message對象中隨意發了一個 "tictocMsg"
cMessage *msg = new cMessage("tictocMsg");
send(msg, "out");
}
}
void Txc1::handleMessage(cMessage *msg)
{
// handleMessage()函數:當資訊傳輸到當前module時被喚醒
// 這這個module中的這個函數,我們僅僅從out gate 中發送msg。
// 因為tic和toc都做同樣的事情,所以他們會來來回回的互發資訊
send(msg, "out"); // 發送 message
}
的Txc
簡單module,由C ++類表示Txc1
。的Txc1
類需要繼承的OMNeT ++的cSimpleModule
類,並需要在OMNeT ++註冊Define_Module()
宏。
筆記!
忘記Define_Module()
定義宏一個常見的錯誤。如果缺少該內容,則會收到與以下內容類似的錯誤消息:。"Error: Class 'Txc1' not found -- perhapsits code was not linked in, or the class wasn't registered with Register_Class(), or inthe case of modules and channels, with Define_Module()/Define_Channel()"
我們從重新定義兩種方法cSimpleModule
:initialize()
和handleMessage()
。它們是從模擬內核調用的:initialize()
僅調用一次,handleMessage()
在消息到達模組時調用。
在其中,initialize()
我們創建一個消息對象(cMessage
),然後將其從out
gate發送出去。由於此門連接到另一個模組的in
門,因此在handleMessage()
分配給NED文件中的鏈接的傳播延遲為100ms之後,模擬內核將在以下參數中將此消息傳遞給另一個模組。另一個模組只是將其發送回去(另一個100毫秒的延遲),因此它將導致來來回回的互相發送一樣的資訊。
Messages(數據包,幀,作業等)和events(計時器,超時)均由OMNeT ++中的cMessage對象(或其子類)表示。在發送或安排它們之後,它們將由模擬內核保存在「預定事件」或「未來事件」列表中,直到時間到了,並通過handleMessage()
傳遞給modules.
請注意,此模擬中沒有內置停止條件:它將永遠持續下去。你可以從從GUI手動停止它。(您也可以在配置文件中指定模擬時間限制或CPU時間限制,但在本教程中我們不這樣做。)
1.5添加omnetpp.ini
為了能夠運行模擬,我們需要創建一個omnetpp.ini
文件。 omnetpp.ini
告訴模擬程式您要模擬哪個網路(因為NED文件可能包含多個網路),您可以將參數傳遞給模型,為隨機數生成器顯式指定種子,等等。
omnetpp.ini
使用_File->New->Initialization file (INI)_ 菜單項創建文件。新文件將在_Inifile編輯器中_打開。作為NED編輯器,Inifile編輯器還具有兩種模式,即_Form(表單模式)和_Source(程式碼模式),它們可以編輯相同的內容。前者更適合配置模擬內核,後者更適合輸入模組參數。
現在,只需切換到「_Source」_模式並輸入以下內容:
[General]
network = Tictoc1
您可以在「_Form」_模式下驗證結果:
tictoc2
所有後續步驟將共享一個通用的omnetpp.ini文件。
現在,我們已經完成了創建第一個模型的準備,並可以編譯和運行它了。
Omnet++學習資源太少,個人翻譯不易。您的每一分錢都會給後來的開發者提供幫助!感謝支援。