Hướng dẫn TicToc cho Omnet++ Hướng dẫn ngắn này hướng dẫn về Omnet++ giúp bạn dạo qua một ví dụ cho việc mô hình hóa và mô phỏng, cho bạn thấy một số cách thông thường dùng với các tiện ích Omnet++. Bài này dựa trên ví dụ mô phỏng TicToc, bạn có thể tìm thấy ví dụ này trong thư mục samplestictoc của bộ cài Omnet++, nên bạn có thể thử ngay lập tức cách các ví dụ làm việc thế nào. Tuy nhiên, bạn sẽ tìm thấy nhiều hướng dẫn hữu ích hơn nếu bạn thực sự thực hành ít nhất các bước đầu tiên mô tả ở đây.
Hướng dẫn TicToc cho Omnet++ ng dn ngng dn v Omnet++ giúp bn do qua mt ví d cho vic mô hình hóa và mô phng, cho bn thy mt s ng dùng vi các tin ích Omnet++. Bài này da trên ví d mô phng TicToc, bn có th tìm thy ví d này trong c samples/tictoc ca b cài Omnet++, nên bn có th th ngay lp tc cách các ví d làm vic th nào. Tuy nhiên, bn s tìm thy nhing dn hu bn thc s thc hành ít nhu tiên mô t Chú ý: Chúng tôi gi s ng bt b cài làm vic Omnet++. Chúng tôi s rng bn có mt kin thc tt v C++, và b thuc vi vic phát trin C/C++ (chnh sa file ngun, dch, bt l u hành ca bn. (u va ri là ngoài phm vi ca chúng tôi - có nhiu cung dn tu bn cn cp nht kin thc ngh s dng phát trin tích hp Omnet++ cho vic chnh sa và xây dng các mô phng ca bn. làm các ví d d t c các code ngun s c nêu mà ch c nêu tên, bn s t tìm c samples/tictoc. Tài liu này và mô hình TicToc là mt phiên bc m rng bng dn TicToc gc t Ahmet Sekercioglu (i hc Monash). Ni dung: I.Khởi đầu II.Tăng cường thành 2-node TicToc III.Chuyển thành một mạng thực tế hơn I.Khởi đầu: Sources: tictoc1.ned, txc1.cc, omnetpp.ini Vì vùng ng dng ph bin nht ca Omnet++ là mô phng các mng truyn thông, chúng ta s làm vi ch này t vi bu, chúng ta bu vi mt mng bao gm 2 node. Các node s làm vài vin: mt trong các node s to mt packet, và 2 node s gi vic qua li cùng gói tin vào và ra. Chúng ta g c bn thc hin mô phu tiên ca bn t u: 1.To mc làm vic gi là tictoc và cd (lnh cd ca dos) c này 2.Mô t mng ví d ca bn bng vic to mt file topology. Mt file topology là mnode ca mng và các liên kt gia chúng. Bn có th to nó vi trình chnh sa bt tên cho nó là tictoc1.ned: // // This file is part of an OMNeT++/OMNEST simulation example. // // Copyright (C) 2003 Ahmet Sekercioglu // Copyright (C) 2003-2008 Andras Varga // // This file is distributed WITHOUT ANY WARRANTY. See the file // `license' for details on this and other legal matters. // simple Txc1 { gates: input in; output out; } // // Two instances (tic and toc) of Txc1 connected both ways. // Tic and toc will pass messages to one another. // network Tictoc1 { submodules: tic: Txc1; toc: Txc1; connections: tic.out > { delay = 100ms; } > toc.in; tic.in < { delay = 100ms; } < toc.out; } c tt nht là t i lên. n nói: -TicToc1 là mt mc tp hp t hai module con, tic và toc. Tic và toc là các th hin ca cùng 1 kiu module gi là Txc1. Chúng ta kt ni cng ra ca n cng vào cc l tr 100ms vi c ng. -Txc1 là mt kic nguyên t trong ngôn ng Ned, và s t trong C++). Txc1 có 1 cng vào tên là in, và mt cng ra tên là out. 3.Chúng ta ct chn Txc1. Vi tr bi mt file C++ tên là txc1.cc: // // This file is part of an OMNeT++/OMNEST simulation example. // // Copyright (C) 2003 Ahmet Sekercioglu // Copyright (C) 2003-2008 Andras Varga // // This file is distributed WITHOUT ANY WARRANTY. See the file // `license' for details on this and other legal matters. // #include <string.h> #include <omnetpp.h> class Txc1 : public cSimpleModule { protected: // The following redefined virtual function holds the algorithm. virtual void initialize(); virtual void handleMessage(cMessage *msg); }; // The module class needs to be registered with OMNeT++ Define_Module(Txc1); void Txc1::initialize() { // Initialize is called at the beginning of the simulation. // To bootstrap the tic-toc-tic-toc process, one of the modules needs // to send the first message. Let this be `tic'. // Am I Tic or Toc? if (strcmp("tic", getName()) == 0) { // create and send first message on gate "out". "tictocMsg" is an // arbitrary string which will be the name of the message object. cMessage *msg = new cMessage("tictocMsg"); send(msg, "out"); } } void Txc1::handleMessage(cMessage *msg) { // The handleMessage() method is called whenever a message arrives // at the module. Here, we just send it to the other module, through // gate `out'. Because both `tic' and `toc' does the same, the message // will bounce between the two. send(msg, "out"); } Kic mô t bi lp C++ : Txc1, cái này là mt lp con t l Omnet++ vi macro c t cSimpleModule: c triu gi t nhân mô phng: cái u tiên ch duy nht 1 ln, còn cái th hai thì khi mn ti mt module. Trong initialize() chúng ta to mp (cMessage), và gi nó ra ngoài qua cng out. Vì cc kt nn cng ra ca module khác, nhân mô phng s n module khác trong handleMessage()sau truyn thông tr liên kt trong file Ned. Module khác gi nó quay li (v tr 100ms), nên nó s có h qu u ng ping-pong liên tc. kin (các b nh thi, c môt t tt c bng cMessage( hoc các lp con ca nó) trong Omnet++. Sau khi bn gi hoc lên lch cho chúng, chúng s c t chc bi nhân mô ph kit l kin n khi thi gian cc phân phn các module thông qua handleMessage(). Chú ý rng u kin dng cho mô phng này: nó s tip tn mãi mãi. Bn có th dng nó t giao dii dùng. (Bn có th nh thi gian gii hn cho mô phng hoc gii hn thi gian cho CPU trong file cu ng dn này). 4. Chúng ta bây gi to Makefile cái này s giúp chúng ta dch và liên kt to file tictoc có kh y: $ opp_makemake Lnh này s phi to ra mt makefc làm vic tictoc: 5.Gi ta dch và liên kt mô phu tiên ca chúng ta bng vic dùng lnh make: $ make 6.Nu bn bu chy bây gi, nó s gii thích nó không th tìm thy file omnetpp.ini, nên bn phi to my. omnetpp.ini nói v trình mô phng cái mng bn mun mô phng (vâng, 1 vài mng có th sng ng), bn có th cho mô nh chính xác các seed cho vic sinh s ng To mt file omnetpp.ini r [General] Network=Tictoc1 Tictoc2 và cho tt c c sau file omnetpp.ini sau: # This file is shared by all tictoc simulations. # Lines beginning with `#' are comments [General] # nothing here [Config Tictoc1] network = Tictoc1 [Config Tictoc2] network = Tictoc2 [Config Tictoc3] network = Tictoc3 [Config Tictoc4] network = Tictoc4 Tictoc4.toc.limit = 5 [Config Tictoc5] network = Tictoc5 **.limit = 5 [Config Tictoc6] network = Tictoc6 [Config Tictoc7] network = Tictoc7 # argument to exponential() is the mean; truncnormal() returns values from # the normal distribution truncated to nonnegative values Tictoc7.tic.delayTime = exponential(3s) Tictoc7.toc.delayTime = truncnormal(3s,1s) [Config Tictoc8] network = Tictoc8 [Config Tictoc9] network = Tictoc9 [Config Tictoc10] network = Tictoc10 [Config Tictoc11] network = Tictoc11 [Config Tictoc12] network = Tictoc12 [Config Tictoc13] network = Tictoc13 7.Khi b c trên, bn chy mô phng bng lnh này: $ ./tictoc Và hi vng bc ca s mô phng Omnet++ 8.n nút Run trên thanh công c khng mô phng. Bn s thy cais cách p vi nhau. Công c ca s chính hin th thi gian mô phng. Thi gian này là thi gian o, không có gì n thi gian thng h ng) v y. Thc s, s giây bn có th chy trong th gii thc ph thuc cao vào t ca phn cng ca bn và thng phc tp ca chính mô hình mô phng. Chú ý rng thi gian mô phng cho m x lí tin nhn là bng 0. Ch nhng th i gian mô phng qua l tr trong các kt ni. 9.Bn có th làm chnh hoi thanh cun trên nh ca s ha. Bn có th dng môt hình bng n nút stop trên toolbar), chy tc (f4), chay nó vi f5 hoc thoát khi hình nh (f6). 10.Bn có th thoát kh ng bng vic click vào biu ng close hoc la chn File|Exit II.Bổ sung thêm cho 2 node TicToc: Bước 2: thêm ảnh đồ họa, và thêm đầu ra gỡ lỗi Sources: tictoc2.ned, txc2.cc, omnetpp.ini u file images/block/routing.png) và tô nó màu tía cho tic và vàng cho toc. Vic bng vic thêm chui hin th n file NED. Th i= trong chui hin th nh icon. // "block/routing" icon to the simple module. All submodules of type // Txc2 will use this icon by default // simple Txc2 { parameters: @display("i=block/routing"); // add a default icon gates: input in; output out; } // // Make the two module look a bit different with colorization effect. // Use cyan for `tic', and yellow for `toc'. // network Tictoc2 { submodules: tic: Txc2 { parameters: @display("i=,cyan"); // do not change the icon (first arg of i=) just colorize it } toc: Txc2 { parameters: @display("i=,gold"); // here too } connections: Bn s thy kt qu nh s p g li cho Txc1 bng vic chuy \ Và EV<<-\ Khi bn chy mô phng trong giao din Tkenv c xut hin trên ca s n: Bn có th m mt dãy các ca s u ra cho tic và toc bng vic n chut phi trên bing và la chn module output t menu. Tin ích này s hu ích khi bn có mt môt hình và bn ch p ghi li ca module c th Bước 3: thêm một biến trạng thái Sources: tictoc3.ned, txc3.cc, omnetpp.ini c này chúng ta thêm mt b p sau i. Chúng ta thêm b p: class Txc3 : public cSimpleModule { private: int counter; // Note the counter here protected: Chúng ta thit lp bin giá tr là 10 trong initialize() và gim trong m v 0, mô phng s ht s kin và hy. Chú ý dòng: WATCH(counter); Dòn trong mà ngun: vic này làm có th nhìn thy giá tr b m trong Tkenv. t vào bing ca chn ni dung trang Content t ca s theo dõi: [...]... tôi cho omnet++ sinh các lớp tự động cho chúng ta Lớp thông điệp mô tả trong tictoc1 3.msg: message { int int int } TicTocMsg13 source; destination; hopCount = 0; Makefile thiết lập cho việc biên dịch các thông điệp, opp_msgc được triệu gọi và nó sinh tictoc_ m.h và tictoc1 3_m.cc từ khai báo thông điệp Chúng sẽ chứa một lớp TicTocMsg13 sinh ra từ lớp cMessage Lớp sẽ có các phương thức set và get cho. .. nối Việc này cho phép dễ dang thay đổi tham số trễ của toàn mạng Bước 12: Sử dụng kết nối hai chi u: Sources: tictoc1 2.ned, txc12.cc, omnetpp.ini Nếu chúng ta kểm tra phần connections nhiều hơn một chút, chúng ta sẽ nhận ra mỗi cặp node được kết nối với 2 kết nối Mỗi hướng một kết nối Omnet++ 4 hỗ trợ kết nối hai chi u, giờ ta sử dụng chúng Đầu tiên, chúng ta phải định nghĩa cổng hai chi u (hay gọi... hơn 2 nodes Sources: tictoc1 0.ned, txc10.cc, omnetpp.ini Bây chúng ta sẽ làm một bước lớn: tạo một vài module tic và kết nối chúng thành một mạng Rồi chúng ta cho chúng làm việc đơn giản: một trong các node sinh một thông điệp, và các node khác tung thông điệp cho nhau theo các hướng ngẫu nhiên đến khi nó đến node đích đã xác định từ trước File Ned sẽ cần một ít thay đổi Đầu tiên cho tất cả, module Txc... cMessage Lớp sẽ có các phương thức set và get cho mọi trường Chúng tôi sẽ gộp tictoc1 3_m.h đến code C++ của chúng ta, và chúng ta có thể sử dụng TicTocMsg13 như các lớp khác #include "tictoc1 3_m.h" Ví dụ, chúng ta sử dụng các dòng sau trong generateMessage() để tạo thông điệp và thêm giá trị các trường: TicTocMsg13 *msg = new TicTocMsg13(msgname); msg->setSource(src); msg->setDestination(dest); return... suffix is used to identify the input/output part of a two way gate send(msg, "gate$o", k); } Chú ý: hậu tố đặc biệt $i và $o theo sau tên cổng cho phép chúng ta sử dụng với dãy kết nối hai chi u Bước 13: định nghĩa lớp message của riêng ta Sources: tictoc1 3.ned, tictoc1 3.msg, txc13.cc, omnetpp.ini Trong bước này địa chỉ đích sẽ không còn là cố định với tic[3] nữa – chúng ta tạo một đích ngẫu nhiên, và... gian trong Omnet++ có được bời việc module gửi thông điệp cho chính nó Các thông điệp như vậy được gọi là selfmessage Ta thêm hai biến cMessage là event và tictocMsg đến lớp, để nhớ các thông điệp ta sử dụng thời gian và thông điệp xử lí trễ khi ta đang mô phỏng class Txc6 : public cSimpleModule { private: cMessage *event; // pointer to the event object which we'll use for timing cMessage *tictocMsg;... trong omnetpp.ini: Tictoc7 .tic.delayTime = exponential(3s) Tictoc7 .toc.delayTime = truncnormal(3s,1s) Bạn có thể cố gắng nhiều lần bạn chạy lại mô phỏng (hoặc khởi động nó), bạn sẽ nhận chính xác cùng các kết quả Việc này bởi vì Omnet++ sử dụng thuật toán xác định (mặc định là Mersenne Twister RNG) để sinh các số ngẫu nhiê và khởi tạo nó cùng các seed- hạt nhân Việc này quan trọng cho việc mô phỏng... này: void Txc13::handleMessage(cMessage *msg) { TicTocMsg13 *ttmsg = check_and_cast(msg); if (ttmsg->getDestination()==getIndex()) Trong các đối gửi đến handleMessage(), chúng ta nhận được thông điệp như một con trỏ lớp cMessage Tuy nhiên, chúng ta chỉ có thể truy cập các trường của nó trong định nghĩa TicTocMsg13 nếu chúng ta ép kiểu msg sang TicTocMsg13 * C++ đưa đến một giải pahsp được... Sources: tictoc1 1.ned, txc11.cc, omnetpp.ini Định nghĩa mạng mới của chúng ta khá phức tạp và dài, đặc biệt là phần kết nối Thử làm nó đơn giản Thứ đầu tiên ta nhận thấy các kết nối thường sử dụng cùng tham số trễ delay Có thể tạo các kiểu cho các kết nối (chúng được gọi là các kênh-channel) giống các module đơn giản Chúng ta có thể tạo một kiểu kênh chỉ ra tham số trễ và ta sẽ sử dụng kiểu đó cho tất... chúng ta: network Tictoc5 { submodules: tic: Tic5; // the limit parameter is still unbound here We will get it from the ini file toc: Toc5; connections: Như bạn có thể thấy, định nghĩa mạng giờ ngắn và đơn giản hơn nhiều Việc kế thừa cho phép bạn sử dụng các kiểu phổ biến trong mạng của bạn và tránh xa các định nghĩa dư thừa và thiết lập tham số Bước 6: việc mô hình xử lí trễ Sources: tictoc6 .ned, txc6.cc, . Tictoc1 [Config Tictoc2 ] network = Tictoc2 [Config Tictoc3 ] network = Tictoc3 [Config Tictoc4 ] network = Tictoc4 Tictoc4 .toc.limit = 5 [Config Tictoc5 ] network = Tictoc5 **.limit. dẫn TicToc cho Omnet+ + ng dn ngng dn v Omnet+ + giúp bn do qua mt ví d cho vic mô hình hóa và mô phng, cho bn thy mt s ng dùng vi các tin ích Omnet+ + nonnegative values Tictoc7 .tic.delayTime = exponential(3s) Tictoc7 .toc.delayTime = truncnormal(3s,1s) [Config Tictoc8 ] network = Tictoc8 [Config Tictoc9 ] network = Tictoc9 [Config Tictoc1 0]