omnetpp tutorial

17
Hc vin Công nghBưu chính Viễn thông Bmôn Mng Vin Thông OMNET++ Tutorial Nhóm NCKH Wireless Sensor Network GVHD: Nguyn ThThu Hng SVTH: Nguyễn Hoàng Sơn [email protected] Nguyễn Đình Quang [email protected] Phan Lê Hi [email protected] Lê Minh Ngc Lưu Văn Huy

Upload: vu-van-trang

Post on 04-Aug-2015

376 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Omnetpp Tutorial

Học viện Công nghệ Bưu chính Viễn thông

Bộ môn Mạng Viễn Thông

OMNET++ Tutorial

Nhóm NCKH Wireless Sensor Network

GVHD: Nguyễn Thị Thu Hằng

SVTH:

Nguyễn Hoàng Sơn [email protected]

Nguyễn Đình Quang [email protected]

Phan Lê Hải [email protected]

Lê Minh Ngọc

Lưu Văn Huy

Page 2: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 2

CAC MO HINH TICTOC DON GIAN

Step 1: Getting started Txc1 – Getting started File Topo: *.ned

tic và toc: thuộc cùng một kiểu module gọi là Txc1. Txc1 là một loại module đơn giản (nó là thành phần ở mức nguyên tố

trong NED, và được coding bằng C++).

txc1.cc:

#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.

// Khởi tạo: Để bắt đầu quá trình tic-toc-tic-toc,

// một trong các mô-đun cần gửi message đầu tiên. GS là 'tic'.

// Tôi là tic hay toc?

if (strcmp("tic", getName()) == 0)

{

// Tạo và gửi message đầu tiên trên cổng "out".

// "tictocMsg" là một chuỗi tùy ý và đó sẽ là tên của đối tượng message.

cMessage *msg = new cMessage("tictocMsg");

send(msg, "out");

}

}

void Txc1::handleMessage(cMessage *msg)

{

// Quy trình handleMessage() được gọi ra bất cứ khi nào một message đến module.

// Ở đây, chúng tôi chỉ cần gửi ra đến các module khác, thông qua cổng ’out’.

// Vì cả ‘tic’ và ‘toc’ đều không gửi ra đồng thời,

// nên message sẽ gửi qua gửi lại giữa hai thực thể.

send(msg, "out");

}

Simple module Txc1 được đại diện bởi class Txc1 trong C++, được phân lớp từ cSimpleModule, và đăng ký

trong OMNeT++ với macro Define_Module().

Page 3: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 3

Ta định nghĩa lại 2 methods từ cSimpleModule:

initialize() gọi ra khi khởi tạo ra bản tin

handleMessage() được gọi khi bản tin đến module.

initialize() tạo một đối tượng bản tin (cMessage), và gửi nó đi ra cổng out. Cổng này được kết nối với cổng

input của các module khác, sau 100ms delay do truyền bản tin (tham số của link trong file NED), nhân mô

phỏng sẽ chuyển bản tin này đến các module khác bằng đối số tới hàm handleMessage (). Các module khác

chỉ cần gửi nó trở lại (delay 100ms nữa), ping-pong!

Messages (packets, frames, jobs, etc) và các events (timers, timeouts) tất cả được đại diện bởi các đối tượng

cMessage (hoặc các lớp con của nó) trong OMNeT + +.

Sau khi bạn gửi hoặc schedule các bản tin, chúng sẽ được tổ chức bởi nhân mô phỏng trong danh sách

"scheduled events" hay "future events" cho đến thời điểm thi hành bản tin và chúng được giao cho các module

thông qua handleMessage ().

Tạo file cấu hình omnetpp.ini

Run: gặp lỗi chưa liên kết với file Txc1.cc Sửa bằng chuột phải vảo Project > Clean Project

Page 4: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 4

Sources: tictoc1.ned, txc1.cc, omnetpp.ini

=================================================================================

Step 2: Refining the graphics, and adding debugging output Tang cuong mo hinh Tic-Toc 2 node

// "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"); // chọn kiểu icon mặc định

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"); // không thay đổi hình dạng icon (đối số đầu tiên

// của i=) mà chỉ dịnh màu cho nó

}

toc: Txc2 {

parameters:

@display("i=,gold"); // here too

}

connections:

Page 5: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 5

Ta cũng có thể thay đổi file C++ để thêm các debug messages vào Txc1 bằng cách viết OMNeT++ object EV như sau:

EV << "Sending initial message\n";

hay

EV << "Received message `" << msg->getName() << "', sending it out again\n";

#include <string.h>

#include <omnetpp.h>

class Txc2 : public cSimpleModule

{

protected:

virtual void initialize();

virtual void handleMessage(cMessage *msg);

};

Define_Module(Txc2);

void Txc2::initialize()

{

if (strcmp("tic", getName()) == 0)

{

// ’ev’ object hoạt động như hàm 'cout' trong C++.

EV << "Sending initial message\n";

cMessage *msg = new cMessage("tictocMsg");

send(msg, "out");

}

}

void Txc2::handleMessage(cMessage *msg)

{

Page 6: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 6

// msg->getName() là tên của msg object, ở trường hợp này là "tictocMsg".

EV << "Received message '" << msg->getName() << "', sending it out again\n";

send(msg, "out");

}

Sources: tictoc2.ned, txc2.cc, omnetpp.ini

=================================================================================

Page 7: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 7

Step 3: Adding state variables chuc nang huy ban tin

Mục đích: thêm 1 bộ đếm (như một class member) vào module, xóa bản tin sau 10 lần trao đổi.

Ta thêm biến 10 vào hàm initialize() và giảm dần trong hàm handleMessage() khi các bản tin tới module. Sau khi giảm tới 0,

simulation sẽ kết thúc events và hủy nó.

#include <stdio.h>

#include <string.h>

#include <omnetpp.h>

class Txc3 : public cSimpleModule

{

private:

int counter; // Note the counter here

protected:

virtual void initialize();

virtual void handleMessage(cMessage *msg);

};

Define_Module(Txc3);

void Txc3::initialize()

{

counter = 10;

WATCH(counter); // WATCH()cho phép quan sát giá trị của counter trong Tkenv.

//(Double-click on tic's icon > Contents).

if (strcmp("tic", getName()) == 0)

{

EV << "Sending initial message\n";

cMessage *msg = new cMessage("tictocMsg");

send(msg, "out");

}

}

void Txc3::handleMessage(cMessage *msg)

{

// Increment counter and check value.

counter--;

if (counter==0)

{

// If counter is zero, delete message. If you run the model, you'll

// find that the simulation will stop at this point with the message

// "no more events".

EV << getName() << "'s counter reached zero, deleting message\n";

delete msg;

}

else

{

EV << getName() << "'s counter is " << counter << ", sending back message\n";

send(msg, "out");

Page 8: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 8

}

}

Sources: tictoc3.ned, txc3.cc, omnetpp.ini

=================================================================================

Step 4: Adding parameters dem bien ra ngoai de config dc o omnetpp.ini, ko can strcmp

Mục đích: thêm tham số vào trình mô phỏng:

+ Chuyển "magic number" 10 vào tham số nào đó

+ Thêm 1 tham số kiểu boolean để quyết định xem khi nào các module nên gửi message đầu tiên trong mã khởi tạo của nó

(dù đây là module tic hay toc).

Tham biến của module phải được khai báo trong file NED. Kiểu dl có thể là numeric, string, bool, hay xml.

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:

…………………

Ta thay đổi code C++ trong Txc1.ned để nó đọc tham số trong initialize() và gán nó vào counter.

counter = par("limit");

Ta dùng tham số còn lại để quyết định xem khi nào các module nào được phép gửi message đầu tiên:

Page 9: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 9

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

Mô tả của Txc4 trong Txc4.cc như sau

Define_Module(Txc4);

void Txc4::initialize()

{

// counter được gán tham số module "limit",

// được khai báo trong file NED (tictoc4.ned).

counter = par("limit");

// chúng ta không cần dựa vào tên của module để quyết định

// khi nào cho phép nó gửi bản đầu tiên ra nữa

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

{

EV << "Sending initial message\n";

cMessage *msg = new cMessage("tictocMsg");

send(msg, "out");

}

}

Bây giờ ta có 2 cách để sử dụng các tham số, đó là gán chúng vào trong file NED hoặc từ omnetpp.ini. Ưu tiên cách gán trục tiếp

vào file NED. Có thể đặt giá trị mặc định cho các tham số bằng cách dùng cú pháp default(...)trong file NED. Và đây là cách gán các

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à trong omnetpp.ini:

Page 10: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 10

Tictoc4.toc.limit = 5

Sử dụng wildcards thay thế:

Tictoc4.t*c.limit=5

or

Tictoc4.*.limit=5

or even

**.limit=5

Trong Tkenv, có thể kiểm tra các thông số module hoặc trong object tree ở phía bên tay trái của cửa sổ chính, hoặc trong trang

Parameters của module inspector (mở bằng cách nhấn đôi vào biểu tượng module).

Sources: tictoc4.ned, txc4.cc, omnetpp.ini

=================================================================================

Page 11: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 11

Step 5: Using inheritance

khai bao tic va toc theo 2 kieu mo rong cua simple module txc5

Nếu ta quan sát kỹ các file NED ta sẽ nhận ra rằng tic và toc và chỉ khác ở giá trị tham số và tên hiển thị của chúng . Chúng ta có

thể tạo ra một loại module đơn giản bằng cách thừa kế từ một module khác và chỉ rõ hoặc thay thế các thông số của nó.

Đây là module cơ bản:

simple Txc5

{

parameters:

bool sendMsgOnInit = default(false);

int limit = default(2);

@display("i=block/routing");

gates:

input in;

output out;

}

Và đây là module tic được dẫn xuất từ Txc5. Chúng ta chỉ đơn giản là xác định giá trị tham số và thêm một số 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 tương tự nhưng với vài tham số khác.

simple Toc5 extends Txc5

{

parameters:

@display("i=,gold");

sendMsgOnInit = false; // Toc modules should NOT send a message on init

}

Note: Code C++ trong file Txc5 giữ nguyên như trong base simple module (Txc4).

Khi tạo ra simple modules mới, ta phải sử dụng chúng như kiểu submodule trong network:

network Tictoc5

{

submodules:

tic: Tic5; // Tham số limit vẫn chưa được liên kết ở đây.

// Ta sẽ gán giá trị cho nó trong file ini

toc: Toc5;

connections:

Như bạn thấy, phần định nghĩa mạng bây giờ ngắn và đơn giản hơn nhiều. Cách thừa kế cho phép bạn sử dụng một kiểu nào đó phổ

biến trong network và tránh sự định nghĩa cũng như thiết lập thông số dư thừa

Page 12: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 12

=================================================================================

Page 13: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 13

Step 6: Modeling processing delay

khi nhan ban tin thi giu lai – tuong duong voi viec gui ban tin cho chinh minh

Trong các mô hình trước, tic và toc ngay lập tức gửi trả lại bản tin nhận được. Ở đây chúng ta sẽ thêm vào thời gian trễ: tic và toc sẽ

giữ bản tin trong 1s trước khi gửi nó trở lại. Trong OMNeT + + thời gian trễ như vậy đạt được bằng cách cho các module gửi bản tin

đến chính nó. Những bản tin này được gọi là self-messages (theo cách chúng được sử dụng, còn không chúng vẫn là là đối tượng

bản tin thông thường).

Ta thêm hai biến cMessage *, event và tictocMsg vào class, để phân biệt bản tin chúng ta sử dụng để làm trễ thời gian và bản tin bị trễ

do được xử lý trong mô phỏ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:

Ta "gửi" self-messages với hàm scheduleAt(),được quy định cụ thể khi nó gửi trở lại module.

scheduleAt(simTime()+1.0, event);

Trong handleMessage() now we have to differentiate whether a new message has arrived via the input gate or the self-message

came back (timer expired). Here we are using

giờ chúng ta phải phân biệt xem một tin nhắn mới đã đến thông qua input gate hay là self-message trở lại (giờ đã hết hạn). Ta đang

sử dụng

if (msg==event)

Nhưng chúng ta cũng có thể viết như sau vẫn được

if (msg->isSelfMessage())

Ta bỏ lại lại counter, để giữ cho kích thước của mã nguồn nhỏ. Kết quả các mô phỏng:

Page 14: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 14

Sources: tictoc6.ned, txc6.cc, omnetpp.ini

=================================================================================

Step 7: Random numbers and parameters

delay la bien cua ham xac suat, hien tuong mat goi

Trong bước này, ta sẽ dùng đến các số ngẫu nhiên. Ta thay đổi delay từ 1 giây thành một giá trị ngẫu nhiên nào đó mà có thể được

thiết lập từ file NED hoặc từ omnetpp.ini. Thông số module có thể trả về các biến ngẫu nhiên, tuy nhiên, để sử dụng tính năng này

chúng ta phải đọc các tham số trong handleMessage()mỗi khi chúng ta sử dụng nó.

// Tham số module "delayTime" có thể được thiết lập giá trị như

// "exponential(5)" (tictoc7.ned, omnetpp.ini), và do đó ở đây

// chúng ta sẽ nhận được giá trị delay khác nhau mỗi lần.

simtime_t delay = par("delayTime");

EV << "Message arrived, starting to wait " << delay << " secs...\n";

tictocMsg = msg;

scheduleAt(simTime()+delay, event);

Ngoài ra, ta sẽ "lose" (delete) các gói tin với một xác suất (hardcoded) nhỏ.

if (uniform(0,1) < 0.1)

{

EV << "\"Losing\" message\n";

Page 15: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 15

delete msg;

}

Ta gán tham biến trong omnetpp.ini:

Tictoc7.tic.delayTime = exponential(3s)

Tictoc7.toc.delayTime = truncnormal(3s,1s)

Bạn có thể thử mà không cần quan tâm là chạy lại mô phỏng bao nhiêu lần (hoặc khởi động lại, Simulate|Rebuild network menu

item), bạn sẽ có được kết quả chính xác tương tự.

Điều này là do OMNeT++ sử dụng một thuật toán tất định (theo mặc định là Mersenne Twister RNG) để tạo ra các số ngẫu nhiên,

và khởi tạo nó với cùng khởi đầu. Điều này quan trọng cho việc mô phỏng lặp lại. Bạn có thể thử nghiệm với các điều kiện đầu khác

nhau nếu bạn thêm những dòng sau vào omnetpp.ini:

[General]

seed-0-mt=532569 # or any other 32-bit value

Từ cú pháp, ta có thể đoán rằng OMNeT++ hỗ trợ nhiều hơn một RNG. Điều đó là chính xác, tuy nhiên, tất cả các mô hình trong

hướng dẫn sử dụng RNG 0.

Exercise: Try other distributions as well.

Sources: tictoc8.ned, txc8.cc, omnetpp.ini

Step 8: Timeout, cancelling timers

stop-and-wait. Doi Timeout het han, sau do truyen lai va restarting timer

Để có được một bước gần hơn với các mẫu giao thức mạng, ta hãy chuyển đổi mô hình của mình vào mô phỏng stop-and-wait. Bây

giờ ta sẽ có các class riêng cho tic và toc. Kịch bản về cơ bản là giống như những phần trước: tic và toc sẽ truyền bản tin qua lại với

nhau. Tuy nhiên, toc sẽ " lose" bản tin với một xác suất khác không, và trong trường hợp này tic sẽ phải gửi lại nó.

Dưới đây là code củ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ờ có hàm bubble() gọi trong mã, toc sẽ hiển thị thông báo bất cứ khi nào nó mất bản tin.

Page 16: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 16

Vì vậy, tic sẽ khởi động bộ định thời bất cứ khi nào nó gửi ra bản tin. Khi bộ định thời hết hạn, ta sẽ cho rằng bản tin đã bị mất và sẽ

gửi lại bản tin khác. Nếu nhận được reply của toc, bộ định thời sẽ được hủy bỏ. Các bộ định thời sẽ là một self-message.

scheduleAt(simTime()+timeout, timeoutEvent);

Việc hủy bỏ bộ định thời được thực hiện bằng cách gọi hàm cancelEvent(). Lưu ý rằng điều này không ngăn cản chúng ta tái sử

dụng bản tin có cùng thời gian timeout lặp đi lặp lại.

cancelEvent(timeoutEvent);

You can read Tic's full source in txc8.cc.

Sources: tictoc8.ned, txc8.cc, omnetpp.ini

=================================================================================

Step 9: Retransmitting the same message

cac ban tin co ten khac nhau, khi mat goi se truyen lai ban sao cua ban tin

Trong bước này, ta thay đổi các mô hình trước. Hiện ta chỉ tạo ra gói tin khác khi cần phải truyền lại. Điều này là chấp nhận được vì

các gói tin không chứa nhiều thông tin, nhưng trong thực tế, thường là thiết thực hơn khi giữ một bản sao của gói ban đầu để có thể

truyền lại mà không cần phải tạo lại nó một lần nữa.

Những gì chúng ta làm ở đây là giữ lại gói dữ liệu gốc và chỉ gửi đi bản sao của nó. Chúng ta xóa gói tin gốc khi nhận được bản tin

acknowledgement từ toc. Để dễ dàng hơn khi kiểm tra trực quan mô hình, ta sẽ đưa sequence number vào tên bản tin.

Để tránh handleMessage() phát triển quá lớn, chúng ta sẽ đưa code tương ứng vào hai chức năng mới, generateNewMessage() và

sendCopyOf() và gọi chúng từ handleMessage().

The functions:

Page 17: Omnetpp Tutorial

Omnetpp tutorial

Nhóm NCKH- Bộ môn mạng – Học viện CN Bưu Chính Viễn Thông – PTIT 2011 Page 17

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");

}

Sources: tictoc9.ned, txc9.cc, omnetpp.ini

=================================================================================

Đây chỉ là tài liệu nhóm NCKH tự soạn thảo trong quá trình làm việc. Mong các bạn đi sau sẽ có nhiều đóng góp để tài

liệu hoàn thiện hơn.

Cảm ơn các bạn đã quan tâm!