Tài liệu hướng dẫn thực hành Tictoc trên omnetpp
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 hson7246@gmail.com Nguyễn Đình Quang Quangnd.na@gmail.com Phan Lê Hải plh.hut4ever@gmail.com Lê Minh Ngọc Lưu Văn Huy 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(). 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 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: 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) { 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 ================================================================================= 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"); 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: 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: 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 13 Omnetpp tutorial 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... (hardcoded) nhỏ if (uniform(0,1) < 0.1) { EV dup(); send(copy, "out"); } Sources: tictoc9 .ned, txc9.cc, omnetpp. ini... đ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... 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 . Sources: tictoc2 .ned, txc2.cc, omnetpp. ini ================================================================================= Omnetpp tutorial Nhóm. "out"); 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