1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Hướng dẫn TicToc cho Omnet

26 363 5

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 26
Dung lượng 0,98 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Đây là bài tập đơn giản giúp bạn làm quen với phần mềm Omnet trong việc mô phỏng kỹ thuật viễn thông. Trong tài liệu trình bày chi tiết về cách thức thực hiện như các viết code,cách mô phỏng...ho bạn thấy một số cách thông thường dùng với các tiện ích Omnet++.

Trang 1

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 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ề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 Chú ý:

Chúng tôi giả sử ở đây rằng bạn đã có một bộ cài làm việc Omnet++ Chúng tôi cũng giả sử rằng bạn có một kiến thực tốt về C++, và bạn nói chung là đã quen thuộc với việc phát triển C/C++ (chỉnh sửa file nguồn, dịch, bắt lỗi,…) trên hệ điều hành của bạn (hai điều vừa rồi là ngoài phạm vi của chúng tôi ở đây- có nhiều cuốn sách và hướng dẫn tốt trên web,… nếu bạn cần cập nhật kiến thức đó) Chúng tôi đề nghị sử dụng môi trườ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ễ dàng hơn, tất cả các code nguồn sẽ không được nêu ở đây

mà chỉ được nêu tên, bạn sẽ tự tìm ở thư mục samples/tictoc

Tài liệu này và mô hình TicToc là một phiên bản được mở rộng bởi hướng dẫn TicToc gốc từ Ahmet Sekercioglu (trường đạ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

Trang 2

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ệc đó Để bắt đầu, chúng ta bắt đầu với một mạng bao gồm 2 node Các node sẽ làm vài việc đơn giả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ọi các node là “tic” và “toc”

Ở đây là các bước bạn thực hiện mô phỏng đầu tiên của bạn từ đầu:

1.Tạo một thư mục làm việc gọi là tictoc và cd (lệnh cd của dos) đến thư mụ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ột file văn bản định nghĩa các 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 văn bản ưa thích của bạn Sau đó đặ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.

// Two instances (tic and toc) of Txc1 connected both ways.

// Tic and toc will pass messages to one another.

//

network Tictoc1

{

submodules:

Trang 3

tic: Txc1 ;

toc: Txc1 ;

connections:

tic.out > { delay = 100ms; } > toc.in;

tic.in < { delay = 100ms; } < toc.out;

}

File này đọc tốt nhất là từ dưới lên Ở đây là cái nó muốn nói:

-TicToc1 là một mạng, đượ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 tic (tên là out) đến cổng vào của toc (tên là in) và ngược lại Có độ trễ 100ms với cả hai đường

-Txc1 là một kiểu module đơn giản (cái này nghĩa là nó là mức nguyên tử trong ngôn ngữ Ned, và sẽ được cài đặ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ần cài đặt chức năgn của module đơn giản Txc1 Việc này được lưu 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.

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

Trang 4

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

// will bounce between the two.

send (msg, "out" );

}

Kiểu module đơn giản Txc1 được mô tả bởi lớp C++ : Txc1, cái này là một lớp con từ lớp cSimpleModule, và được đăng kí trong Omnet++ với macro Define_Module() Chúng ta định nghĩa lại hai phương thức từ cSimpleModule: initialize() và handleMessage() Chúng đượ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ột thông điệp đến tại một module

Trong initialize() chúng ta tạo một đối tượng thông điệp (cMessage), và gửi nó

ra ngoài qua cổng out Vì cổng này được kết nối đến cổng ra của module khác, nhân mô phỏng sẽ phân phát thông điệp này đến module khác trong handleMessage()—sau truyền thông trễ 100ms đã gán ở liên kết trong file Ned Module khác gửi nó quay lại (với độ trễ 100ms), nên nó sẽ có hệ quả như hiệu ứng ping-pong liên tục

Các thông điệp (packets,frames,jobs,…) và các sự kiện (các bộ định thời, timeout) được môt tả tất cả bởi đối tượ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ỏng trong danh sách “sự kiện đã đặt lịch” hoặc “sự kiện

Trang 5

tương lai” đến khi thời gian của chúng đến và chúng được phân phối đến các module thông qua handleMessage()

Chú ý rằng ở đó không có điều kiện dừng cho mô phỏng này: nó sẽ tiệp tục đến mãi mãi Bạn có thể dừng nó từ giao diện người dùng (Bạn có thể quy đị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 hình, nhưng chúng tôi không làm việc đó ở hướ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 chương trình của chúng ta để tạo file tictoc có khả năng chạy:

$ opp_makemake

Lệnh này sẽ phải tạo ra một makefile trong thư mục làm việc tictoc:

5.Giờ ta dịch và liên kết mô phỏng đầu tiên của chúng ta bằng việc dùng lệnh make:

$ make

6.Nếu bạn bắt đầ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ột file như vậy omnetpp.ini nói với chương 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 trong cùng chương trình mô phỏng), bạn có thể đưa ra các tham số cho mô hình, quy định chính xác các seed cho việc sinh số ngẫu nhiên,…

Tạo một file omnetpp.ini rất đơn giản như sau:

[General]

Network=Tictoc1

Tictoc2 và cho tất cả các bước sau ở file omnetpp.ini sau:

# This file is shared by all tictoc simulations

# Lines beginning with `#' are comments

Trang 7

8.Ấn nút Run trên thanh công cụ để khởi động mô phỏng Bạn sẽ thấy cais cách

mà tic và toc trao đổi thông điệ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ì liên quan đến thời gian thực (hay đồng hồ trên tường) với chương trình đang chạ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 độ của phần cứng của bạn và thậm chí hơn nữa là vào môi trường

và độ 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ột node để xử lí tin nhắn là bằng 0 Chỉ những thứ như là thời gian mô phỏng qua lại trong mô hình này là có độ trễ trong các kết nối

9.Bạn có thể làm chậm đi hình ảnh hoặc làm nó nhanh hơn vớ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 f8 (tương tự ấn nút stop trên toolbar), chạy từng bướ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ỏi chương trình mô phỏng bằng việc click vào biểu tượng close hoặc lựa chọn File|Exit

Trang 8

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

Ở đây chúng tôi tạo mô hình nhìn đẹp hơn trong GUI Chúng tôi gán biểu tượng “block/routing” (ở file images/block/routing.png) và tô nó màu tía cho tic và vàng cho toc Việc này có được bằng việc thêm chuỗi hiển thị đến file NED Thẻ i= trong chuỗi hiển thị quy định icon

// "block/routing" icon to the simple module All submodules of type

// Txc2 will use this icon by default

// Make the two module look a bit different with colorization effect.

// Use cyan for `tic', and yellow for `toc'.

@display( "i=,cyan" ); // do not change the icon (first arg

of i=) just colorize it

Trang 9

Chúng ta cũng chỉnh sửa file C++ để thêm vào thông điệp gỡ lỗi cho Txc1 bằng việc chuyển đến đối tượng EV cho Omnet++ như này: EV<<”Sending initial message\n”;

EV<<”Received message ‘ “<<msg->getName()<<” ‘, sending it out again \n”; Khi bạn chạy mô phỏng trong giao diện Tkenv của Omnet++, đầu ra như sau sẽ xuất hiện trên cửa sổ văn bả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ểu tượng và lựa chọn module output từ menu Tiện ích này sẽ hữu ích

Trang 10

khi bạn có một môt hình và bạn chỉ quan tâm thông điệp ghi lại của module cụ thể nào đó

Bước 3: thêm một biến trạng thái

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

Trong bước này chúng ta thêm một bộ đếm cho module và xóa thông điệp sau

10 phiên trao đổi

Chúng ta thêm bộ đếm như thành viên lớp:

class Txc3 : public cSimpleModule

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 Đúp chuột vào biểu tượng của tic, sau đó lựa chọn nội dung trang Content từ cửa sổ theo dõi:

Trang 11

Khi bạn tiếp tục chạy mô phỏng, bạn có thể thấy bộ đếm giảm dần đến tận khi

nó đến 0

Bước 4: thêm các tham số module

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

Trong bước này bạn sẽ học cách để nhập thêm các tham số đến mô phỏng: chúng ta đổi biến trạng thái thành một tham số và thêm một tham số boolean

để quyết định module sẽ gửi thông điệp lúc đầu ra ngoài nữa hay không

Các tham số module phải được khai báo trong file Ned Kiểu dữ liệu có thể là

số, chuỗi, bool, hoặc xml,…

Trang 12

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ị trong file Ned được ưu tiên Bạn có thể định nghĩa giá trị mặc định cho các tham số nếu bạn sử dụng cú pháp default(…) trong file Ned Trong trườ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ặc định đã cung cấp bởi file NED

Ở đây, chúng ta gán một tham số trong file NED:

Trang 13

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 dõi (được mở thông qua việc kích đúp trên biểu tượng module)

Bước 5: sử dụng thừa kế

Nếu ta nhìn kĩ file Ned ta sẽ 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ột module khác và quy định hoặc ghi đè một vài các tham số của nó Trong trường hợp của chúng ta, ta sẽ lấy hai kiểu module đơn giản (tic và toc) Gần hơn ta có thể sử dụng các kiểu này khi định nghĩa các kiểu module con trong mạng

Việc lấy từ một module đơn giản đã tồn tại khá dễ Đây là module cơ sở:

simple Txc5

{

parameters:

bool sendMsgOnInit = default( false );

int limit = default(2);

Module Toc giống vậy, nhưng khác nhau ở giá trị tham số:

simple Toc5 extends Txc5

Trang 14

Chú ý: cài đặt C++ được kế thừa từ module đơn giản cơ sở

Chỉ khi ta đã tạo module đơn giản mới, ta có thể sử dụng chúng như một kiểu module con trong mạng của chúng ta:

Bước 6: việc mô hình xử lí trễ

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

Trong các mô hình trước, tic và toc gửi trở lại các thông điệp nhận được ngay lập tức Ở đây, ta sẽ thêm ít thời gian: tic và toc giữa thông điệp với 1 giây mô phỏng trước khi gửi nó trở lại Thời 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à self-message

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

Trang 15

Trong handleMessage() chúng ta phải so sánh một thông điệp mới đến thông qua cổng vào có là self-message quay lại hay không Ở đây ta dùng:

if (msg==event)

nhưng ta cũng có thể viết:

if (msg->isSelfMessage())

cũng được

Chúng tôi bỏ đi biến counter, để giữ cho mã nguồn nhỏ

Kết quả của việc chạy mô phỏng có thể được xem dưới đây

Bước 7: các số và tham số ngẫu nhiên

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

Trong bước này chúng tôi sẽ giới thiệu các số ngẫu nhiên Chúng ta thay đổi độ trễ từ 1 giây đế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,

để dùng tính năng này, ta phải đọc các tham số trong handleMessage() mỗi khi

ta sử dụng nó

Trang 16

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

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 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ó được một bước gần hơn tới việc mô hình hóa các giao thức mạng, chúng

ta biến đổi mô hình của chúng ta sang mô phỏng dừng và đợi Coi như ta đã có các lớp tic và toc Kịch bản cơ bản là giống như lần trước: tic và toc sẽ tung các thông điệp cho nhau Tuy nhiên, toc sẽ môt thông điệp với một xác suất khác không, và trong trường hợp đó tic sẽ phải gửi lại nó

Đây là code của toc:

Trang 17

void Toc8::handleMessage ( cMessage *msg)

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

Trong bước này chúng ta chỉnh lại mô hình trước Đó là ta tạ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ều, nhưng ngoài

Trang 18

đời thường thực hiện giữ một bản copy của gói tin gốc để có thể gửi lại nó để không cần phải xây dựng nó lại lần nữa

Cái ta làm ở đây là giữ gói tin gốc và gửi chỉ các bản copy của nó Ta xóa bản gốc khi toc báo đã nhận Để làm việc nó dễ dàng hơn để xác thực mô hình, chúng ta sẽ gộp một thông điệp với một dãy số tên thông điệp

Để tránh handleMessage() phình to, chúng ta đặt code tương ứng thành 2 hàm mới, generateNewMessage() và sendCopyOf() và gọi chúng từ handleMessage()

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ộ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 sẽ cần có nhiều cổng vào và ra:

Ngày đăng: 19/10/2014, 08:40

TỪ KHÓA LIÊN QUAN