Chương trình tạo kịch bản mô phỏng – E-MIX Demo

Một phần của tài liệu NGHIÊN CỨU KỸ THUẬT CỘNG TÁC KHO DỮ LIỆU LƯU GIỮA CÁC CLIENTS TRONG HỆ THỐNG THÔNG TIN DI ĐỘNG DỰA TRÊN KIẾN TRÚC P2P (Trang 82 - 114)

4.4.1Giới thiệu

Như đã trình bày phần ở trên, kịch bản mô phỏng mạng được viết bằng ngôn ngữ kịch bản OTcl (OTcl là ngôn ngữ kịch bản tcl, mở rộng phần hướng đối tượng). Chương trình tạo kịch bản mô phỏng kết xuất ra tập tin chứa những dòng lệnh cấu hình cần thiết cho mô phỏng mạng.

Mô hình mạng P2P bao gồm các thiết bị di động có khả năng lưu trữ và tính toán trong môi trường di động, vì vậy NS-2 có định nghĩa các thành phần cơ bản của một thiết bị di động (mobile node), chi tiết xem chương 16 [16]

Chương trình tạo kịch bản mô phỏng – E-MIX Demo gồm các chức năng như sau:

Chương trình mô phỏng

Chương trình tạo kịch bảng mô phỏng

Giao diện chương trình

Network simulator 2 E-MIX K ịch bản (.tcl) OTcl K ết quả (.txt) Tạo kịch bản mô phỏng Phân tíc h

 Cấu hình tham số cơ bản cho một mobile node.

 Tự phát sinh các file script giả lập các trường hợp truy vấn dữ liệu dựa trên đồ hình vừa xây dựng.

 Tạo mô hình kiến trúc mạng P2P.

 Tạo các hiệu ứng minh họa quá trình cộng tác chia sẽ giữa các clients.

 Phân tích kết quả và vẽ biểu đồ dựa vào tập tin kết quả mô phỏng. Bảng 4-1

4.4.2Giao diện chính của E-MIX Demo

Chi tiết các giao diện chính của E-MIX Demo được liệt kê trong Bảng 4-1 và sơ đồ các màn hình được trình bày ở Hình 4-3.

STT Tên màn hình Ý nghĩa /Ghi chú

1 Form Main Màn hình chính

2 Tab Configuration node Cấu hình mobile node

3 Tab Model Tạo mô hình P2P

4 Tab Animation Tạo hiệu ứng

5 Tab Result Vẽ biểu đồ kết quả

Bảng 4-1 Chi tiết các giao diện chính của E-MIX Demo

4.4.2.1Màn hình “Main”  Giao diện Hình 4-4 Màn hình Main  Mô tả chức năng Kí hiệu Nút nhấn Giải thích 1 Tab Configuration node

 Cấu hình tham số cho mobile node  Xuất tập tin lưu vết

 Xác định vị trí của từng mobile node  Tốc độ di chuyển

 Tạo kích thước mô hình mạng  Chọn các tiêu chí mô phỏng.

2 Tab Model

 Tạo mô hình mạng P2P

 Cho phép kéo thả để xác định vị trí theo mong muốn

 Thêm dữ liệu cho từng mobile  Xác định dữ liệu yêu cầu

 Xem bán kính và các đường kết nối giữa các mobile

3 Tab Animation  Tạo các hoạt động nhận gửi các gói tin cho mobile node dựa vào kết quả mô phỏng.

4 Tab Result  Hiển thị kết quả mô phỏng bằng các dạng biểu đồ Bảng 4-2 Chức năng màn hình "Main" 4.4.2.2Màn hình “Configuration node”  Giao diện Hình 4-5 Màn hình "Configuration node"  Mô tả chức năng

Kí hiệu Chức năng Giải thích

1 Mobile node  Các tham số cấu hình cho mobile node.

2 Trace  Chọn tập tin lưu vết các sự kiện mô phỏng mạng

 Chọn ngẫu nhiên phát sinh vị trí

4 Movement

 Xác định vị trí đích mà mobile node di chuyển đến

 Xác định tốc độ di chyển (m/s)

5 Model

 Xác định giao thức

 Xác định kích thước mô hình mô phỏng(chiều rộng và chiều cao)

6 Criteria  Lựa chọn tiêu chí muốn mô phỏng

7 Export  Xuất ra tập tin mô phỏng (*.tcl) sau khi mô tả chi tiết các kịch bản mô phỏng.

8 Cancel  Thoát chương trình

Bảng 4-3 Chi tiết màn hình "Configuration node"

4.4.2.3Màn hình “Model”

 Giao diện

 Mô tả chức năng

Kí hiệu Nút nhấn Giải thích

1 Random Phát sinh ngẫu nhiên vị trí từng mobile node, kéo thả từng mobile node để xác định vị trí mong muốn.

2 View radio Xem bán kính phạm vi truyền sóng vô tuyến của từng mobile node

3 View link Xem các đường kết nối giữa các mobile node trong mô hình

Bảng 4-4 Chi tiết màn hình "Model"

4.4.2.4Màn hình “Animation”

 Giao diện

Hình 4-7 Màn hình Animation

 Mô tả chức năng

Kí hiệu Nút nhấn Giải thích

thiết bị mobile

2 Open Chọn tập tin kết quả mô phỏng(*.txt)

Bảng 4-5 Chi tiết màn hình "Animation"

4.4.2.5Màn hình “Result”

 Giao diện

Hình 4-8 Màn hình "Result"

 Mô tả chức năng

Kí hiệu Nút nhấn Giải thích

1 Criteria Chọn tiêu chí phân tích kết quả mô phỏng và vẽ biểu đồ.

2 Option Chọn vẽ biểu đồ hình cột hoặc đường gấp khúc.

3 Select Chọn tập tin kết quả mô phỏng (*.txt)

4.5 Thực thi kịch bản mô phỏng

Sau khi tạo kịch bản mô phỏng, chúng tôi dùng NS-2 đã tích hợp kiến trúc MIX để thực thi kịch bản. NS-2 chạy trên hệ điều hành Linux, tuy nhiên chúng tôi thực hiện trên hệ điều hành Window với sự hỗ trợ của bộ giả lập Cygwin [18]. Chúng tôi minh họa NS-2 thực thi một kịch bản thể hiện ở Hình 4-9

Hình 4-9 Ví dụ NS-2 thực thi một kịch bản

Kịch bản mô phỏng được viết bằng ngôn ngữ OTcl, ngôn ngữ này sẽ được giới thiệu ở phần phụ lục B cùng với quá trình download và cài đặt cygwin.

4.6 Kiến trúc E-MIX

Để hiện thực kiến trúc E-MIX đã trình bày chương 3, chúng tôi phải xây dựng một giao thức gọi là giao thức EMixAgent. Trong giao thức EMixAgent chúng tôi xây dựng cấu trúc dữ liệu và các thuật toán đã trình bày chương 3 như: kỹ thuật xử lý nhận và gửi gói tin, xếp lịch thời gian(timer), được tham khảo từ các tài liệu kỹ thuật [16]

4.6.1Giao thức “EMIXAgent”

Chi tiết các lớp trong giao thức EMixAgent được trình bày trong Hình 4-10 và chức năng các lớp được mô tả trong Bảng 4-7.

Hình 4-10 Sơ đồ liên kết các lớp trong giao thức EMixAgent

STT Lớp Mô tả

1 EMixAgent

Đóng vai trò là lớp giao tiếp gửi và nhận các gói tin dữ liệu, có nhiệm vụ liên kết các lớp con tạo thành một giao thức hiện thực kiến trúc E-MIX.

2 RRT Thực hiện nhiệm vụ lưu trữ thông tin của dữ liệu yêu cầu, chức năng được trình bày chương 3.

3 MyCache Đóng vai trò kho lưu trữ dữ liệu.

4 numNeighNeigh

Nhiệm vụ lưu trữ thông tin(profile) số nút vùng của từng mobile, phục vụ tìm đường định tuyến để giải quyết yêu cầu dữ liệu.

5 MyList Nhiệm vụ lưu trữ thông tin hàng xóm của một mobile node.

Bảng 4-7 Chức năng các lớp trong giao thức EMixAgent

4.6.2Kỹ thuật lưu trữ trong kiến trúc E-MIX

4.6.2.1Lớp RRT

 Cấu trúc dữ liệu

EMixAgent

RRT có chức năng lưu trữ thông tin của dữ liệu yêu cầu, vì thế chúng tôi dùng kỹ thuật bảng băm để lưu trữ thông tin bảng RRT . Cấu trúc dữ liệu như sau:

class objRRT { public: int _index; nsaddr_t _sender; int _item; int _time; };

typedef std::multimap<int, objRRT> mapRRT;

class RRT { public: mapRRT _mapRRT; int _size; int _index; int TTL;

void Refresh(receiveData, int);

void SaveData(receiveData, int);

nsaddr_t searchItem(int);

int isFull();

void print_RRT();

void init();

void setTTL(int);

int getTTL();

void deleteItem(int);

void deleteItem(int, nsaddr_t);

void sortBySender();

RRT* splitBySender(int &);

int* ConvertRRTToArray(int &); };

Bảng 4-8 Cấu trúc dữ liệu của lớp RRT

 Các hàm chức năng

STT Tên hàm Mô tả chức năng

1 void Refresh(receiveData,

int)

Cập nhật nhãn thời gian cho thông tin

2 void SaveData(receiveData,

int)

Lưu trữ thông tin dữ liệu vào RRT

3 nsaddr_t searchItem(int) Tìm kiếm thông tin dữ liệu yêu cầu

4 int isFull() Kiểm tra kích thước RRT

5 void print_RRT() Xuất thông tin lưu trữ trong RRT

6 void init() Khởi tạo thông tin cho RRT

7 void setTTL(int) Gán thời gian quá hạn

8 int getTTL() Lấy thới gian quá hạn

9 void deleteItem(int) Xóa phần tử trong RRT

10 void deleteItem(int,

nsaddr_t)

Xóa phần tử trong một dòng trong RRT với phần tử và MU gửi xác định.

11 void sortBySender() Sắp xếp bảng RRT theo MU gửi

12 RRT* splitBySender(int &) Chia bảng RRT thành mảng các bảng RRT theo từng MU gửi

13 int* ConvertRRTToArray(int

&)

Lấy danh sách các hạng mục dữ liệu có tồn tại trong RRT

Bảng 4-9 Các hàm chức năng của lớp RRT

4.6.2.2Lớp MyCache

 Cấu trúc dữ liệu

Lớp MyCache đóng vai trò là kho lưu trữ tại mỗi thiết bị mobile, chúng tôi dùng bảng băm để lưu trữ dữ liệu. Cấu trúc dữ liệu:

class data { public: char _label; int _item; nsaddr_t _IDMU; int _time; bool _allowDel; //Dùng tính giá trị LUV int _last; float _a; int _dem; float _utility; void init(); };

class MyCache { public: int _index; int _size; ITEM _item; int _TTL; MyCache(); void init(); int getSize();

void setSize(int);

data getItem(int);

data addItemp(data);

data* addArrayItem(data*, int, int&, int);

void calcUtility(int);

void deleteitem(int);

void setAllowDel(data, bool);

int searchItem(int, int);

void UpdateItem(data, int);

void print_item();

int isFull();

void setTTL(int);

int getTTL(); };

Bảng 4-10 Cấu trúc dữ liệu của lớp MyCache

 Các hàm chức năng

STT Tên hàm Mô tả chức năng

1 MyCache() Hàm khởi tạo

2 void init() Khởi tạo các giá trị ban đầu cho cache

3 int getSize() Lấy kích thước cache

4 void setSize(int) Thiết lập kích thước cache

5 data getItem(int) Lấy dữ liệu trong cache dựa vào chỉ mục

6 data addItemp(data) Lưu trữ dữ liệu vào kho lưu

trữ(cache)

7 data* addArrayItem(data*,

int, int&, int)

Thêm vào cache một mảng các hạng mục dữ liệu.

cache

9 void deleteitem(int) Xóa dữ liệu trong cache

10 void setAllowDel(data,

bool)

Thiết lập cờ được phép xóa cho hạng mục dữ liệu

11 int searchItem(int, int) Tìm kiếm dữ liệu trong cache

12 void UpdateItem(data, int) Cập nhật thông tin hạng mục dữ liệu

13 void print_item() Xuất thông tin trong cache

14 int isFull() Kiểm tra cache đầy

15 void setTTL(int) Thiết lặp giá trị TTL

16 int getTTL() Lấy giá trị TTL

Bảng 4-11 Các hàm chức năng của lớp MyCache

4.6.2.3Lớp numNeighNeigh  Cấu trúc dữ liệu class numNeighNeigh { public: int id; int num; MyList idNeigh; };

typedef std::map<int,numNeighNeigh>BUFFER;

Bảng 4-12 Cấu trúc dữ liệu của lớp numNeighNeigh

 Mô tả chức năng

Lớp numNeighNeigh là thuộc tính của lớp EMixAgent, có nhiệm vụ lưu trữ thông tin về số lượng nút vùng của một MU.

4.6.2.4Lớp MyList

 Cấu trúc dữ liệu

Lớp MyList được dùng để lưu trữ thông tin các hàng xóm của MU. Chúng tôi dùng danh sách liên kết đơn để quản lý lớp MyList, cấu trúc dữ liệu tại mỗi node là thông tin của một thiết bị mobile.

struct node { int info; int _postX; int _posY; char*name; node* pnext; }; struct list { node* phead; node* ptail; int n; }; class MyList { public: list l; public:

void init(list &);

node* getNode(int);

void addNode(list &,node*);

void input(list &,int );

void output(list);

int seachInfo(list,int);

void output_neighbors(list);

void convertArray(list,int[]);

int getNumNode(list);

int isExists(list,int);

int find_MU_previous(list,int);

int getMU_Head(list);

int isEmpty(list); };

Bảng 4-13 Cấu trúc dữ liệu của lớp MyList

 Các hàm chức năng

STT Tên hàm Mô tả chức năng

1 void init(list &) Khởi tạo danh sách liên kết đơn

2 node* getNode(int) Lấy địa chỉ một node

3 void addNode(list &,node*) Thêm một node vào danh sách

4 void input(list &,int ) Thêm thông tin vào node

5 void output(list) Xuất thông tin danh sách liên kết

đơn

6 int seachInfo(list,int) Tìm thông tin trong danh sách

liên kết đơn

7 void output_neighbors(list) Xuất thông tin hàng xóm của

một MU

8 void convertArray(list,int[]) Chuyển đổi danh sách liên kết

đơn thành mảng

9 int getNumNode(list) Lấy số lượng hàng xóm trong

danh sách liên kết đơn

10 int isExists(list,int) Kiểm tra một MU có trong danh

sách liên kết đơn.

11 int find_MU_previous(list,int) Tìm ID MU trong danh sách liên

kết đơn.

12 int getMU_Head(list) Lấy MU đầu danh sách liên kết

đơn

13 int isEmpty(list) Kiểm tra danh sách liên kết đơn

rổng.

Bảng 4-14 Các hàm chức năng của lớp MyList

4.6.2.5Lớp EMixAgent

 Cấu trúc dữ liệu

Chúng tôi xây dựng giao thức EMixAgent được kế thừa từ giao thức Agent của NS-2, trong giao thức này có sử dụng các thành phần mạng cơ bản của NS-2. Do tính chất kế thừa nên giao thức mà chúng tôi xây dựng có sử dụng các thuộc tính và phương thức có sẳn trong NS-2 như:

packet nsaddr_t

command(int,const char*const*) recv(Packet*, Handler*)

class EMixAgent: public Agent {

public:

friend class EMixAgent_PktTime;

friend class PktTime_Timeout;

friend class PktNumNeigh_Timeout;

friend class PktMUInter_Timeout;

friend class PktMU_RRT_Timeout;

friend class PktMU_Neighs_Timeout;

friend class PktMU_receive_result_Timeout;

friend class PktMU_wait_result_Timeout;

friend class PktMU_find_neighs_Timeout;

friend class Pkt_resolve_request_Timeout;

friend class Pkt_join_resquest_Timeout;

friend class Pkt_relay_join_Timeout;

friend class Pkt_resquest_data_for_DN_Timeout;

friend class Pkt_resquest_data_for_broadcast_Timeout;

RRT _RRT; int _sizeCache; nsaddr_t id; int counter; bool result; int sl; int dem; int currentTime; int X; int Y; int numNode; int *request_items; int* original_request_items;

int request_items_size, original_request_items_size;

bool result_routing; int TH; MyList id_neighbors; MyList id_neighbors_temp; MyList buffer_temp; BUFFER _buffer; STORE_PACKET _store_packet; STORE_REQUEST _store_request; STORE_PROFILE _profile; int trace; int traceThongDiepMau; int traceThoiGian; int traceUplink; MyCache _myCache; fstream write; fstream writeThoiGian;

fstream writeNeighs; fstream writeUplink;

receiveData d;

int firstTime;

bool bJoinTimeout, bBroadcastTimeout;

bool bOutputResult;

myRelayJoinClass* lstRelayJoin1;

myRelayJoinClass* lstRelayJoin2;

nsaddr_t* lstRelayJoinSender1;

nsaddr_t* lstRelayJoinSender2;

int lstRelayJoinSize1, lstRelayJoinSize2; EMixAgent(nsaddr_t);

int command(int, const char* const *);

void handleRD_request(Packet*);

void recv(Packet*, Handler*);

void Queue(int*, int);

void timeOut();

void print_position();

bool delItem(int*, int&, int);

void receive_request_Data(Packet*);

void Filter(Packet*);

void replay_result(Packet*);

void request_data_routing();

void reset_numNeigh(MyList);

void initNum();

void update_numNeighs(int, int);

MyList get_idNeighs(int);

int find_max_numNeigh(MyList);

Packet *getPacket();

void SaveNumNeighs(Packet*);

void MU_Inter_request_data_routing();

void MU_Inter_find_Mu_routing();

void find_neighbors();

void MU_inter_receive_request(Packet*);

void feedback(Packet*);

void Save_neighbors(Packet*);

void output_neighbors();

void receive_position(Packet*);

void Print_Buffer();

void replay_find_Mu_routing(nsaddr_t _src);

void receive_rrt_routing(Packet*);

void receive_neighs_routing(Packet*);

void SolveToSource(Packet *, int);

void request_Data(int*, int);

myJoinResquestClass CreateJoinResquestPkt(int*, int&);

void Solve_When_Receive_Join_Resquest(Packet*);

void MU_join_resquest_1();

void QN_broadcast_in_zone();

void QN_output_data();

void output_time(int type);

void output_time(int type, nsaddr_t Mu_gui);

void output_message(nsaddr_t, int);

void output_message(int, nsaddr_t, int);

protected: EMixAgent_PktTime pkt_timer_; PktTime_Timeout pkt_timeout; PktNumNeigh_Timeout pkt_numNeigh_timeout; PktMUInter_Timeout pkt_MUInter_timeout; PktMU_RRT_Timeout pkt_MU_RRT_timeout; PktMU_Neighs_Timeout pkt_MU_Neighs_timeout; PktMU_receive_result_Timeout pkt_MU_receive_result_timeout; PktMU_wait_result_Timeout pkt_MU_wait_result_timeout; PktMU_find_neighs_Timeout pkt_MU_find_neighs_timeout; Pkt_resolve_request_Timeout pkt_resolve_reuqest_timeout; Pkt_join_resquest_Timeout pkt_join_resquest_timeout; Pkt_relay_join_Timeout pkt_relay_join_timeout; Pkt_resquest_data_for_DN_Timeout pkt_resquest_data_for_DN_timeout; Pkt_resquest_data_for_broadcast_Timeout pkt_resquest_data_for_broadcast_timeout; void reset_EMixAgent_pkt(); void numNeigh_timeout(); void MU_Neighs_timeout(); void MU_wait_result_timeout(); void MU_find_neighs_timeout(); };

Bảng 4-15 Cấu trúc dữ liệu lớp EMixAgent

 Các hàm chức năng chính

STT Tên hàm Mô tả chức năng

1 EMixAgent(nsaddr_t) Hàm khởi tạo

2

int command(int, const char*

const *) Đọc các lệnh từ script tcl

3

void handleRD_request(Packet*) Thông báo đã nhận gói tin ra màn

hình

4 void recv(Packet*, Handler*)

Hàm dùng để xử lý các gói tin được nhận về

5 void Queue(int*, int)

Tạo hàng đợi các lệnh yêu cầu dữ liệu

6 void timeOut()

Hết thời gian thực hiện truy vấn, phải thống báo kết quả

7 void print_position()

Tìm kiếm và xuất các MU lân cận một bước nhảy của một nút

8

bool delItem(int*, int&, int) Xóa một mục dữ liệu trong mảng

các hạng mục dữ liệu.

9

void

receive_request_Data(Packet*)

Hàm xử lý khi một MU nhận được yêu cầu dữ liệu từ một MU khác.

10 void Filter(Packet*)

Hàm xử lý khi một MU nhận được dữ liệu thật

11 void replay_result(Packet*)

Hàm xử lý khi MU vùng có kết quả, thông báo về cho MU nguồn

12 void request_data_routing()

Hàm xử lý yêu cầu dữ liệu trong phạm vi định tuyến

13 void reset_numNeigh(MyList)

Cập nhật lại danh sách các nút hàng xóm

14 void initNum() Khởi tạo số lượng hàng xóm

15 void update_numNeighs(int, int)

Cập nhật số lượng hàng xóm của một nút

16 MyList get_idNeighs(int) Lấy danh sách hàng xóm

17 int find_max_numNeigh(MyList) Tìm MU có nút vùng lớn nhất

18 Packet *getPacket() Lấy thông tin gói dữ liệu

19 void SaveNumNeighs(Packet*)

Hàm xử lý lưu trữ số lượng nút mạng của các MU trong vùng.

20

void

MU_Inter_request_data_routing() MU trung gian yêu cầu dữ liệu

21 void MU_Inter_find_Mu_routing()

Các MU trung gian giải quyết yêu cầu dữ liệu.

22 void find_neighbors()

Nhiệm vụ tìm hàng xóm của MU khi MU gia nhập vào mạng.

23

void

MU_inter_receive_request(Packet

*)

Mu trung gian nhận dữ liệu yêu cầu và xử lý

24 void feedback(Packet*)

Hàng xóm phản hồi lại những thông tin cần thiết cho MU nguồn.

25 void Save_neighbors(Packet*) Lưu những hàng xóm của MU.

26 void output_neighbors();

Xuất thông tin các hàng xóm ra màn hình.

27 void receive_position(Packet*) Ghi nhận các MU lân cận

28 void Print_Buffer()

Xuất danh sách các MU lân cận của một nút

29

void

replay_find_Mu_routing(nsaddr_t

_src)

MU hồi đáp thông tin dữ liệu

30

void

receive_rrt_routing(Packet*)

Dữ liệu yêu cầu được giải quyết dựa vào RRT

31

void

receive_neighs_routing(Packet*)

Yêu cầu dữ liệu được gửi đến các nút vùng.

32

void SolveToSource(Packet *,

int)

Các MU xử lý khi gói tin từ các nút mạng truyền về cho đến MU nguồn

33 void request_Data(int*, int) MU nguồn nhận yêu cầu dữ liệu

Một phần của tài liệu NGHIÊN CỨU KỸ THUẬT CỘNG TÁC KHO DỮ LIỆU LƯU GIỮA CÁC CLIENTS TRONG HỆ THỐNG THÔNG TIN DI ĐỘNG DỰA TRÊN KIẾN TRÚC P2P (Trang 82 - 114)

Tải bản đầy đủ (PDF)

(147 trang)