光陰似箭,歲月如梭,畢業後 OMNet++ 都更新到第 5 版了...
我真的很推崇它的圖形介面,很好 demo、很好 debug。
前往 OMNet++ web site https://omnetpp.org/
光陰似箭,歲月如梭,畢業後 OMNet++ 都更新到第 5 版了...
我真的很推崇它的圖形介面,很好 demo、很好 debug。
前往 OMNet++ web site https://omnetpp.org/
沒想到我還沒靠 OMNet++ 寫上任何一篇 paper,它就出到 4.1 了,雖然看 了一下改變不大,但確讓我原本 4.0 的 code 不能跑了,加上 4.1 的 manual.pdf 沒有做「書籤」,所以還是用 4.0 的好了。
最近在寫有關 Mobile P2P 的模擬,wireless P2P 不同 wired P2P,不需要 測試大量的 peer,但相對 topology 和 mobile path 就很重要,所以初期 debug 透過 GUI 顯得非常清楚,參考 xMIPv6 和 InetMANet 可以利用到很多有 用的 code,動態的 GUI 和漂亮的 IDE 本來就是 OMNet++ 強勢的優點,要不然 去用 NS2 就好了。
所有圖形化的介面可以透過 .ned 和 .cc 控制,我喜歡用 .cc 呼叫,可以 對應每行 code 做變化,只要在參考範例的 code 中看到 if (ev.isGUI()) 這樣 的區塊,幾乎八九不離十是要做 show 圖的動作,例如
幹!每次寫 OMNet++ 都一肚子火,為了解小小的 bug 花一兩個小時,例如今天下午要 加入 trace routing 的功能,確怎麼也不能送出 message,後來 try and error 才知道呼叫 finish() 時,就不能再傳送 message 了,原因是接收端的程式已經 destruct 了。馬的!我稍微分享一 下心得好了。
想要模擬網路的元件幾乎都從 cSimpleModule 著手,可以寫一個 class 繼承它,例如 class Server : public cSimpleModule,按照規定,Server 必須覆寫 initialize()、handleMessage (cMessage *msg)、finish(),最好是也覆寫 activity()。當模擬 run 起來後,call 的順序就是 constructor → initialize() → finish() → destructor。
如同 C/C++ 或 Java 等主流語言採 stack 管理,如果是一個 server - client 程式,那 server 會先被 construct 起來,然後 client 1 construct ... client 10,結束由 client 10 先 destruct,再 ... de 到 client 1,最後是 server。所以當我呼叫 server's finish() 時, clients' finish() 可能已經被呼叫 了,也 destruct 了,所以 server 送出的 message 沒人接收。
OMNet++ 有個強大的地方就是 timer,就是模擬的時間,我不知道 NS2 有沒 有利用時間控制流程的功能,就是到某個時間驅動某個事件,雖然這功能在 OMNet++ 不是很直觀,但為了寫 real time 的 simulation 這是必要的。
OMNet++ 是以 message trigger,所有事件的發生、處理、停止都是藉由 message,所以如何讓時間跑也是靠 message,當程式一開始可以發個 message 給自己,而當自己收到此 message 後再加上一個特定時間再把這 message 丟給 自己,於是就相隔特定時間不斷的處理這個訊息,時間軸就會往前推進,而在每 個時間點也就可以處理事情,不用等其他人丟事件才能動。
因為是用 message 推著時間跑,所以多少 message type 就可以有多少 timer,利用 multi-timer 的觀念就可以實現"史瑞德" thread,不用真的用 C++ 去寫 thread 了,至少我覺得 C 的 thread 很難寫 >" 想更了解 OMNet++ 的時間可以參考 cSimulation 這個 class,simTime( ) 和 scheduleAt( ) 都在那。
OMNet++ 很蠢,在一個 .h 檔裡頭最好只定義一個 class,同樣的在 .cc 裡 頭也不要寫到 2 個 class,否則有可能出錯,那種 de 不出 bug 的錯... ...
OMNet++ 很蠢,class 的 constructor 一定要保有參數是 void 的,當然可 以 overlaod,但原本 void 的那個不能刪 = ="
雖然 OMNet++ 的 IDE 是從 Eclipse 發展而來的,但注意在 OMNet++ project name「不能有空白符號」,在 Eclipse 開一個 project 取名 P2P file sharing simulation 是允許的,但在 OMNet++ 則不行,要改成 P2P_file_sharing_simulation 之類的。
有這個差異是因為 OMNet++ 的 Makefile 沒有做空白符號的判斷,如果您覺 得不爽,可以自己寫 Makefile。
雖然 OMNet++ 沒有硬性規定 project 的子目錄要怎麼命名或配置,但它本 身就是為了 network simulation 開發的,所以為了讓它內建的編譯順利,最好 包含 3 個子資料夾:out、simulation、src。
因為嵌入式系統的第一個作業要做 timer task,所以 survey 了一下並 try 了幾行 code,參考 C/C++ API 與範例後,才知道 standard C/C++ 最小就定義到秒,要更小就要靠 OS 和 compiler 支援了,例如在 Linux 可以用 gettimeofday() 算到 mili-second,Windows 可以用 QueryPerformanceFrequency() 和 QueryPerformance Counter() 逼近到 micro-second。
我用 Dev-C++ 來寫,基本的 time function 定義在 裡,如果想要比"秒"更精確可以用 clock() 或參考 Dev 特有的 。
clock() 回傳的 type clock_t 其實是個 rate,是 system clocks 或 frequency,所以要轉換成時間,例如用 CLOCKS_PER_SEC 這個常數。在我的 Windows 平台上這值等於 1000,所以已經精確至 mili-second 了;在我的 Linux 平台上為 128。
介紹:
OMNet++ 是套 network simulator,不同於 NS2,他除了可以觀察 packet level 的 performance,還可以架構 overlay,觀察 service level 的 QoS。讓我最推崇的一點是它的開發環境是 eclipse,一個 Java-based 的超強程式開發工具,不管是 trace code、survey INET or OverSim、寫新的 simulation 都不會像 NS2 那樣雜亂無章。其二,OMNet++ 在跑模擬時,是有圖形化介面的,在初期測試時可以觀察 debug,一些有關 QoS 的參數也會不斷的 print 出來,可以在任何時間停止或繼續,蠻方便的。
同 NS2,OMNet++ 是基本的網路藍圖,很多研究單位都在上面推出新的模組,想做任何網路模擬都可以由它從零開發,或是直接套用修改別人寫好的模組,如 WiFi、WiMax、TCP/UDP、P2P 都有了!