首先,讓咱們從一個包含兩個節點的「network」開始。節點將作一些簡單的事情:一個是節點將建立一個數據包,而兩個節點將繼續來回傳遞相同的數據包。咱們將節點稱爲tic
和toc
。稍後,咱們將逐步改進此模型,並在每一個步驟中引入OMNeT ++功能。
這是您從頭開始實施首次仿真所採起的步驟。html
經過輸入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文件。網絡
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 ++安裝目錄中找到該手冊。)ide
如今,咱們須要在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時間限制,但在本教程中咱們不這樣作。)工具
爲了可以運行仿真,咱們須要建立一個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文件。
如今,咱們已經完成了建立第一個模型的準備,並能夠編譯和運行它了。url
Omnet++學習資源太少,我的翻譯不易。您的每一分錢都會給後來的開發者提供幫助!感謝支持。spa