Đánh giá hiệu quả năng lượng của giao thức XT–MAC, B–MAC và IEEE

Một phần của tài liệu Nghiên cứu và đánh giá một số giao thức và kỹ thuật quản lý tiết kiệm năng (Trang 73 - 97)

802.15.4

Sau khi chạy mô phỏng ta thu được kết quả:

Bảng 5.3: Năng lượng còn lại của mạng khi sử dụng giao thức XT-MAC

SVTH: Khương Văn Thắng Trang 66

Bảng 5.5: Năng lượng còn lại của mạng khi sử dụng giao thức MAC chuẩn 802.15.4

Hình 5.2: Đồ thị so sánh năng lượng còn lại của 3 giao thức MAC Nhìn vào số liệu 3 bảng trên và đồ thị so sánh năng lương ta thấy:

Với hệ thống sử dụng giao thức chuẩn IEEE 802.15.4 sau khoảng 240 giây thì hệ thống đã hết năng lượng hoạt động. Sau khoảng 365 giây, năng lượng còn lại ở hệ thống là 922 J với XT_MAC và 798 J với B-MAC. Chênh lệch năng lượng

SVTH: Khương Văn Thắng Trang 67

giữa hai giao thức này là khoảng 100J hay nói cách khác, XT_MAC đạt hiệu quả năng lượng tốt hơn 12% so với B-MAC và vượt trội hoàn toàn so với IEEE 802.15.4. Điều này có thể giải thích như sau:

Giao thức MAC theo chuẩn IEEE 802.15.4 chỉ chạy CSMA/CA thuần túy. Với giao thức này các nốt mạng sẽ phải liên tục lắng nghe tín hiệu thông báo trước khi truyền, điều này dẫn đến tiêu hao năng lượng rất lớn.

Do cả B-MAC và XT-MAC cùng chạy CSMA/CA cho đa truy nhập, đều có các lớp mạng trên là như nhau nên tải lưu lượng chúng chịu cũng là như nhau. Tuy nhiên để có khả năng đánh giá chính xác trạng thái kênh truyền B-MAC sử dụng bản tin định thời dài gây ra tiêu tốn năng lượng, đặc biệt khi mạng có nhiều nút mạng. Còn đối với XT-MAC trong cơ chế truyền tin có sử dụng bản tin strobes giúp giảm thiểu trễ lan truyền và năng lượng không cần thiết. Vì vậy hiệu quả năng lượng của giao thức XT-MAC là tốt hơn so với B-MAC.

SVTH: Khương Văn Thắng Trang 68

CHƯƠNG 6 – KẾT LUẬN

Sau một quá trình nghiên cứu, luận văn của em đã được hoàn thành dưới sự hướng dẫn tận tình của TS. Trần Quang Vinh (Viện Điện tử - Viễn thông – Trường Đại học Bách Khoa Hà Nội).

Luận văn này đã đóng góp được các vấn đề chính sau đây:

Luận văn đã trình bày những lý thuyết tổng quan nhất về mạng cảm biến không dây, vấn đề về định tuyến và điều khiển truy nhập trong mạng cảm biến không dây cũng như năng lượng của hệ thống mạng cảm biến không dây. Qua đó thấy được tầm quan trọng của các kỹ thuật tiết kiệm năng lượng trong mạng cảm biến không dây. Với những lý do như vậy, luận văn đã đi vào nghiên cứu tìm hiểu về các giao thức định tuyến, giao thức điều khiển truy nhập dành cho mạng cảm biến không. Bên cạnh đó, em cũng đi sâu tìm hiểu phần mềm Omnet++ để xây dựng một kịch bản mô phỏng có thể đánh giá được hiệu quả năng lượng của các giao thưc trong mạng cảm biến không dây. Kết quả mô phỏng khẳng định giao thức XT-MAC tích hợp giao thực định tuyến EMRP có hiệu quả năng lượng tốt hơn so với các giao thức truyền thống.

Hướng phát triền của luận văn:

Do thời gian có hạn cùng với trình độ bản thân còn hạn chế, kịch bản mô phỏng chưa thực sự hoàn thiện và chưa thứ nghiệm trên nhiều mô hình mạng với kích thước và mật độ nút mạng khác nhau. Trong tương lai, em mong sẽ có thể nghiên cứu sâu thêm về các giao thức và hoàn thiện phần mềm mô phỏng có thể đánh giá được hiệu năng của các giao thức trên nhiều mặt như quỹ đạo đối tượng, trễ đầu cuối và tốc độ truyền tin

Hà nội, ngày tháng năm Học viên thực hiện

SVTH: Khương Văn Thắng Trang 69

THUẬT NGỮ TỪ VIẾT TẮT

Kí hiệu Tiếng anh Tiếng Việt

A

ARPEES Adaptive Routing Protocol with Energy-Efficiency and Event- Clustering for Wireless Sensor Networks

Giao thức định tuyến thích nghi với hiệu quả năng lượng và phân cụm theo sự kiện cho mạng cảm biến không dây

B BS BI BO Base Station Beacon interval Beacon Order Trạm gốc Khoảng mốc báo Đặ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 năng lượng

EMRP Energy-Awared Meshed Routing

Protocol

Giao thức định tuyến mạng lưới nhận biết năng lượng

G

GTS Guaranteed Time Slots Khe thời gian đảm bảo

I

SVTH: Khương Văn Thắng Trang 70

Engineers

L

LPL Listen Power Low Nghe công suất thấp

M

MAC Media Access Control Điều khiển truy nhập đa phương tiện

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 Relay Node Nút chuyển tiếp

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

SVTH: Khương Văn Thắng Trang 71

TÀI LIỆU THAM KHẢO

[1] V. Tran Quang and T. Miyoshi, “Adaptive Routing Protocol with Energy Efficiency and Event Clustering for Wireless Sensor Networks,” IEICE Transactions on Communications, vol. 91, pp. 2795–2805, 2010.

[2] T. Tran-Vinh, T. N. Quynh, and M. B. T. Quynh, “Emrp: Energy-aware mesh routing protocol for wireless sensor networks,” in Advanced Technologies for Communications (ATC), 2012 International Conference on, pp. 78–82, 2012.

[3] Quan Nguyen-Trung, Thu Ngo-Quynh, Vinh Tran-Quang, “A Low Duty-Cycle XT-MAC Protocol for Target Tracking in Wireless Sensor Networks” , 2014

[4] J. Polastre, J. Hill, and D. Culler, “Versatile low power media access for wireless sensor networks,” in Proceedings of the 2Nd International Conference on Embedded Networked Sensor Systems, ser. SenSys ’, pp. 95–107, 04, 2004.

[5] Waltenegus Dargie, Christian Poellabauer “Fundamentals of Wireless Sensor Networks” Chapter 8 Power Management, pp. 205–227, 2011.

SVTH: Khương Văn Thắng Trang 72

PHỤ LỤC

Mã nguồn C++ của thuật toán cho các giao thức thức định tuyến và giao thức MAC:

a) Giao thức định tuyến ARPEES:

#include "netarpees.h" #include "msgkind.h" #include "packetarpees_m.h" #include "energy.h" #include "mobility.h" #include "worldutil.h" #include "statcollector.h" Define_Module(NetARPEES); void NetARPEES::initialize() { }

void NetARPEES::handleMessage(cMessage *msg) {

if (msg->isSelfMessage()) {

if (msg == recvRelayInfoTimer) { sendQueuedPackets();

} else if (msg->getKind() == RES_RELAY) {

sendRelayInfo((PacketARPEES*) msg->getContextPointer()); delete msg;

} } else {

if (msg->getArrivalGate() == gate("appGate$i")) {

recvMessage((MessageCR*) msg);

} else if (msg->getArrivalGate() == gate("linkGate$i")) {

recvPacket((PacketARPEES*) msg); } } } NetARPEES::NetARPEES() { bsAddr = 0; rnAddr = 0;

recvRelayInfoTimer = new cMessage("RecvRelayInfoTimer"); }

NetARPEES::~NetARPEES() {

cancelAndDelete(recvRelayInfoTimer); }

void NetARPEES::recvMessage(MessageCR* msg) {

SVTH: Khương Văn Thắng Trang 73

outQueue.insert(createPacket(msg)); if (!recvRelayInfoTimer->isScheduled()) { if (msg->getRoutingType() == RT_TO_BS) { rnAddr = 0;

requestRelay();

scheduleAt(simTime() + par("resRelayPeriod").doubleValue(),

recvRelayInfoTimer); } else { sendQueuedPackets(); } } }

void NetARPEES::recvPacket(PacketARPEES* pkt) {

StatCollector *sc =

check_and_cast<StatCollector*>(getModuleByPath("sc")); if (pkt->getPkType() != PK_PAYLOAD_TO_BS

|| (pkt->getPkType() == PK_PAYLOAD_TO_BS &&

par("isBaseStation").boolValue())) { sc->incRecvPacket(); } if (pkt->getHopLimit() < 0) { sc->incLostPacket(); delete pkt; return; } else { pkt->setHopLimit(pkt->getHopLimit() - 1); } if (pkt->getPkType() == PK_REQ_RELAY) {

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) { if (recvRelayInfoTimer->isScheduled()) { PacketARPEES_RelayInfo *ri = check_and_cast<PacketARPEES_RelayInfo*>(pkt); if (ri->getBsFlag() == true) { bsAddr = ri->getSrcMacAddr(); } else { if (bsAddr <= 0) { considerRelay(ri); } } } delete pkt;

} else if (pkt->getPkType() == PK_PAYLOAD_TO_AN) { MessageCR *msg = (MessageCR*) pkt->decapsulate(); send(msg, "appGate$o");

SVTH: Khương Văn Thắng Trang 74

delete pkt;

} else if (pkt->getPkType() == PK_PAYLOAD_TO_BS) { if (par("isBaseStation").boolValue() == true) { MessageCR *msg = (MessageCR*) pkt->decapsulate(); send(msg, "appGate$o"); delete pkt; } else { pkt->setSrcMacAddr(getMacAddr()); outQueue.insert(pkt); if (!recvRelayInfoTimer->isScheduled()) { rnAddr = 0; requestRelay(); scheduleAt(simTime() +

par("resRelayPeriod").doubleValue(), recvRelayInfoTimer); }

} } }

void NetARPEES::sendPacket(PacketCR *pkt) {

StatCollector *sc =

check_and_cast<StatCollector*>(getModuleByPath("sc")); if (pkt->getHopLimit() > 0) {

send(pkt, "linkGate$o"); } else {

EV << "NetARPEES: Hop limit exceeded\n"; sc->incLostPacket(); delete pkt; }

}

PacketARPEES* NetARPEES::createPacket(MessageCR *msg) {

if (msg == NULL) return NULL; PacketARPEES *pkt; pkt = new PacketARPEES(); 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);

} else if (msg->getRoutingType() == RT_BROADCAST) { pkt->setTxType(TX_BROADCAST); pkt->setPkType(PK_PAYLOAD_TO_AN); } pkt->setSrcMacAddr(getMacAddr()); pkt->setPreambleFlag(msg->getPreambleFlag()); pkt->setByteLength(pkt->getPkSize()); pkt->encapsulate(msg); return pkt; } void NetARPEES::sendQueuedPackets() {

SVTH: Khương Văn Thắng Trang 75

PacketARPEES *pkt;

while (!outQueue.isEmpty()) {

pkt = check_and_cast<PacketARPEES*>(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 << "NetARPEES: Cannot send packet. There is no relay node."; delete pkt; continue; } } sendPacket(pkt); } rnAddr = 0; } void NetARPEES::requestRelay() {

PacketARPEES_RelayReq *pkt = new PacketARPEES_RelayReq(); pkt->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");

SVTH: Khương Văn Thắng Trang 76

double dRc = distance(mob->getX(), mob->getY(), ri->getPosX(), ri- >getPosY()); if (rnAddr <= 0) { rnAddr = ri->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) {

SVTH: Khương Văn Thắng Trang 77

Link802154 *link =

check_and_cast<Link802154*>(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 > 0 || rnAddr > 0) {

sendMsgDown((MessageCR*) msg->getContextPointer()); } else {

EV << "Error: Cannot send data to BS now\n";

StatCollector *sc =

check_and_cast<StatCollector*>(getModuleByPath("sc")); sc->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); }

SVTH: Khương Văn Thắng Trang 78

void NetEMRP::recvMessage(MessageCR *msg) {

sendMsgDown(msg); }

void NetEMRP::recvPacket(PacketEMRP *pkt) {

StatCollector *sc =

check_and_cast<StatCollector*>(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<StatCollector*>(getModuleByPath("sc")); sc->incLostPacket();

EV << "NetEMRP::recvPacket: out of date packet\n"; if (pkt->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 >= 0

|| !(rnAddr > 0 && 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<PacketEMRP_RelayInfo*>(pkt); if (ri->getBsFlag() == true) { bsAddr = ri->getSrcMacAddr(); } else { if (bsAddr <= 0) {

bool ret = considerRelay(ri);

if (!ret) considerBackup(ri); } } if (waitEnergyInfoTimeout->isScheduled()) cancelEvent(waitEnergyInfoTimeout); delete pkt;

SVTH: Khương Văn Thắng Trang 79

updateRelayEnergy(check_and_cast<PacketEMRP_EnergyInfo*>(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 <= 0 && (rnAddr <= 0 || pkt->getSrcMacAddr() ==

rnAddr)) {

EV << "NetEMRP: Cannot forward packet, deadend!\n"; rnAddr = 0; updateRelayEnergy(NULL); delete pkt; sc->incLostMTRbyNet(); } else { sendEnergyInfo(sender, pkt->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<StatCollector*>(getModuleByPath("sc")); std::cerr << "NetEMRP::sendPacket: " << simTime() << ' ' << pkt->getPkType() << ' ' << pkt->getSrcMacAddr() << ' ' << pkt-> getDesMacAddr() << '\n'; if (pkt->getHopLimit() > 0) { send(pkt, "linkGate$o"); } else {

EV << "NetEMRP: Hop limit exceeded\n"; sc->incLostPacket();

SVTH: Khương Văn Thắng Trang 80 if (pkt->getPkType() == PK_PAYLOAD_TO_BS) { sc->incLostMTRbyNet(); } delete pkt; } }

void NetEMRP::requestRelay(bool init) {

PacketEMRP *pkt = new PacketEMRP(); pkt->setTxType(TX_BROADCAST); pkt->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 <= 0) { rnAddr = ri->getSrcMacAddr(); enerRn = ri->getEnergy(); dRnBs = ri->getDBS(); dRn = dRc; return true; } else {

SVTH: Khương Văn Thắng Trang 81

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 <= 0) { bnAddr = ri->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<Energy*>(getParentModule()- >getSubmodule("energy"));

ei->setRemainEnergy(energy->getCapacity()); ei->setByteLength(ei->getPkSize());

SVTH: Khương Văn Thắng Trang 82

sendPacket(ei); }

void NetEMRP::updateRelayEnergy(PacketEMRP_EnergyInfo *ei) {

if (bsAddr > 0) return;

if (ei != NULL) enerRn = ei->getRemainEnergy();

if (enerRn < par("criticalEnergy").doubleValue() || rnAddr <= 0) { if (enerBn < par("criticalEnergy").doubleValue() || bnAddr <= 0) { requestRelay(false); } else { switchRN(); } return;

} else if (enerBn - enerRn > par("switchingEnergy").doubleValue()) { switchRN(); } } void NetEMRP::switchRN() { int tempi; double tempd; tempi = rnAddr; rnAddr = bnAddr; bnAddr = tempi; tempd = enerRn; enerRn = enerBn; enerBn = tempd; tempd = dRnBs; dRnBs = dBnBs; dBnBs = tempd; tempd = dRn; dRn = dBn; dBn = tempd; }

void NetEMRP::sendMsgDown(MessageCR *msg) {

if (msg->getRoutingType() == RT_TO_BS && bsAddr <= 0 && rnAddr <= 0) {

cMessage *waitRelayMsg = new cMessage("WaitRelayMsg"); waitRelayMsg->setKind(EMRP_WAIT_RELAY);

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

SVTH: Khương Văn Thắng Trang 83 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();

SVTH: Khương Văn Thắng Trang 84

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 << "Error: Out of energy\n"; } else {

setActive();

queueFrame(createFrame((Packet802154*) msg));

}

} else if (msg->getArrivalGate() == gate("radioIn")) { Frame802154 *frame = check_and_cast<Frame802154*>(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);

SVTH: Khương Văn Thắng Trang 85

scheduleAt(simTime() + par("lR").doubleValue(),

dcSleepTimer);

} else if (mode == RADIO_OFF) {

Một phần của tài liệu Nghiên cứu và đánh giá một số giao thức và kỹ thuật quản lý tiết kiệm năng (Trang 73 - 97)

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

(97 trang)