Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 105 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
105
Dung lượng
3,67 MB
Nội dung
Luận văn tốt nghiệp LỜI CAM ĐOAN Tôi xin cam đoan đề tài luận văn tốt nghiệp Thạc sỹ “Nghiên cứu đánh giá số giao thức tiết kiệm lượng lớp Mac cho mạng cảm biến không dây” cơng trình nghiên cứu tơi với hướng dẫn khoa học Thầy giáo TS Lê Minh Tuấn giúp đỡ anh chị đồng nghiệp VNPT Hà Nội Các kết nghiên cứu có tính độc lập riêng, không chép tài liệu Các tài liệu tham khảo, sử dụng luận văn có nguồn gốc rõ ràng, với thực tiễn Tôi xin chịu trách nhiệm với lời cam đoan Tác giả PHẠM THANH LONG Trang Luận văn tốt nghiệp LỜI CẢM ƠN Em xin bày tỏ lòng cảm ơn sâu sắc tới Thầy giáo TS Lê Minh Tuấn tận tình hướng dẫn, bảo định hướng cho em suốt trình thực luận văn Em xin chân thành cảm ơn thầy cô Khoa Công nghệ điện tử Thông tin thuộc Đại học Mở Hà Nội chia sẻ động viên giúp em vượt qua khó khăn để hồn thành tốt cơng việc nghiên cứu Sau em xin cảm ơn tất thầy cơ, bạn bè đóng góp ý kiến cho đề tài em tốt Học viên thực hiện: Phạm Thanh Long Trang Luận văn tốt nghiệp MỤC LỤC - LỜI CAM ĐOAN…………………………………………………………………… - LỜI CẢM ƠN………………………………………………………………………… - MỤC LỤC…………………………………………………………………………… - DANH SÁCH CÁC CHỮ VIẾT TẮT…………………………………………………5 - DANH SÁCH HÌNH VẼ………………………………………………………………7 - DANH SÁCH BẢNG BIỂU………………………………………………………… - LỜI NÓI ĐẦU…………………………………………………………………………10 CHƯƠNG 1: TỔNG QUAN VỀ MẠNG CẢM BIẾN KHƠNG DÂY………………….12 1.1 Giới thiệu……………………………………………………………………… 12 1.1.1 Giới thiệu Mơ hình mạng cảm biến khơng dây……………………………12 1.1.2 Đặc điểm mạng cảm biến không dây………………………………………13 1.2 Cấu trúc mạng cảm biến……………………………………………………… 14 1.2.1 Kiến trúc giao thức mạng cảm biến không dây……………………………… 14 1.2.1.1 Lớp vật lý……………………………………………………………… 15 1.2.1.2 Lớp liên kết liệu…………………………………………………… 17 1.2.1.3 Lớp mạng……………………………………………………………… 17 1.2.1.4 Lớp truyền tải……………………………………………………………18 1.2.1.5 Lớp ứng dụng……………………………………………………………18 1.2.2 Phân loại giao thức định tuyến WSN…………………………………….18 1.2.3 Cấu trúc mạng cảm biến không dây……………………………………………19 1.3 Một số thách thức cần giải cho MAC………………………………… 21 1.4 Vấn đề tối ưu lượng mạng cảm biến không dây…………………25 1.5 Nghiên cứu, phát triển ứng dụng công nghệ WSN… …………… 26 1.5.1 Tính đa dạng thiết kế sử dụng……………………………………… 26 1.5.2 Ứng dụng mạng cảm biến không dây…………………………………… 27 1.5.2.1 Ứng dụng nông nghiệp, lâm nghiệp………………………………27 1.5.2.2 Ứng dụng y tế…………………………………………………… 28 1.5.2.3 Ứng dụng giám sát môi trường …………………………………29 1.5.2.4 Ứng dụng WSNs giao thông ………………………………… 29 1.5.2.5 Ứng dụng gia đình……………………………………………….30 1.5.2.6 Ứng dụng quân đội………………………………………………31 1.5.2.7 Ứng dụng cơng nghiệp - tự động hóa……………………………32 Kết luận Chương 1………………………………………………………………… 32 Trang Luận văn tốt nghiệp CHƯƠNG 2: CÁC GIAO THỨC ĐỊNH TUYẾN, ĐIỀU KHIỂN TRUY NHẬP CỦA LỚP MAC NHẰM TIẾT KIỆM NĂNG LƯỢNG CHO MẠNG WSNs ……………33 2.1 Tiết kiệm lượng lớp mạng WSN ……… 33 2.2 Giao thức ARPEES … 35 2.2.1 Đặc điểm … 35 2.2.2 Hai pha hoạt động … 36 2.3 Giao thức EMRP…… 43 2.3.1 Pha thiết lập 43 2.3.2 Pha thành lập nhóm chọn nhóm trưởng 45 2.3.3 Pha truyền tải liệu 46 2.4 Tổng quan tiết kiệm lượng giao thức lớp MAC………… 50 2.4.1 Giao thức XT - MAC 50 2.4.1.1 Giao thức MAC cho hệ thống định vị WSN 50 2.4.1.2 Mô tả giao thức XT-MAC 51 2.4.1.3 Hoạt động hệ thống định vị XT-MAC 53 2.4.2 Giao thức B - MAC 55 2.4.3 Giao thức MAC theo chuẩn ZigBee/IEEE802.15.4 61 2.4.3.1 Tầng vật lý ZigBee/IEEE 802.15.4 62 2.4.3.2 Tầng điều khiển liệu ZigBee/IEEE 802.15.4 MAC 63 Kết luận Chương .71 CHƯƠNG - MÔ PHỎNG VÀ ĐÁNH GIÁ MỘT SỐ GIAO THỨC TIẾT KIỆM NĂNG LƯỢNG TRONG WSN BẰNG PHẦN MỀM OMNET++ 72 3.1 Giới thiệu chung OMNET++ 72 3.1.1 Các thành phần OMNET++ 72 3.1.2 Mơ hình OMNET++ 73 3.2 Xây dựng mơ hình mơ WSN Omnet++ 74 3.3 Mô đánh giá hiệu lượng giao thức WSN 77 3.3.1 Đánh giá hiệu lượng giao thức định tuyến ARPEES EMRP 77 3.3.2 Đánh giá hiệu lượng giao thức XT–MAC, B–MAC IEEE 802.15.4 80 3.3.3 Đánh giá hiệu WSN đa kiện sử dụng EARPM 72 Kết luận Chương .84 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 84 TÀI LIỆU THAM KHẢO 87 PHỤ LỤC 88 Trang Luận văn tốt nghiệp DANH SÁCH CÁC CHỮ VIẾT TẮT Kí hiệu Tiếng anh Tiếng Việt A ARPEES Adaptive Routing Protocol with Energy-Efficiency and EventClustering for Wireless Sensor Networks Giao thức định tuyến thích nghi với hiệu lượng phân cụm theo kiện cho mạng cảm biến không dây B BS Base Station Trạm gốc BI Beacon interval Khoảng mốc báo BO Beacon Order Đặt mốc báo C CH Cluster Head Cụm trưởng CSMA/CA Carrier Sensor Multiple Access with collision Avoidance Cảm nhận sóng mang đa truy nhập tránh xung đột CCA Clear Channel Assessment Đánh giá kênh rõ ràng E EAR Energy Aware Routing Định tuyến nhận biết lượng EMRP Energy-Awared Meshed Routing Protocol Giao thức định tuyến mạng lưới nhận biết lượng G GTS Khe thời gian đảm bảo Guaranteed Time Slots I IEEE Institute of Electrical and Electronics Engineers Viện kĩ thuật điện điện tử Trang Luận văn tốt nghiệp L LPL Nghe công suất thấp Listen Power Low M MAC Điều khiển truy nhập đa phương tiện Media Access Control O OMNeT Objective Modular Network Testbed Mạng thử nghiệm mô đun đối tượng P PHY Physica Vật lý PAN Personal Area Network Mạng khu vực cá nhân R RN Nút chuyển tiếp Relay Node S SPIN Sensor Protocol for Information via Negotiation Giao thức cảm nhận thông tin thông qua đàm phán T TDMA Time Division multiple Access Đa truy nhập phân chia theo thời gian W WSN Wireless Sensor Network Mạng cảm biến không dây Trang Luận văn tốt nghiệp DANH SÁCH HÌNH VẼ Hình 1.1: Mơ hình mạng cảm biến khơng dây 13 Hình 1.2: Kiến trúc giao thức mạng cảm biến 15 Hình 1.3: Phân chia kênh vơ tuyến dải 24Ghz 16 Hình 1.4: Phân loại giao thức định tuyến cho mạng cảm biến khơng dây 18 Hình 1.5: Ứng dụng hệ thống cảm biến không dây nông nghiệp 27 Hình 1.6: Ứng dụng chăm sóc sức khỏe 28 Hình 1.7: Ứng dụng mơi trường 29 Hình 1.8: Ứng dụng hệ thống cảm biến giao thông 30 Hình 1.9: Ứng dụng hệ thống cảm biến dân dụng 31 Hình 1.10: Ứng dụng hệ thống cảm biến quân đội 31 Hình 2.1: Lưu đồ trạng thái thứ 38 Hình 2.2: Thành cụm dựa kiện thuật toán lựa chọn cụm trưởng 39 Hình 2.3: Lưu đồ giao thức ARPEES pha thứ hai 42 Hình 2.4: Mơ tả ví dụ hàm lựa chọn nút chuyển tiếp 42 Hình 2.5: Mơ hình mạng EMRP với liên kết dạng lưới sau pha thiết lập 45 Hình 2.6: Mơ hình mạng hai mức liên kết EMRP 47 Hình 2.7: Lưu đồ hoạt động pha truyền tải liệu EMRP 49 Hình 2.8: Lưu đồ hoạt động XT-MAC 52 Hình 2.9: Lưu đồ hoạt động XT-MAC kết hợp với EMRP 54 Hình 2.10: Clear Channel Assessment (CCA) 56 Hình 2.11: Mơ hình giao thức ZigBee 61 Hình 2.12: Sơ đồ điều chế 63 Hình 2.13: Cấu trúc siêu khung 64 Hình 2.14: Lưu đồ thuật tốn đa truy nhập kênh CSMA-CA 67 Hình 3.1: Đồ thị so sánh lượng lại giao thức ARPEES EMRP 79 Hình 3.2: Đồ thị so sánh lượng lại giao thức MAC 81 Trang Luận văn tốt nghiệp Hình 3.3: So sánh thời gian sống mạng WSN đa kiện sử dụng EARPM so với DRPDS………………………………………………………………………………82 Hình 3.4: Số lượng nút chết thời gian sống mạng WSN đa kiện sử dụng EARPM so với DRPDS .82 Hình 3.5: Phân tích tỷ lệ lỗi gói ba loại gói liệu mạng WSN đa kiện sử dụng EARPM DRPDS………………………………………………………… 83 Hình 3.6: Phân tích độ trễ ba loại gói liệu mạng WSN đa kiện sử dụng EARPM.…………………………………………………………………………….83 Trang Luận văn tốt nghiệp DANH SÁCH BẢNG BIỂU Bảng 2.1: hoạt động ứng dụng giám sát sử dụng thu phát CC1000 58 Bảng 2.2: Dải tần số theo chuẩn IEEE 802.15.4 62 Bảng 2.3: Định dạng khung MAC 71 Bảng 3.1: Năng lượng cịn lại mạng sau chạy mơ sử dụng giao thức định tuyến ARPEES 78 Bảng 3.2: Năng lượng cịn lại mạng sau chạy mơ sử dụng giao thức định tuyến EMRP 79 Bảng 3.3: Năng lượng lại mạng sử dụng giao thức XT-MAC 80 Bảng 3.4: Năng lượng lại mạng sử dụng giao thức B-MAC 80 Bảng 3.5: Năng lượng lại mạng sử dụng giao thức MAC chuẩn 802.15.4 81 Trang Luận văn tốt nghiệp LỜI NĨI ĐẦU Mạng khơng dây xu phát triển hứa hẹn thay nhiều ứng dụng sử dụng mạng có dây Mạng cảm nhận khơng dây (Wireless Sensor Networks – WSN) đời dựa sở ứng dụng thành tựu cao công nghệ chế tạo linh kiện vi điện tử công nghệ thông tin WSN sử dụng với nhiều mục đích khác nhau, quân sự, dân công nghiệp, với đặc điểm chung bật không cần thao tác người Tuy nhiên mạng cảm ứng phải đối mặt với nhiều thách thức, thách thức lớn nguồn lượng bị giới hạn, khả xử lý thấp, giá thành thấp, giải thơng bé, tín hiệu yếu hoạt động tần số chia sẻ Hiện nhiều nhà nghiên cứu tập trung vào việc cải thiện khả sử dụng hiệu lượng mạng cảm biến lĩnh vực khác Vì vậy, trình tìm hiểu nghiên cứu mạng cảm biến không dây, em lựa chọn đề tài “Nghiên cứu đánh giá số giao thức tiết kiệm lượng lớp Mac cho mạng cảm biến không dây” Luận văn gồm nội dung sau đây: Chương 1: “Tổng quan mạng cảm biến không dây” đưa định nghĩa bản, cấu trúc, ứng dụng đặc điểm WSN Chương trình bày vấn đề lượng WSN từ rút lý lựa chọn đề tài Ngồi trình bày lý thuyết quản lý lượng mạng cảm biến không dây Chương 2: “Tiết kiệm lượng lớp mạng nói chung lớp MAC nói riêng” Đầu tiên trình bày nguyên tắc chung tiết kiệm lương giao thức định tuyến Sau sâu vào tìm hiểu kỹ thuật tiết kiệm lượng số giao thức định tuyến ARPEES EMRP Tiếp theo trình bày nguyên tắc chung tiết kiệm lượng giao thức MAC Sau sâu vào tìm hiểu kỹ thuật tiết kiệm lượng số giao thức MAC XT-MAC, B-MAC giao thức MAC chuẩn 802.15.4 Trang 10 Luận văn tốt nghiệp PacketARPEES *pkt; while (!outQueue.isEmpty()) { pkt = check_and_cast(outQueue.pop()); if (pkt->getPkType() == PK_PAYLOAD_TO_BS) { if (bsAddr > 0) { pkt->setDesMacAddr(bsAddr); pkt->setPreambleFlag(false); } else if (rnAddr > 0) { pkt->setDesMacAddr(rnAddr); } else { EV setSrcMacAddr(getMacAddr()); pkt->setByteLength(pkt->getPkSize()); sendPacket(pkt); } void NetARPEES::sendRelayInfo(PacketARPEES* reqPkt) { if (reqPkt == NULL) return; PacketARPEES_RelayInfo *pkt = new PacketARPEES_RelayInfo(); pkt->setTxType(TX_PPP); pkt->setPkType(PK_RELAY_INFO); pkt->setSrcMacAddr(getMacAddr()); pkt->setDesMacAddr(reqPkt->getSrcMacAddr()); if (par("isBaseStation").boolValue() == true) { pkt->setBsFlag(true); } else { pkt->setBsFlag(false); } pkt->setEnergy(((Energy*) getParentModule()->getSubmodule("energy"))>getCapacity()); Mobility *mob = (Mobility*) getParentModule()>getSubmodule("mobility"); pkt->setPosX(mob->getX()); pkt->setPosY(mob->getX()); pkt->setDBS(dBS); pkt->setByteLength(pkt->getPkSize()); sendPacket(pkt); delete reqPkt; } void NetARPEES::considerRelay(PacketARPEES_RelayInfo *ri) { Mobility *mob = (Mobility*) getParentModule()>getSubmodule("mobility"); Trang 91 Luận văn tốt nghiệp double dRc = distance(mob->getX(), mob->getY(), ri->getPosX(), ri>getPosY()); if (rnAddr getSrcMacAddr(); enerRn = ri->getEnergy(); dRnBs = ri->getDBS(); dRn = dRc; } else { double a1 = assessRelay(enerRn, dRn, dBS, dRnBs); double a2 = assessRelay(ri->getEnergy(), dRc, dBS, ri->getDBS()); if (a2 > a1) { rnAddr = ri->getSrcMacAddr(); enerRn = ri->getEnergy(); dRnBs = ri->getDBS(); dRn = dRc; } } } double NetARPEES::assessRelay(double ener, double dRc, double dBs, double dRcBs) { double cosa = (dRc * dRc + dBs * dBs - dRcBs * dRcBs) / (2 * dRcBs * dBs); return ener * dRc / dRcBs * cosa; } b) Giao thức định tuyến EMRP: #include "netemrp.h" #include "packetemrp_m.h" #include "messagecr_m.h" #include "messagetracking_m.h" #include "link.h" #include "link802154.h" #include "energy.h" #include "mobility.h" #include "worldutil.h" #include "msgkind.h" #include "statcollector.h" Define_Module(NetEMRP); void NetEMRP::initialize() { if (!par("isBaseStation").boolValue()) { scheduleAt(uniform(0, par("initInterval").doubleValue()), initTimer); } scheduleAt(0, radioOnTimer); } void NetEMRP::handleMessage(cMessage *msg) { if (msg->isSelfMessage()) { if (msg == radioOnTimer) { Trang 92 Luận văn tốt nghiệp Link802154 *link = check_and_cast(getModuleByPath("^.link")); if (par("isBaseStation").boolValue()) { link->forceRadioOn(-1); } else { link->forceRadioOn(par("initInterval").doubleValue()); } } else if (msg == initTimer) { requestRelay(true); } else if (msg->getKind() == RES_RELAY) { sendRelayInfo((PacketEMRP*) msg->getContextPointer()); delete msg; } else if (msg->getKind() == EMRP_WAIT_RELAY) { if (bsAddr > || rnAddr > 0) { sendMsgDown((MessageCR*) msg->getContextPointer()); } else { EV incLostMTRbyNet(); delete (MessageCR*) msg->getContextPointer(); } delete msg; } else if (msg == waitEnergyInfoTimeout) { rnAddr = 0; updateRelayEnergy(NULL); } } else { if (msg->getArrivalGate() == gate("appGate$i")) { recvMessage((MessageCR*) msg); } else if (msg->getArrivalGate() == gate("linkGate$i")) { recvPacket((PacketEMRP*) msg); } } } NetEMRP::NetEMRP() { bsAddr = 0; rnAddr = 0; bnAddr = 0; enerRn = 0; dRnBs = 0; enerBn = 0; dBnBs = 0; radioOnTimer = new cMessage("RadioOnTimer"); initTimer = new cMessage("InitEmrpTimer"); waitEnergyInfoTimeout = new cMessage("WaitEnergyInfoTimeout"); } NetEMRP::~NetEMRP() { cancelAndDelete(radioOnTimer); cancelAndDelete(initTimer); cancelAndDelete(waitEnergyInfoTimeout); } Trang 93 Luận văn tốt nghiệp void NetEMRP::recvMessage(MessageCR *msg) { sendMsgDown(msg); } void NetEMRP::recvPacket(PacketEMRP *pkt) { StatCollector *sc = check_and_cast(getModuleByPath("sc")); if (pkt->getPkType() != PK_PAYLOAD_TO_BS || (pkt->getPkType() == PK_PAYLOAD_TO_BS && par("isBaseStation").boolValue())) { sc->incRecvPacket(); } if (pkt->getHopLimit() < 0) { StatCollector *sc = check_and_cast(getModuleByPath("sc")); sc->incLostPacket(); EV getPkType() == PK_PAYLOAD_TO_BS) { sc->incLostMTRbyNet(); } delete pkt; return; } else { pkt->setHopLimit(pkt->getHopLimit() - 1); } if (pkt->getPkType() == PK_REQ_RELAY) { if (par("isBaseStation").boolValue() || bsAddr >= || !(rnAddr > && pkt->getSrcMacAddr() == rnAddr)) { cMessage *resRelayTimer = new cMessage("ResRelayTimer"); resRelayTimer->setKind(RES_RELAY); resRelayTimer->setContextPointer(pkt->dup()); scheduleAt(simTime() + uniform(0, par("resRelayPeriod").doubleValue()), resRelayTimer); } delete pkt; } else if (pkt->getPkType() == PK_RELAY_INFO) { PacketEMRP_RelayInfo *ri = check_and_cast(pkt); if (ri->getBsFlag() == true) { bsAddr = ri->getSrcMacAddr(); } else { if (bsAddr isScheduled()) cancelEvent(waitEnergyInfoTimeout); delete pkt; } else if (pkt->getPkType() == PK_ENERGY_INFO) { Trang 94 Luận văn tốt nghiệp updateRelayEnergy(check_and_cast(pkt)); if (waitEnergyInfoTimeout->isScheduled()) cancelEvent(waitEnergyInfoTimeout); delete pkt; } else if (pkt->getPkType() == PK_PAYLOAD_TO_AN) { MessageCR *msg = (MessageCR*) pkt->decapsulate(); send(msg, "appGate$o"); delete pkt; } else if (pkt->getPkType() == PK_PAYLOAD_TO_BS) { if (par("isBaseStation").boolValue() == true) { MessageCR *msg = (MessageCR*) pkt->decapsulate(); send(msg, "appGate$o"); sendEnergyInfo(pkt->getSrcMacAddr(), 0); delete pkt; } else { int sender = pkt->getSrcMacAddr(); if (bsAddr getBitLength()); if (!waitEnergyInfoTimeout->isScheduled()) { scheduleAt(simTime() + par("waitEnergyInfoTimeout").doubleValue(), waitEnergyInfoTimeout); } pkt->setSrcMacAddr(getMacAddr()); if (bsAddr > 0) { pkt->setPreambleFlag(false); pkt->setDesMacAddr(bsAddr); } else { pkt->setDesMacAddr(rnAddr); } sendPacket(pkt); } } } } void NetEMRP::sendPacket(PacketCR *pkt) { StatCollector *sc = check_and_cast(getModuleByPath("sc")); std::cerr setPkType(PK_REQ_RELAY); pkt->setSrcMacAddr(getMacAddr()); pkt->setDesMacAddr(BROADCAST_ADDR); pkt->setByteLength(pkt->getPkSize()); sendPacket(pkt); } void NetEMRP::sendRelayInfo(PacketEMRP *reqPkt) { if (reqPkt == NULL) return; PacketEMRP_RelayInfo *pkt = new PacketEMRP_RelayInfo(); pkt->setTxType(TX_PPP); pkt->setPkType(PK_RELAY_INFO); pkt->setSrcMacAddr(getMacAddr()); pkt->setDesMacAddr(reqPkt->getSrcMacAddr()); if (par("isBaseStation").boolValue()) { pkt->setBsFlag(true); } else { pkt->setBsFlag(false); } pkt->setEnergy(((Energy*) getParentModule()->getSubmodule("energy"))>getCapacity()); Mobility *mob = (Mobility*) getParentModule()>getSubmodule("mobility"); pkt->setPosX(mob->getX()); pkt->setPosY(mob->getX()); pkt->setDBS(dBS); pkt->setByteLength(pkt->getPkSize()); sendPacket(pkt); delete reqPkt; } bool NetEMRP::considerRelay(PacketEMRP_RelayInfo *ri) { Mobility *mob = (Mobility*) getParentModule()>getSubmodule("mobility"); double dRc = distance(mob->getX(), mob->getY(), ri->getPosX(), ri>getPosY()); if (rnAddr getSrcMacAddr(); enerRn = ri->getEnergy(); dRnBs = ri->getDBS(); dRn = dRc; return true; } else { double a1 = assessRelay(enerRn, dRn, dBS, dRnBs); Trang 96 Luận văn tốt nghiệp double a2 = assessRelay(ri->getEnergy(), dRc, dBS, ri->getDBS()); if (a2 > a1) { rnAddr = ri->getSrcMacAddr(); enerRn = ri->getEnergy(); dRnBs = ri->getDBS(); dRn = dRc; return true; } else { return false; } } } bool NetEMRP::considerBackup(PacketEMRP_RelayInfo *ri) { Mobility *mob = (Mobility*) getParentModule()>getSubmodule("mobility"); double dRc = distance(mob->getX(), mob->getY(), ri->getPosX(), ri>getPosY()); if (bnAddr getSrcMacAddr(); enerBn = ri->getEnergy(); dBnBs = ri->getDBS(); dBn = dRc; return true; } else { double a1 = assessRelay(enerBn, dBn, dBS, dBnBs); double a2 = assessRelay(ri->getEnergy(), dRc, dBS, ri->getDBS()); if (a2 > a1) { bnAddr = ri->getSrcMacAddr(); enerBn = ri->getEnergy(); dBnBs = ri->getDBS(); dBn = dRc; return true; } else { return false; } } } double NetEMRP::assessRelay(double ener, double dRc, double dBs, double dRcBs) { double cosa = (dRc*dRc + dBs*dBs - dRcBs*dRcBs) / (2 * dRcBs * dBs); return ener / dRcBs * cosa; } void NetEMRP::sendEnergyInfo(int addr, int bitLen) { PacketEMRP_EnergyInfo *ei = new PacketEMRP_EnergyInfo("EnergyInfo"); ei->setTxType(TX_PPP); ei->setPkType(PK_ENERGY_INFO); ei->setSrcMacAddr(getMacAddr()); ei->setDesMacAddr(addr); Energy *energy = check_and_cast(getParentModule()>getSubmodule("energy")); ei->setRemainEnergy(energy->getCapacity()); ei->setByteLength(ei->getPkSize()); Trang 97 Luận văn tốt nghiệp sendPacket(ei); } void NetEMRP::updateRelayEnergy(PacketEMRP_EnergyInfo *ei) { if (bsAddr > 0) return; if (ei != NULL) enerRn = ei->getRemainEnergy(); if (enerRn < par("criticalEnergy").doubleValue() || rnAddr getRoutingType() == RT_TO_BS && bsAddr setContextPointer(msg); scheduleAt(simTime() + par("resRelayPeriod").doubleValue(), waitRelayMsg); requestRelay(); return; } PacketEMRP *pkt = new PacketEMRP(); if (msg->getRoutingType() == RT_TO_AN) { pkt->setTxType(TX_PPP); pkt->setPkType(PK_PAYLOAD_TO_AN); pkt->setDesMacAddr(msg->getDesMacAddr()); } else if (msg->getRoutingType() == RT_TO_BS) { pkt->setTxType(TX_PPP); pkt->setPkType(PK_PAYLOAD_TO_BS); Trang 98 Luận văn tốt nghiệp if (bsAddr > 0) { pkt->setDesMacAddr(bsAddr); } else { pkt->setDesMacAddr(rnAddr); } if (!waitEnergyInfoTimeout->isScheduled()) { scheduleAt(simTime() + par("waitEnergyInfoTimeout").doubleValue(), waitEnergyInfoTimeout); } } else if (msg->getRoutingType() == RT_BROADCAST) { pkt->setTxType(TX_BROADCAST); pkt->setPkType(PK_PAYLOAD_TO_AN); pkt->setDesMacAddr(BROADCAST_ADDR); } pkt->setSrcMacAddr(getMacAddr()); if (msg->getRoutingType() == RT_TO_BS && bsAddr > 0) { pkt->setPreambleFlag(false); } else { pkt->setPreambleFlag(msg->getPreambleFlag()); } pkt->setByteLength(pkt->getPkSize()); pkt->encapsulate(msg); sendPacket(pkt); } c) Giao thức XT-MAC: #include "linkxtmac.h" #include "packetcr_m.h" #include "app.h" #include "channelutil.h" #include "statcollector.h" Define_Module(LinkXTMAC); void LinkXTMAC::setActive() { if (radioMode == RADIO_OFF) { // Turn radio on setRadioMode(RADIO_ON); } isActive = true; if (!forcedOn) { cancelEvent(dcSleepTimer); scheduleAt(simTime() + par("activeTime"), dcSleepTimer); } updateDisplay(); } void LinkXTMAC::handleMessage(cMessage *msg) { if (msg->isSelfMessage()) { if (msg == strobeTimer) { prepareStrobe(); Trang 99 Luận văn tốt nghiệp startSending(); } else if (msg == backoffTimer) { scheduleAt(simTime() + par("ccaDur").doubleValue(), ccaTimer); } else if (msg == ccaTimer) { performCCA(); } else if (msg == releaseChannelTimer) { releaseChannel(); finishSending(); } else if (msg == rxConsumeTimer) { double period = par("rxConsumingPeriod"); useEnergyRx(period); rxConsumeTimer->setTimestamp(); scheduleAt(simTime() + period, rxConsumeTimer); } else if (msg == dcListenTimer) { setRadioMode(RADIO_ON); } else if (msg == dcSleepTimer) { if (isActive) { isActive = false; forcedOn = false; updateDisplay(); } setRadioMode(RADIO_OFF); } } else { if (msg->getArrivalGate() == gate("netGate$i")) { if (radioMode == RADIO_FULL_OFF) { delete msg; EV getArrivalGate() == gate("radioIn")) { Frame802154 *frame = check_and_cast(msg); recvFrame(frame); } } } void LinkXTMAC::setRadioMode(int mode) { Enter_Method("setRadioMode"); if (mode == RADIO_OFF || mode == RADIO_ON || mode == RADIO_FULL_OFF) { radioMode = mode; if (mode == RADIO_ON) { if (!rxConsumeTimer->isScheduled()) { rxConsumeTimer->setTimestamp(); scheduleAt(simTime() + par("rxConsumingPeriod").doubleValue(), rxConsumeTimer); } cancelEvent(dcSleepTimer); cancelEvent(dcListenTimer); Trang 100 Luận văn tốt nghiệp scheduleAt(simTime() + par("lR").doubleValue(), dcSleepTimer); } else if (mode == RADIO_OFF) { cancelEvent(strobeTimer); cancelEvent(dcSleepTimer); cancelEvent(dcListenTimer); nStrobe = 0; cPacket *pkt; while (!outQueue.isEmpty()) { pkt = outQueue.pop(); delete pkt; getParentModule()->bubble("Frame discarded"); } if (outFrame != NULL) { delete outFrame; outFrame = NULL; getParentModule()->bubble("Frame discarded"); } if (txFrame != NULL) { delete txFrame; txFrame = NULL; getParentModule()->bubble("Frame discarded"); } if (rxConsumeTimer->isScheduled()) { double onTime = SIMTIME_DBL(simTime() - rxConsumeTimer>getTimestamp()); if (onTime > 0) { useEnergyRx(onTime); } cancelEvent(rxConsumeTimer); } cancelEvent(dcListenTimer); scheduleAt(simTime() + par("sR").doubleValue(), dcListenTimer); } else if (mode == RADIO_FULL_OFF) { EV isScheduled()) { double onTime = SIMTIME_DBL(simTime() - rxConsumeTimer>getTimestamp()); if (onTime > 0) { useEnergyRx(onTime); } cancelEvent(rxConsumeTimer); } poweroff(); } } } void LinkXTMAC::poweroff() { nStrobe = 0; cancelEvent(strobeTimer); cancelEvent(dcSleepTimer); Trang 101 Luận văn tốt nghiệp cancelEvent(dcListenTimer); Link802154::poweroff(); updateDisplay(); } void LinkXTMAC::updateDisplay() { cDisplayString &ds = getParentModule()->getDisplayString(); switch (radioMode) { case RADIO_FULL_OFF: ds.setTagArg("i", 1, "black"); break; case RADIO_ON: if (isActive) { ds.setTagArg("i", 1, "green"); } else { ds.setTagArg("i", 1, "yellow"); } break; } } void LinkXTMAC::queueFrame(Frame802154 *frame) { outQueue.insert(frame); prepareSending(); } void LinkXTMAC::recvFrame(Frame802154* frame) { if (simInFrameLoss(frame)) return; // The frame is lost StatCollector *sc = check_and_cast(getModuleByPath("sc")); if (frame->getType() == FR_PAYLOAD) { setActive(); send(frame->decapsulate(), "netGate$o"); sc->incRecvFrame(); delete frame; } else if (frame->getType() == FR_PREAMBLE) { getParentModule()->bubble("Get strobe"); if (frame->getDesAddr() == macAddress) { setActive(); sendStrobeAck(frame); } else if (frame->getDesAddr() == BROADCAST_ADDR) { setActive(); } delete frame; } else if (frame->getType() == FR_PREAMBLE_ACK) { setActive(); getParentModule()->bubble("Receive strobe ACK"); nStrobe = 0; cancelEvent(strobeTimer); if (outFrame != NULL && outFrame->getType() == FR_PREAMBLE) { delete outFrame; outFrame = NULL; } if (txFrame != NULL && txFrame->getType() == FR_PREAMBLE) { cancelEvent(backoffTimer); Trang 102 Luận văn tốt nghiệp cancelEvent(ccaTimer); delete txFrame; txFrame = NULL; } startSending(); delete frame; } } void LinkXTMAC::prepareSending() { if (strobeTimer->isScheduled() || backoffTimer->isScheduled() || ccaTimer->isScheduled() || releaseChannelTimer->isScheduled()) { return; } if (!outQueue.isEmpty()) { Frame802154 *frame = check_and_cast(outQueue.front()); Packet802154 *pkt = (Packet802154*) frame>getEncapsulatedPacket(); if (frame->getType() == FR_PAYLOAD && pkt != NULL && pkt->getPreambleFlag()) { nStrobe = (int) ceil(par("sR").doubleValue() / par("strobePeriod").doubleValue()); EV setSrcAddr(macAddress); strobe->setDesAddr(payload->getDesAddr()); strobe->setByteLength( par("fldFrameControl").longValue() + par("fldSequenceId").longValue() + par("fldDesAddr").longValue() + par("fldSrcAddr").longValue() + par("fldFooter").longValue() + par("phyHeaderSize").longValue()); outQueue.insertBefore(payload, strobe); } void LinkXTMAC::sendStrobeAck(Frame802154 *strobe) { Trang 103 Luận văn tốt nghiệp if (strobe->getDesAddr() == macAddress || strobe->getDesAddr() == BROADCAST_ADDR) { EVsetType(FR_PREAMBLE_ACK); ack->setSrcAddr(macAddress); ack->setDesAddr(strobe->getSrcAddr()); ack->setByteLength( par("fldFrameControl").longValue() + par("fldSequenceId").longValue() + par("fldDesAddr").longValue() + par("fldSrcAddr").longValue() + par("fldFooter").longValue() + par("phyHeaderSize").longValue()); queueFrame(ack); } } void LinkXTMAC::finishSending() { if (nStrobe > 0) { nStrobe ; if (nStrobe > 0) { scheduleAt(simTime() + par("strobePeriod").doubleValue(), strobeTimer); } else { startSending(); } } else { prepareSending(); } } LinkXTMAC::LinkXTMAC() { isActive = true; forcedOn = false; nStrobe = 0; strobeTimer = new cMessage("StrobeTimer"); dcListenTimer = new cMessage("DcListenTimer"); dcSleepTimer = new cMessage("DcSleepTimer"); } LinkXTMAC::~LinkXTMAC() { cancelAndDelete(strobeTimer); cancelAndDelete(dcListenTimer); cancelAndDelete(dcSleepTimer); } void LinkXTMAC::forceRadioOn(double duration) { Enter_Method("forceRadioOn"); isActive = true; forcedOn = true; setRadioMode(RADIO_ON); cancelEvent(dcSleepTimer); if (duration >= 0) { Trang 104 Luận văn tốt nghiệp scheduleAt(simTime() + duration, dcSleepTimer); } updateDisplay(); } Trang 105