Tải bản đầy đủ (.pdf) (26 trang)

hướng dẫn chi tiết TicToc cho omnet++

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (871.05 KB, 26 trang )



Hướng dẫn TicToc cho Omnet++
ng dn ng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 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
c samples/tictoc 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ng dn
hu bn thc s thc hành ít nhu tiên mô t  
Chú ý:
Chúng tôi gi s  ng bt b cài làm vic Omnet++. Chúng tôi
 s rng bn có mt kin thc tt v C++, và b
thuc vi vic phát trin C/C++ (chnh sa file ngun, dch, bt l
u hành ca bn. (u va ri là ngoài phm vi ca chúng tôi  - có
nhiu cung dn tu bn cn cp nht kin thc
 ngh s dng phát trin tích hp Omnet++ cho
vic chnh sa và xây dng các mô phng ca bn.
 làm các ví d d t c các code ngun s c nêu  
mà ch c nêu tên, bn s t tìm  c samples/tictoc.
Tài liu này và mô hình TicToc là mt phiên bc m rng bng dn
TicToc gc t Ahmet Sekercioglu (i hc Monash).
Ni 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 dng ph bin nht ca Omnet++ là mô phng các mng truyn
thông, chúng ta s làm vi ch  này t vi bu, chúng ta bu
vi mt mng bao gm 2 node. Các node s làm vài vin: mt trong
các node s to mt packet, và 2 node s gi vic qua li cùng gói tin vào và ra.
Chúng ta g
 c bn thc hin mô phu tiên ca bn t u:
1.To mc làm vic gi là tictoc và cd (lnh cd ca dos) c
này
2.Mô t mng ví d ca bn bng vic to mt file topology. Mt file topology
là mnode ca mng và các liên kt gia chúng.
Bn có th to nó vi trình chnh sa bt 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 tt nht là t i lên.  n nói:
-TicToc1 là mt mc tp hp t hai module con, tic và toc. Tic và toc là
các th hin ca cùng 1 kiu module gi là Txc1. Chúng ta kt ni cng ra ca
n cng vào cc l tr 100ms
vi c ng.
-Txc1 là mt kic nguyên t trong
ngôn ng Ned, và s t trong C++). Txc1 có 1 cng vào tên là in, và
mt cng ra tên là out.
3.Chúng ta ct chn Txc1. Vi
tr bi mt 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");
}
Kic mô t bi lp C++ : Txc1, cái này là mt lp
con t l       Omnet++ vi macro
c t cSimpleModule:
c triu gi t nhân mô phng: cái
u tiên ch duy nht 1 ln, còn cái th hai thì khi mn ti mt
module.
Trong initialize() chúng ta to mp (cMessage), và gi nó
ra ngoài qua cng out. Vì cc kt nn cng ra ca module khác,
nhân mô phng s      n module khác trong
handleMessage()sau truyn thông tr  liên kt trong file Ned.

Module khác gi nó quay li (v tr 100ms), nên nó s có h qu u
ng ping-pong liên tc.
       kin (các b nh thi,
c môt t tt c bng cMessage( hoc các lp con ca nó)
trong Omnet++. Sau khi bn gi hoc lên lch cho chúng, chúng s c t
chc bi nhân mô ph kit l kin


n khi thi gian cc phân phn các
module thông qua handleMessage().
Chú ý rng  u kin dng cho mô phng này: nó s tip tn
mãi mãi. Bn có th dng nó t giao dii dùng. (Bn có th nh
thi gian gii hn cho mô phng hoc gii hn thi gian cho CPU trong file cu
 ng dn này).
4. Chúng ta bây gi to Makefile cái này s giúp chúng ta dch và liên kt
      to file tictoc có kh  y:
$ opp_makemake
Lnh này s phi to ra mt makefc làm vic tictoc:
5.Gi ta dch và liên kt mô phu tiên ca chúng ta bng vic dùng lnh
make:
$ make
6.Nu bn bu chy bây gi, nó s gii thích nó không th tìm thy file
omnetpp.ini, nên bn phi to my. omnetpp.ini nói v
trình mô phng cái mng bn mun mô phng (vâng, 1 vài mng có th sng
ng), bn có th  cho mô
nh chính xác các seed cho vic sinh s ng
To mt file omnetpp.ini r
[General]
Network=Tictoc1
Tictoc2 và cho tt 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, bn chy mô phng bng lnh này:
$ ./tictoc
Và hi vng bc ca s mô phng Omnet++


8.n nút Run trên thanh công c  khng mô phng. Bn s thy cais cách

p vi nhau.

Công c ca s chính hin th thi gian mô phng. Thi gian này là thi gian o,
không có gì n thi gian thng h ng) v
y. Thc s, s giây bn có th chy trong th gii thc ph thuc
cao vào t ca phn cng ca bn và thng
 phc tp ca chính mô hình mô phng.
Chú ý rng thi gian mô phng cho m x lí tin nhn là bng 0. Ch
nhng th i gian mô phng qua l tr
trong các kt ni.
9.Bn có th làm chnh hoi thanh cun 
trên nh ca s  ha. Bn có th dng môt hình bng  n
nút stop trên toolbar), chy tc (f4), chay nó vi f5 hoc thoát khi hình
nh (f6).
10.Bn có th thoát kh    ng bng vic click vào biu
ng close hoc la chn 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. Vic bng vic thêm chui hin th n file
NED. Th i= trong chui hin 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:

Bn s thy kt qu 




nh s p g li cho Txc1 bng
vic chuy        
\

EV<<-\
Khi bn chy mô phng trong giao din Tkenv c
xut hin trên ca s n:

Bn có th m mt dãy các ca s u ra cho tic và toc bng vic n chut phi
trên bing và la chn module output t menu. Tin ích này s hu ích


khi bn có mt môt hình và bn ch p ghi li ca 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 mt 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 thit lp bin giá tr là 10 trong initialize() và gim trong
           m v 0, mô
phng s ht s kin và hy.
Chú ý dòng:

WATCH(counter);
Dòn trong mà ngun: vic này làm có th nhìn thy giá tr b m trong Tkenv.
t vào bing ca chn ni dung trang Content t
ca s theo dõi:



Khi bn tip tc chy mô phng, bn có th thy b m gim dn tn khi
n 0.
Bước 4: thêm các tham số module
Sources: tictoc4.ned, txc4.cc, omnetpp.ini
c này bn s h nhp thêm các tham s n mô phng:
chúi bin trng thái thành mt tham s và thêm mt tham s boolean
 quynh module s gu ra ngoài na hay không.
Các tham s module phc khai báo trong file Ned. Kiu d liu có th là
s, chui, bool, ho
simple Txc4
{
parameters:
bool sendMsgOnInit = default(false); // whether the module should
send out a message on initialization
int limit = default(2); // another parameter with a default
value
@display("i=block/routing");
gates:
i chnh l c tham s trong initialize() và gán
nó vào bin b m.

Chúng ta có th s dng tham s th  quynh xem có gp
u hay không:



if (par("sendMsgOnInit").boolValue() == true)

Gi chúng ta gán giá tr cho các tham s trong file Ned hoc t omnetpp.ini.
Vic gán giá tr n có th  mc
nh cho các tham s nu bn s d
ng hp này bn có th hoc thit lp giá tr ca các tham s trong
omnetpp.ini hoc s dng giá tr mp bi file NED.
 t tham s trong file NED:
network Tictoc4
{
submodules:
tic: Txc4 {
parameters:
sendMsgOnInit = true;
@display("i=,cyan");
}
toc: Txc4 {
parameters:
sendMsgOnInit = false;
@display("i=,gold");
}
connections:
và tham s còn li trong omnetpp.ini
Tictoc4.toc.limit = 5
Chú ý rng vì omnetpp.ini h tr nhiu loi kí t i din, và các tham s 
gán t các file NED có s i trên file omnetpp.ini, chúng ta có th
s d
Tictoc4.t*c.limit=5

Hoc:
Tictoc4.*.limit=5
Hoc thm chí:
**.limit=5
Cho cùng kt qu (s khác nhau gia * và ** là * s không biu th du chm
còn ** thì có).


Trong Tkenv, bn có th theo dõi các tham s module hoc trong cây object 
bên tay trái ca màn hình chính hoc trong trang các tham s ca module theo
c m thông qua ving module).
Bước 5: sử dụng thừa kế
N nhn thy rng tic và toc ch khác gia giá tr các
tham s và chui hin th ca chúng. Chúng ta có th to ra mt kiu module
mi bng vic kt tha t mnh hot vài
các tham s cng hp ca chúng ta, ta s ly hai kiu module
n (tic và toc). G s dng các ki
kiu module con trong mng.
Vic ly t mn ti khá d:
simple Txc5
{
parameters:
bool sendMsgOnInit = default(false);
int limit = default(2);
@display("i=block/routing");
gates:
input in;
output out;
}
nh các giá tr tham s và thêm vài

thuc tính hin th
simple Tic5 extends Txc5
{
parameters:
@display("i=,cyan");
sendMsgOnInit = true; // Tic modules should send a message on
init
}
Module Toc ging v giá tr tham s:
simple Toc5 extends Txc5
{
parameters:
@display("i=,gold");
sendMsgOnInit = false; // Toc modules should NOT send a message
on init
}


c k tha t .
Ch khi n mi, ta có th s dt kiu
module con trong mng ca 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:
n có th thng gi ng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

a và thit lp tham s.
Bước 6: việc mô hình xử lí trễ
Sources: tictoc6.ned, txc6.cc, omnetpp.ini
c, tic và toc gi tr lp nhc ngay
lp tc.   thêm ít thi gian: tic và toc gip vi 1 giây mô
ph c khi gi nó tr li. Th     c bi vic
module gc gi là self-
message.
Ta thêm hai bin l nh các thông
p ta s dng thp x lí tr ng.
class Txc6 : public cSimpleModule
{
private:
cMessage *event; // pointer to the event object which we'll use for
timing
cMessage *tictocMsg; // variable to remember the message until we
send it back

public:
Chúng ta gi self-message vi hàm scheduleAt(), ch c phân phi
c li ti module:
scheduleAt(simTime()+1.0, event);


Trong handleMessage() chúng ta phi so sánh mp mn thông
qua cng vào có là self-message quay li hay không.  ùng:
if (msg==event)
 vit:
if (msg->isSelfMessage())
c.

Chúng tôi b  gi cho mã ngun nh.
Kt qu ca vic chy mô phng có th 

Bước 7: các số và tham số ngẫu nhiên
Sources: tictoc8.ned, txc7.cc, omnetpp.ini
c này chúng tôi s gii thiu các s ng
tr t n mt giá tr ngu nhiên, vic này có th lp t file Ned hoc t
omnetpp.ini. Các tham s module có th tr li các bin ngu nhiên. Tuy nhiên,
 c các tham s trong handleMessage() mi khi
ta s dng nó.



// The "delayTime" module parameter can be set to values like
// "exponential(5)" (tictoc7.ned, omnetpp.ini), and then here
// we'll get a different delay every time.
simtime_t delay = par("delayTime");

EV << "Message arrived, starting to wait " << delay << "
secs \n";
tictocMsg = msg;
scheduleAt(simTime()+delay, event);
Thêm na, ta s làm mp vi mt xác sut nh:
if (uniform(0,1) < 0.1)
{
EV << "\"Losing\" message\n";
delete msg;
}
Chúng ta gán các tham s 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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
nh (m 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
thc t. Bn có th th vi các seed khác nu bn thêm dòng sau vào
omnetpp.ini:
[General]
seed-0-mt=532569 # or any other 32-bit value

Bước 8: timeout và việc hủy bộ định thời
Sources: tictoc8.ned, txc8.cc, omnetpp.ini
 c mc gi vic mô hình hóa các giao thc mng, chúng
ta bii mô hình ca chúng ta sang mô phng d
các lp tic và toc. Kch bn là gic: tic và toc s tung các
p cho nhau. Tuy nhiên, toc s p vi mt xác sut khác
không, và trong trng h phi gi li nó.
a toc:


void Toc8::handleMessage(cMessage *msg)
{
if (uniform(0,1) < 0.1)
{
EV << "\"Losing\" message.\n";
bubble("message lost"); // making animation more informative
delete msg;
}
else
Nhìn vào li gi bubble() trong code, toc s hin th mt li gi khi nó mt

p:

Tic thì s khng mt b nh thi khi nó gi mt p. Khi thi gian
ht hn, chúng ta gi s rp b mt và gi li cho toc. Nu tr li
cn, thì b nh thi phi b hy. B nh thi s là mt self-message.
scheduleAt(simTime()+timeout, timeoutEvent);
Vic hy b nh thi s c hoàn thành vi li gi cancelEvent().
cancelEvent(timeoutEvent);

Bước 9: Gửi lại cùng thông điệp
Sources: tictoc9.ned, txc9.cc, omnetpp.ini
c này chúng ta chnh lo li gói tin khác
nu chúng ta cn gi li. Vic này n vì gói tin không cha nhi


ng thc hin gi mt bn copy ca gói tin g có th gi l
không cn phi xây dng nó li ln na.
Cái ta làm   gói tin gc và gi ch các bn copy ca nó. Ta xóa bn
gc  làm vic nó d  xác thc mô hình,
chúng ta s gp mp vi mt dãy s p.
 ng thành 2 hàm
mi, generateNewMessage() và sendCopyOf() và gi chúng t
handleMessage().
C th:
cMessage *Tic9::generateNewMessage()
{
// Generate a message with a different name every time.
char msgname[20];
sprintf(msgname, "tic-%d", ++seq);
cMessage *msg = new cMessage(msgname);

return msg;
}
void Tic9::sendCopyOf(cMessage *msg)
{
// Duplicate message and send the copy.
cMessage *copy = (cMessage *) msg->dup();
send(copy, "out");
}

III.Chuyển thành một mạng thực tế hơn
Bước 10: làm việc với nhiều hơn 2 nodes
Sources: tictoc10.ned, txc10.cc, omnetpp.ini
Bây chúng ta s làm m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  n: mt trong các
node sinh mp, p cho nhau theo các
ng ngnh t c.
File Ned s cn mu tiên cho tt c, module Txc s cn có nhiu
cng vào và ra:



simple Txc10
{
parameters:
@display("i=block/routing");
gates:
input in[]; // declare in[] and out[] to be vector gates
output out[];
}
Di các cng thành vecto cng. Kích c ca vecto (s các cng) s

 s d xây dng mng.
network Tictoc10
{
submodules:
tic[6]: Txc10;
connections:
tic[0].out++ > { delay = 100ms; } > tic[1].in++;
tic[0].in++ < { delay = 100ms; } < tic[1].out++;

tic[1].out++ > { delay = 100ms; } > tic[2].in++;
tic[1].in++ < { delay = 100ms; } < tic[2].out++;

tic[1].out++ > { delay = 100ms; } > tic[4].in++;
tic[1].in++ < { delay = 100ms; } < tic[4].out++;

tic[3].out++ > { delay = 100ms; } > tic[4].in++;
tic[3].in++ < { delay = 100ms; } < tic[4].out++;

tic[4].out++ > { delay = 100ms; } > tic[5].in++;
tic[4].in++ < { delay = 100ms; } < tic[5].out++;
}

 t vector module và kt ni chúng.
Kt qu hình trng mng gi



Trong phiên bn này, tic[0] s  gi loanh quanh. Vic này
c thc hin trong initialize(), v ca hàm getIndex() s tr li ch
s ca module trong vecto.

Phn chính ca code là hàm forwardMessage() cái chúng ta triu gi t
handleMessage() khi mp ti mt node. Nó to mt s cng ngu
c ca vecto cng) và gp ra ngoài trên cng.
void Txc10::forwardMessage(cMessage *msg)
{
// In this example, we just pick a random gate to send it on.
// We draw a random number between 0 and the size of gate `out[]'.
int n = gateSize("out");
int k = intuniform(0,n-1);

EV << "Forwarding message " << msg << " on port out[" << k << "]\n";
send(msg, "out", k);
}
n tic[3], handleMessage() ca nó s p.


C th  trong txc10.cc
Bước 11: Các kênh và định nghĩa kiểu inner
Sources: tictoc11.ned, txc11.cc, omnetpp.ini
ng mi ca chúng ta khá phc tc bit là phn kt
ni. Th n. Th u tiên ta nhn thy các kt nng s
dng cùng tham s tr delay. Có th to các kiu cho các kt nc
gi là các kênh-channel) 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t c các kt ni
trong mng.
network Tictoc11
{
types:
channel Channel extends ned.DelayChannel {
delay = 100ms;

}
submodules:

u mng m
mng bng vic thêm mt phn types. Phu này ch nhìn thy
c bên trong mc gi là mt kin có
th s du types nu bn thy cn.
o kênh bng vinh xây dng sn DelayChannel
(kênh xây sn có th c tìm th
dng tên ki ned.DelayChannel) sau t khóa extends.
Bây gi hãy kim tra phi th nào.
connections:
tic[0].out++ > Channel > tic[1].in++;
tic[0].in++ < Channel < tic[1].out++;

tic[1].out++ > Channel > tic[2].in++;
tic[1].in++ < Channel < tic[2].out++;

tic[1].out++ > Channel > tic[4].in++;
tic[1].in++ < Channel < tic[4].out++;

tic[3].out++ > Channel > tic[4].in++;


tic[3].in++ < Channel < tic[4].out++;

tic[4].out++ > Channel > tic[5].in++;
tic[4].in++ < Channel < tic[5].out++;
}


n th ra tên kênh trong pht ni. Vic
này cho phép d i tham s tr ca toàn mng.
Bước 12: Sử dụng kết nối hai chiều:
Sources: tictoc12.ned, txc12.cc, omnetpp.ini
Nu chúng ta km tra phn connections nhit chút, chúng ta s nhn
ra mi cc kt ni vi 2 kt ni. M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ng hai chiu (hay gi là inout) thay cho
dãy các c dng 
simple Txc12
{
parameters:
@display("i=block/routing");
gates:
inout gate[]; // declare two way connections
}
Phn connections mi s nhìn ging th này:
connections:
tic[0].gate++ < > Channel < > tic[1].gate++;
tic[1].gate++ < > Channel < > tic[2].gate++;
tic[1].gate++ < > Channel < > tic[4].gate++;
tic[3].gate++ < > Channel < > tic[4].gate++;
tic[4].gate++ < > Channel < > tic[5].gate++;
}

nh sa tên nên chúng ta phi chnh sa vi
code C++:




void Txc12::forwardMessage(cMessage *msg)
{
// In this example, we just pick a random gate to send it on.
// We draw a random number between 0 and the size of gate `gate[]'.
int n = gateSize("gate");
int k = intuniform(0,n-1);

EV << "Forwarding message " << msg << " on gate[" << k << "]\n";
// $o and $i 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: tictoc13.ned, tictoc13.msg, txc13.cc, omnetpp.ini
a ch  s không còn là c nh vi tic[3] na  chúng ta
to mu nhiên, và chúng ta s a ch p.
Cách tt nht là to lp con ca la ch  d
liu thành viên. Vic code th công các lng t nht bi vì nó
ng có nhiu code quy chun, nên chúng tôi cho omnet++ sinh các lp t
ng cho chúng ta. Lp mô t trong tictoc13.msg:
message TicTocMsg13
{
int source;
int destination;
int hopCount = 0;
}
Makefile thit lp cho vic biên dc triu gi

và nó sinh tictoc_m.h và tictoc13_m.cc t p. Chúng s cha
mt lp TicTocMsg13 sinh ra t lp cMessage. Lp s có cc set
và get cho mng.
Chúng tôi s gn code C++ ca chúng ta, và chúng ta có th
s dp khác.


#include "tictoc13_m.h"
Ví d, chúng ta s d to thông
p và thêm giá tr ng:
TicTocMsg13 *msg = new TicTocMsg13(msgname);
msg->setSource(src);
msg->setDestination(dest);
return msg;
u ging th này:
void Txc13::handleMessage(cMessage *msg)
{
TicTocMsg13 *ttmsg = check_and_cast<TicTocMsg13 *>(msg);

if (ttmsg->getDestination()==getIndex())
i gn handleMessage(), chúng ta nh
mt con tr lp cMessage. Tuy nhiên, chúng ta ch có th truy cng
c      u chúng ta ép kiu msg sang
TicTocMsg13 *.
n mt gi c gi là ép ki ng dynamic_cast.  
chúng ta s dc cung cp bi Omnet++: nó th ép
kiu con tr thông qua dynamic_cast, và nu nó tht bi nó dng mô phng
vi mt thông báo li, gi

Trong dòng tip theo, chúng ta kia ch a ch ca node

hay không. Hàm thành viên getIndex() tr v ch s ca module trong vecto
 tic: Txc13[6], nên các
node ca ch 0 5).
 to mô hình chn ta nó, node
 sinh mp khác vi ma ch u nhiên, và c th.
: txc13.cc


Khi bn chay mô hình nó s ging th này:

Bn có th b m ca s theo dõi chúng (bn có
th dng mô phng, hoc làm tht nhanh khi x lí vi chut). Ca s theo dõi
hin th   các thông tin h     p có th xem 
trang content:

×