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) {