1. Nội dung thiết kế tốt nghiệp:
3.5. Mô phỏng một mạng WiMAX đơn giản dùng chương trình OMNet++
đơn giản dùng chương trình
OMNet++ 3.5.1. Mô hình mạng
Mô hình mô phỏng mạng gồm một trạm gốc ( base station ) và các đầu cuối CPE ( số lượng tùy chọn ). Trong đó các CPE liên lạc tới trạm gốc thông qua một kênh vô tuyến dùng chung. Mô hình này được mô phỏng theo mục đích chỉ quan tâm đến việc sử dụng kênh khả thi ,vì thế ở đây bỏ qua đường truyền xuống ( từ BS đến các CPE ) và những sự chuyển tiếp hay sự truyền lại Các CPE trong mô hình truyền theo quy luật ngẫu nhiên. Nhiệm vụ chính của trạm gốc dùng để kiểm tra cho những sự va chạm và tính toán thống kê, trong đó thống kê quan trọng nhất là về hiệu lực kênh (channel
utilization ).
+ Giao diện hoạt động của mạng được trình bày như hình a.
Hình 3.15. Giao diện mô phỏng cấu trúc và cách thức hoạt động của mạng WiMAX.
+ Giao diện người điều khiển sẽ cung cấp các nút để điều khiển hoạt động của mô hình mạng. Ngoài ra còn cho biết thông tin về lịch trình các sự kiện, cấu trúc của mạng, quá trình xử lý, …
Hình 3.16. Giao diện người điều khiển của chương trình mô phỏng. + Các trường hợp của chương trình mô phỏng.
File omnetpp.ini được viết chứa đựng 3 kịch bản đặt sẵn cho sự hoạt động của chương trình mô phỏng được trình bày như hình c.
Hình 3.17. Các kịch bản đặt sẵn của mô hình mạng WiMAX.
Dựa vào các kết quả chạy mô phỏng của từng kịch bản mà rút ra trường hợp nào là tối ưu nhất.
Hình 3.18. Cấu trúc liên kết của một chương trình mô phỏng trong OMNet+ +.
+ Trước hết trong máy phải cài chương trình VC++ để lập trình mọi thao tác trên đó.
+ Cấu trúc liên kết của một chương trình mô phỏng. 3.5.2. Kết quả thu được trong mô phỏng.
Tiến hành chạy mô phỏng ở cả 3 trường hợp trong khoảng thời gian 30 phút ( tính theo thời gian mô phỏng ), sau khi kết thúc ta sẽ thu được 2 file
Thư viện giao diện người dung *.lib/*.a Thư viện lõi
của chương trình mô phỏng *.lib/*.a NEDC compiling
File mô tả cấu trúc mạng sau khi dịch *_n.cpp C++ compiling Linking Chương trình mô phỏng Chạy chương trình
File kết quả *.vec, *.sna, *.sca File cấu hình omnetpp.ini File xử lý của simple modules *.cpp File mô tả cấu trúc mạng *.ned
chứa kết quả của quá trình xử lý: omnetpp.sca và omnetpp.vec. + Các giá trị thống kê.
Scalars là chương trình do OMNet++ hổ trợ, nó dùng để trình bày những nội dung của file omnetpp.sca về các giá trị thống kê. Việc so sánh kết quả của những lần chạy thử khác nhau, thì chương trình scalars là lựa chọn hữu ích nhất.
Các giá trị thống kê sau khi chạy mô phỏng ở 3 trường hợp được trình bày như hình d và bảng a.
Bảng 3.2. Các giá trị thống kê sau khi chạy mô phỏng. Run# channel utilization total frames collided frames duration total collision time total receive time 1 0.03393875 82779 64934 1799.999167 1709.643282 61.08666667 2 0.349855618 24644 11081 1799.909167 716.3150928 629.7083333 3 0.131126987 2754 191 1799.909167 18.4776523 236.0166667 Nhận xét:
+ Nhìn vào bảng 5.1 ta có thể thấy ở lần chạy đầu tiên tổng số frame truyền đi so với 2 trường hợp còn lại là rất lớn 82779, tuy nhiên số frame va chạm nhau không được nhận bởi trạm gốc cũng rất lớn 64934, điều này càng rõ hơn nếu như chúng ta xem xét đến 2 thông số tổng thời gian va chạm (total collision time), và tổng thời gian nhận (total receive time) chúng chênh lệch nhau khá lớn. Từ đó ta có thể rút ra kết luận mạng trong trường hợp này đang bị quá tải kênh truyền (overloaded) và hiệu lực kênh đạt được là thấp nhất.
+ Ở lần chạy thứ 2 ta nhận thấy hiệu lực kênh đạt được là lớn nhất 0.349855618, xem xét tới thông số tổng thời gian nhận so với tổng thời gian mô phỏng sẽ chứng minh được điều đó. Vậy đây là trường hợp tối ưu, tốt nhất của mô hình mô phỏng trong cả 3 lần chạy.
+ Tiếp tục xem xét lần chạy thứ 3, mặc dù tỉ lệ frame bị va chạm so với tổng số frame truyền đi là rất thấp 1:14.4 (191:2754), nhưng trong trường hợp này tổng số frame truyền đi là rất thấp so với 2 trường hợp trước khoảng 1:10 (so với run 2) và 1:30 (so với run 1) trong cùng một khoảng thời gian hay nói cách khác là lưu lượng các frame truyền trên kênh (traffic) là thấp nhất. Vậy lần chạy thứ 3 của mô hình đã mô phỏng mạng ở tình trạng low traffic, trong thực tế trường hợp này thường xảy ra trong điều kiện thời tiết xấu, kênh truyền bị nhiễu…
Hai biểu đồ sau sẽ giúp ta nhận thấy rỏ hơn sự khác biệt của 3 lần mô phỏng.
Hình 3.20. Biểu đồ về channel utilization và frames.
+ Các đồ thị vẽ bằng chương trình Plove trong OMNet++.
Plove là một chương trình vẽ đồ thị được tích hợp sẵn trong OMNet++. Trong mô hình mô phỏng mạng WiMAX ta sử dụng chương trình này để vẽ đồ thị của 3 tham số : channel utilization, collision length, collision multiplicity. Ở đây xem xét tới tham số channel utilization và collision multiplicity để phân tích, so sánh kết quả của 3 lần chạy, sau đây là các đồ thị của hiệu lực kênh và số lượng sự va chạm ứng với từng thời điểm.
Hình 3.21. Đồ thị channel utilization và collision multiplicity của lần chạy thử 1.
Hình 3.22. Đồ thị channel utilization và collision multiplicity của lần chạy thử 2.
Hình 3.23. Đồ thị channel utilization và collision multiplicity của lần chạy thử 3.
Ở lần chạy thử 1, nhìn vào đồ thị hiệu lực kênh thì giá trị trung bình trong suốt quá trình mô phỏng là rất thấp khoảng 0,035%, ngoài ra số lượng các frame bị mất do va chạm ở mỗi thời điểm là rất cao khoảng trên 7 frames và với mật độ truyền rất lớn. Do đó ta có thể kết luận đây là trường hợp mạng bị quá tải. Tương tự ta có thể thấy ở lần chạy thứ 2, hiệu lực kênh rất cao và frame bị va chạm rất ít, đây chính là trường hợp mạng hoạt động tối ưu nhất trong 3 lần chạy. Lần chạy thử 3 tuy hiệu lực kênh cũng khá cao, nhưng mật độ truyền rất thấp, và nhiều khi không có frame nào được truyền trên kênh, vì thế ta có thể nhận thấy đây chính là trường hợp mạng hoạt động với lưu lượng rất thấp (low traffic).
3.6. Kết luận chương.
Với nhu cầu sử dụng các dịch vụ truy nhập băng rộng ngày một lớn và cấp thiết, nhất là với những khu vực vùng sâu, vùng xa sẽ là động lực để cho các doanh nghiệp Viễn thông trong nước triển khai các hệ thống WIMAX.
Với sự quan tâm tạo điều kiện của các cơ quan quản lý và nhu cầu triển khai để cạnh tranh, các hệ thống WiMAX nhất định sẽ được triển khai thành công ở Việt Nam trong thời gian gần đây.
Mô hình ở phần mô phỏng đã mô tả được phần nào cấu trúc, cách triển khai một mạng WiMAX. Qua 3 kịch bản của mô hình mạng đã mô phỏng cho 3 khả năng có thể xảy ra đối với một mạng WiMAX hoạt động trong thực tế. Từ đó qua nhiều lần thực nghiệm với các thông số khác, ta có thể lựa chọn mô hình mạng tối ưu nhất hay đưa ra các giải pháp nhằm tối ưu các thông số, tăng hiệu năng của kênh truyền.
Kết luận và hướng phát triển đề tài
Với mục tiêu là nghiên cứu công nghệ truy nhập vô tuyến WiMAX và quá trình triển khai trong thực tế, qua nghiên cứu, phân tích, so sánh và đánh giá việc thực hiện trong nội dung đồ án tốt nghiệp có thể rút ra kết luận như sau:
+ WiMAX là công nghệ truy nhập vô tuyến băng rộng được phát triển dựa trên họ tiêu chuẩn IEEE 802.16 với hai tiêu chuẩn chủ yếu được áp dụng đã được thông qua là IEEE 802.16-2004 là cơ sở cho phiên bản WiMAX cố định và tiêu chuẩn IEEE 802.16 e là cơ sở cho phiên bản WiMAX di động, và tiếp đến là chuẩn IEEE 802.16 m một lựa chọn đáng tin để tiến đến mạng 4G.
Việc triển khai WiMAX tại Việt Nam sẽ đáp ứng được các đòi hỏi ngày một lớn về nhu cầu truy nhập băng rộng, góp phần thúc đầy kinh tế phát triển, đặc biệt là các khu vực nông thôn, miền núi và các khu đô thị mới.
Hướng phát triển đề tài
Hướng phát triển tiếp theo của đề tài là nghiên cứu sâu hơn về các giải pháp điều khiển trong WiMAX, đặc biệt là vấn đề về điều chế và hệ thống anten thích nghi nhằm thiết kế vùng phục vụ có hiệu quả nhất. Vấn đề bảo mật và vấn đề điều chế trong WiMAX cũng sẽ được nghiên cứu sâu hơn nhằm đưa ra những yêu cầu cụ thể phù hợp với mạng lưới Việt Nam.
Trong thời gian thực hiện đồ án tốt nghiệp với đề tài “ Tìm hiểu công nghệ WiMAX – Triển khai và ứng dụng trong mạng viễn thông Việt Nam” em đã nhận được sự hướng dẫn và giúp đỡ tận tình của các thầy cô
trong khoa Điện Tử - Viễn Thông trường Đại Học Vinh. Vậy cho phép em được bày tỏ lòng biết ơn sâu sắc tới sự giúp đỡ đó.
Đặc biệt em xin chân thành cảm ơn Thầy giáo KS. Mai Thế Anh, người đã trực tiếp hướng dẫn và tạo mọi điều kiện thuận lợi giúp đỡ em hoàn thành tốt đồ án này .
Tài liệu tham khảo
[1]. IEEE 802.16 – 2004, (October, 2004), Air Interface for Fixed Broadband Wireless Access Systems.
[2]. IEEE 802.16e, (February, 2005), Air Interface for Fixed and Mobile Broadband Wireless Access Systems.
[3]. Hassan Yagoobi, Intel Technology Journal, (Vol 08, August 2004)
Scalable OFDMA Physical Layer in IEEE 802.16 WirelessMAN4.
[4]. WiMAX Forum, (2006), Mobile WiMAX – Part I: A Technical Overview and Performance Evaluation.
[5]. WiMAX Forum, (March, 2006) Mobile WiMAX – Part II: A Comparative Analysis.
[6]. 3GPP TS 25.308, (Sep. 2004), High Speed Downlink Packet Access (HSDPA) Overall Description.
[7]. 3rd Generation Partnership Project 2 “3GPP2”, (March 2004)
CDMA2000 High Rate Packet Data Air Interface Specification .
[8]. WiMAX Forum white paper, WiMAX’s technology for LOS and NLOS environments.
[9]. www.ieee.org
[10]. www.quantrimang.com [11]. www.svbkol.org
[13]. www.wimaxforum.org
[14]. www.wimaxpro.org [15]. www.wimax.com
Phụ lục. Mã nguồn của chương trình
Phần chương trình
Mã nguồn file “network.ned” mô tả cấu trúc mạng WiMAX
module Wimax parameters:
numCpes: numeric, // number of cpes txRate: numeric, // transmission rate slotTime: numeric const;
submodules: base_station: ABase_station; parameters: txRate = txRate; display: "p=161,72;i=device/antennatower_l"; cpe: ACpe[numCpes]; parameters: txRate = txRate, slotTime = slotTime; display: "i=device/pc_s"; connections nocheck: display: "b=524,422"; endmodule
Mã nguồn file “cpe.cpp” mô tả cách thức hoạt động của các đầu cuối CPE
#include <omnetpp.h>
class ACpe : public cSimpleModule {
private: // Cac tham so double radioDelay; double txRate; cPar *iaTime; cPar *pkLenBits; double slotTime;
bool isSlotted; // bien trang thai, con tro su kien cModule *base_station;
cMessage *endTxEvent;
enum {IDLE=0, TRANSMIT=1} state; int pkCounter;
public: ACpe();
virtual ~ACpe(); protected:
virtual void initialize();
virtual void handleMessage(cMessage *msg); }; Define_Module(ACpe); ACpe::ACpe() { endTxEvent = NULL; } ACpe::~ACpe() { cancelAndDelete(endTxEvent); } void ACpe::initialize()
{
base_station = simulation.moduleByPath("base_station"); if (!base_station) error("base_station not found");
txRate = par("txRate"); radioDelay = par("radioDelay"); iaTime = &par("iaTime"); pkLenBits = &par("pkLenBits"); slotTime = par("slotTime"); isSlotted = slotTime>0; WATCH(slotTime); WATCH(isSlotted);
endTxEvent = new cMessage("send/endTx"); state = IDLE; pkCounter = 0; WATCH((int&)state); WATCH(pkCounter); if (ev.isGUI()) displayString().setTagArg("t",2,"#808000"); scheduleAt(iaTime->doubleValue(), endTxEvent); } void ACpe::handleMessage(cMessage *msg) { ASSERT(msg==endTxEvent); if (state==IDLE) {
// phat sinh goi va thiet lap thoi gian chay chuong trinh khi su kien ket thuc
sprintf(pkname,"pk-%d-#%d", id(), pkCounter++); ev << "generating packet " << pkname << endl; state = TRANSMIT;
// cap nhat do hoa mang mo phong if (ev.isGUI())
{
displayString().setTagArg("i",1,"yellow"); displayString().setTagArg("t",0,"TRANSMIT"); }
cMessage *pk = new cMessage(pkname); pk->setLength(pkLenBits->longValue()); double txtime = pk->length() / txRate;
sendDirect(pk, radioDelay, base_station->gate("in")); scheduleAt(simTime()+txtime, endTxEvent);
}
else if (state==TRANSMIT) {
// ket thuc su truyen nhung tin hieu state = IDLE;
// hoach dinh viec gui tiep theo if (!isSlotted) { scheduleAt(simTime()+iaTime->doubleValue(), endTxEvent); } else { simtime_t t = simTime()+iaTime->doubleValue(); t = slotTime * ceil(t/slotTime); scheduleAt(t, endTxEvent);
}
// cap nhat do hoa mang mo phong if (ev.isGUI()) { displayString().setTagArg("i",1,""); displayString().setTagArg("t",0,""); } } else { error("invalid state"); } }
Mã nguồn file “base station.cpp” mô tả cách thức hoạt động của trạm gốc
#include <omnetpp.h>
class ABase_station : public cSimpleModule {
private:
// bien trang thai ,con tro su kien bool channelBusy; cMessage *endRxEvent; double txRate; long currentCollisionNumFrames; simtime_t recvStartTime; // nhung su thong ke long totalFrames; long collidedFrames;
simtime_t totalReceiveTime; simtime_t totalCollisionTime; double currentChannelUtilization; cOutVector collisionMultiplicityVector; cOutVector collisionLengthVector; cOutVector channelUtilizationVector; public: ABase_station(); virtual ~ABase_station(); protected:
virtual void initialize();
virtual void handleMessage(cMessage *msg); virtual void finish();
}; Define_Module(ABase_station); ABase_station::ABase_station() { endRxEvent = NULL; } ABase_station::~ABase_station() { cancelAndDelete(endRxEvent); } void ABase_station::initialize() { txRate = par("txRate");
endRxEvent = new cMessage("end-reception"); channelBusy = false;
currentCollisionNumFrames = 0; totalFrames = 0; collidedFrames = 0; WATCH(currentCollisionNumFrames); WATCH(totalFrames); WATCH(collidedFrames); totalReceiveTime = 0.0; totalCollisionTime = 0.0; currentChannelUtilization = 0; WATCH(totalReceiveTime); WATCH(totalCollisionTime); WATCH(currentChannelUtilization); collisionMultiplicityVector.setName("collision multiplicity"); collisionLengthVector.setName("collision length"); channelUtilizationVector.setName("channel utilization"); if (ev.isGUI()) displayString().setTagArg("i2",0,"x_off"); } void ABase_station::handleMessage(cMessage *msg) { if (msg==endRxEvent) { ev << "reception finished\n"; channelBusy = false;
// cap nhat gia tri thong ke
simtime_t dt = simTime() - recvStartTime; if (currentCollisionNumFrames==0)
{
} else { totalCollisionTime += dt; collisionMultiplicityVector.record(currentCollisionNumFrames); collisionLengthVector.record(dt); } currentChannelUtilization = totalReceiveTime/simTime(); channelUtilizationVector.record(currentChannelUtilization); currentCollisionNumFrames = 0;
// cap nhat do hoa mang if (ev.isGUI()) { displayString().setTagArg("i2",0,"x_off"); displayString().setTagArg("t",0,""); } } else { totalFrames++;
double endReception = simTime() + msg->length() / txRate; if (!channelBusy) { ev << "started receiving\n"; recvStartTime = simTime(); channelBusy = true; scheduleAt(endReception, endRxEvent); if (ev.isGUI()) {
displayString().setTagArg("i2",0,"x_yellow"); displayString().setTagArg("t",0,"RECEIVE"); displayString().setTagArg("t",2,"#808000"); } } else {
ev << "another frame arrived while receiving -- collision!\n";
collidedFrames++; if (currentCollisionNumFrames==0) currentCollisionNumFrames = 2; else currentCollisionNumFrames++; if (endReception > endRxEvent->arrivalTime()) { cancelEvent(endRxEvent); scheduleAt(endReception, endRxEvent); }
// cap nhat do hoa mang if (ev.isGUI()) { displayString().setTagArg("i2",0,"x_red"); displayString().setTagArg("t",0,"COLLISION"); displayString().setTagArg("t",2,"#800000"); char buf[32];
sprintf(buf, "Collision! (%ld frames)", currentCollisionNumFrames);
} } channelBusy = true; delete msg; } } void ABase_station::finish() {
ev << "duration: " << simTime() << endl; ev << "total frames: " << totalFrames << endl;
ev << "collided frames: " << collidedFrames << endl; ev << "total receive time: " << totalReceiveTime << endl; ev << "total collision time: " << totalCollisionTime << endl;
ev << "channel utilization: " << currentChannelUtilization << endl; recordScalar("duration", simTime());
recordScalar("total frames", totalFrames);
recordScalar("collided frames", collidedFrames); recordScalar("total receive time", totalReceiveTime); recordScalar("total collision time", totalCollisionTime);
recordScalar("channel utilization", currentChannelUtilization); }
Mã nguồn file “omnetpp.ini” khởi tạo giá trị cho các tham số trong mạng
[General]
preload-ned-files=*.ned network=wimax
[Parameters]
wimax.txRate=9600
wimax.cpe[*].pkLenBits=952 wimax.cpe[*].radioDelay=0.01 [Run 1]
description="Wimax chay thu 1, overloaded" # slotTime = pkLen/txRate = 960/9600 = 0.1s wimax.slotTime=0.1s
wimax.cpe[*].iaTime=exponential(0.5) [Run 2]
description="Wimax chay thu 2, optimal load" # slotTime = pkLen/txRate = 960/9600 = 0.1s wimax.slotTime=0.1s
wimax.cpe[*].iaTime=exponential(2) [Run 3]
description="Wimax chay thu 3, low traffic" # slotTime = pkLen/txRate = 960/9600 = 0.1s wimax.slotTime=0.1s
wimax.cpe[*].iaTime=exponential(20)