شبیه سازی TicToc در نرم افزار شبیه ساز OMNET
در این بخش به بررسی شبیه سازی TicToc در نرم افزار شبیه ساز OMNET می پردازیم که یکی از مثال های ابتدایی در این نرم افزار می باشد. در ادامه با ما همراه باشید تا قدم به قدم مرحله مراحل را انجام و به اجرای نهایی برسم.
مثال TicToc در OMNET
با توجه به اینکه بخش بسیار مهمی از نرم افزار OMNET++ شبیه سازی ارتباطات در شبکه است، در اینجا به نحوه شبیه سازی یک شبکه می پردازیم. برای شروع از شبکه ای شروع می کنیم که دارای دو گره است. کاری که این دو گره انجام می دهند بسیار ساده است. یک گره packet ساخته و آن را به گره دیگر پاس می دهد و گره دیگر نیز آن را دریافت کرده و دوباره به گره اول بازپ می فرستد و همین طور این کار را تا بی نهایت انجام می دهند.نام این دو گره را tic و toc می گذاریم.
شروع کار شبیه سازی
در اینجا مراحل پیاده سازی این شبیه سازی را از ابتدا توضیح می دهم:
1- یک پوشه به نام tictoc بسازید و با وارد کردن دستور cd در mingwenv.cmd وارد این پوشه شوید.
2- با ساختن یک فایل NED توپولوژی شبکه ی خود را تعریف کنید.فایل توپولوژی یک فایل متنی ساده است که گره های شبکه و ارتباط میان آنها را مشخص می کند.این فایل را می توانید با هر ویرایشگر متنی مانند notepad بسازید. ما در اینجا اسم این فایل را tictoc1.ned میگذاریم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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; } |
بهتر است این فایل را از پایین به بالا بخوانید:
Tictoc1 شبکه ای است که از دو زیر ماژول به نام tic و toc ساخته شده است. Tic و toc هر دو نمونه هایی از یک ماژول یکسان به نام Txc1 هستند. ما گیت خروجی tic را که out نام دارد به گیت ورودی toc به نام in متصل می کنیم و به صورت برعک نیز همین کار را انجام دادیم.تاخیر انتشار در هر میسر را نیز 100 میلی ثانیه در نظر گرفتیم. Txc1 یک ماژول ساده است و یک گیت خروجی به نام out و یک گیت ورودی به نام in دارد.
3- حال باید نحوه عملکرد (functionality) ماژول ساده Txc1 را پیاده سازی کنیم. این کار را با نوشتن فایل Txc1 با زبان سی پلاس پلاس انجام می دهیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #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"); } |
ماژول ساده Txc1 با کلاس Txc1 به زبان C++ ارائه شده که زیر کلاسی از cSimpleModule است و از آن ارث بری می کند و با ماکرو Define_Module در آمنت ثبت شده است. ما دو متد از cSimpleModule به نام های initialize و handleMessage را دوباره تعریف کرده ایم.آنها توسط هسته شبیه سازی فراخوانی می شوند: اولی تنها یک مرتبه و دومی هر زمان که پیامی به ماژول برسد.
در initialize شی از نوع cMessage ساختیم و آنرا از طریق گیت out ارسال کردیم. با توجه به اینکه این گیت به گیت ورودی ماژول دیگری متصل است، هسته شبیه ساز پیام را به ماژول دیگر متصل به سمت دیگر گیت از طریق آرگمانی در handleMessage بعد از گذشت 100 میلی ثانیه تاخیر که در فایل NED تعیین شده بود، می رساند.و ماژول دیگر تنها آن را دوباره با 100 ثانیه تاخیر باز پ می فرستد.
پیام ها (پکت ها، فریم ها، job و …) و رویداد ها (timers, timeout) به وسیله شئ ای از cMessage و یا یکی از زیرکلاس های آن در آمنت نمایش داده می شوند.بعد از ارسال و یا زمانبندی آنها، توسط هسته شبیه سازی در لیست “scheduled events” و یا “future events” قرار می گیرند تا زمانی که زمان شان به پایان برسد و سپ از طریق handleMessage به ماژول مقصد تحویل داده می شوند.
4- حال Makefile را با کمک دستور زیر می سازیم که به ما کمک می کند تا برنامه خود را compile و link کرده و فایل اجرایی tictoc را بسازیم:
1 | $ opp_makemake |
5- با دستور زیر اولین شبیه سازی خود را کامپایل و لینک می کنیم و فایل اجرایی را می سازیم:
1 | $ make |
6- اگر همین الان فایل اجرایی را اجرا کنید،پ یغام می دهد که نمی تواند فایل omnetpp.ini را پیدا کند. در شبیه سازی همزمان می توان چندین شبکه تعریف کرد و این فایل به برنامه شبیه ساز می گوید که شما کدام شبکه را می خواهید شبیه سازی کنید. پس باید فایل به نام omnetpp.ini بسازید و در آن دستور زیر را بنویسید:
1 2 | [General] Network = Tictoc1 |
اما در مثال های بعدی برای راحتی کار،ما از فایل omnetpp.ini زیر استفاده می کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | [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 [Config Tictoc14] network = Tictoc14 [Config Tictoc15] network = Tictoc15 record-eventlog = true |
7- بعد از انجام تمام مراحل گفته شده حال می توانید با نوشتن دستور tictoc برنامه را اجرا کنید و پنجره شبیه ساز OMNET++ را ببینید:
8- دکمه Run در toolbar شبیه سازی را بزنید تا تبادل پیام شروع شود. Toolbar پنجره ی اصلی برنامه زمان شبیه سازی را نمایش می دهد. این زمان مجازی است و هیچ ربطی به زمان واقعی یا زمان ساعت دیواری (wall-clock) ندارد. توجه کنید که در اینجا برای پردازش پیام در نود هیچ زمان شبیه سازی ای را اختصاص نداده ایم. تنها زمان شبیه سازی سپری شده در اینجا مربوط به تاخیر انتقال پیام در اتصالات نودها بود.
9- می توانید سرعت انیمیشن را از طریق دکمه slider موجود در بالای پنجره کم یا زیاد کنید.
عالی بود