Для рассмотрения влияния помех мы определили в настройках моделирования конфигурацию varySigma, при которой будет запущено моделирование с вариацией этого параметра (SN.wirelessChannel.sigma = ${Sigma=0,1,3,5})
На рисунках 29-32 показано как меняется надежность доставки пакетов в зависимости от уровня помех. По оси абсцисс номера узлов, по оси ординат вероятности, а цветами обозначены состояния пакетов. Видна тенденция, что с возрастанием уровня помех возрастает вероятность доставки пакетов. Это может быть обусловлено хорошими алгоритмами канального уровня.
Рисунок 29 Количество пакетов при Sigma 0
Рисунок 30 Количество пакетов при Sigma 1
Рисунок 31 Количество пакетов при Sigma 3
Рисунок 32 Количество пакетов при Sigma 5
Заключение
В данной работе были рассмотрены математические методы оценки надежности беспроводных сенсорных сетей, выполнен обзор и анализ программных продуктов, предназначенных для имитационного моделирования таких сетей. На основании анализа и в соответствии с поставленными целями работы была выбрана система моделирования Castalia, для которой были разработаны модули, позволяющие выполнить моделирование влияния помех и мощности передачи радиосигнала на надежность передачи пакета данных между двумя узлами и надежность сбора информации беспроводной сенсорной сетью. Результаты моделирования представлены в виде таблиц, графиков и диаграмм.
На основе проведенных исследований сделаны следующие выводы: при оценке надежности передачи пакета данных между двумя узлами с увеличением уровня помех до определенного значения сильного падения надежности не происходит, надежность связи между узлами зависит от топологии, уровень мощности сигнала не влияет существенно на надежность; при оценке надежности сбора информации сетью для рассмотренной сети колебания надежности не столь существенны при различных уровнях помех, что может быть обусловлено хорошими алгоритмами канального уровня.
Полученные результаты в целом соответствуют результатам других исследователей. [16].
В процессе работы были подготовлены и приняты в печать тезисы доклада «Исследование энергоэффективности алгоритмов маршрутизации в беспроводных сенсорных сетях» на объединенную научнуюконференциюстудентов и аспирантов факультета компьютерных технологий и прикладной математики «Прикладная математика XXI века», проходившую в Краснодаре, 9–12 апреля 2013 г.
Библиографический список
1. Castalia Installation Guide URL: http://castalia.research.nicta.com.au/pdfs/Castalia%20-%20Installation.pdf
2. Castalia official site URL: http://castalia.research.nicta.com.au/
3. Castalia User's manual URL:http://castalia.research.nicta.com.au/pdfs/Castalia%20-%20User%20Manual.pdf
4. Chandra T.D., Toueg S. Unreliable failure detectors for reliable distributed systems. // J. ACM. 1996. V. 43. P. 225-267.
5. Delporte-Gallet C., Devismes S., Fauconnier H. Stabilizing leader election in partial synchronous systems with crash failures. // J. Parallel Distrib. Comput. – 2010. – 70. – P. 45 – 58.
6. E. Egea-López, J. Vales-Alonso, A. S. Martínez-Sala, P. Pavón-Mariño, J. García-Haro Simulation Tools for Wireless Sensor Networks // Summer Simulation Multiconference - SPECTS 2005 // – 2005. – P. 2 – 9.
7. Ezio Biglieri Coding for Wireless Channels (Information Technology: Transmission, Processing and Storage) –2005. – P. 428.
8. Fei Yu A Survey of Wireless Sensor Network Simulation Tools URL: http://www1.cse.wustl.edu/~jain/cse567-11/ftp/sensor/index.html
9. Fischer M.J., Lynch N.A., Paterson M.S. Impossibility of distributed consensus with one faulty process. // J. ACM. 1985. V 32. P. 374-382.
10. Garay J.A., Perry K.J. A continuum of failure models for distributed computing. // Proc. 6nd Int. Workshop on Distributed Algorithms (Haifa, 1992) / S. Zaks, A. Segall (eds.). P. 153-156.
11. IEEE Standards 802.15.4. Wireless Medium Access Control (MAC) and Physical Layer (PHY) Specifications for Low-Rate Wireless Personal Area Networks (LR-WPANs). — IEEE Computer Society, 2003.
12. Luis Javier García Villalba , Ana Lucila Sandoval Orozco, Alicia Triviño Cabrera, Cláudia Jacy Barenco Abbas Routing Protocols in Wireless Sensor Networks // Sensors // – 2009 – 9 – P. 399 – 421.
13. Pease M., Shostak R., Lamport L. Reaching agreement in the presence of faults. // J. ACM. 1984. V. 27. P. 228-234.
14. Roya N., Gub T., Das S.K. Supporting pervasive computing applications with active context fusion and semantic context delivery. // Pervasive and Mobile Computing – 2010. – 6. – P. 21 – 42.
15. Zhang M., Chan M.C., Ananda A.L. Connectivity monitoring in wireless sensor networks. // Pervasive and Mobile Computing – 2010. – 6. – P. 112 – 127.
16. Акимов Е.В., Кузнецов М.Н. Вероятностные математические модели для оценки надежности беспроводных сенсорных сетей // Электронный журнал «Труды МАИ». Выпуск № 40// URL: http://www.mai.ru/science/trudy/
17. Ахо А., Хопкрофт Д., Ульман Д. Структуры данных и алгоритмы. – М.: Вильямс, 2000. — 384 с.
18. Гейер Дж. Беспроводные сети. Первый шаг. / Пер. с англ. – М.: Вильямc, 2005. – 192 с.
19. Дейтел Х., Дейтел П. Как программировать на С++. – М.: Бином-Пресс, 2008. – 1446 с.
20. Нечаев Д.Ю., Чекмарев Ю.В. Надежность информационных систем. – М.: ДМК Пресс, 2012. – 64 с.
21. Острейковский В.А. Теория надежности. – М.: Высшая школа, 2000. – 464 с.
22. Острейковский В.А. Теория надежности. Учебник для вузов. – М.: Высшая школа, 2003. – 457 с.
23. Половко А.М., Гуров С. В. Основы теории надежности. – СПб.: БХВ-Петербург 2006. – 560 с.
24. Смелянский Р. Л. Компьютерные сети. В 2 томах. Том 1. Системы передачи данных. – М.: Академия, 2011. – 304 с.
25. Страуструп Б. Язык программирования С++. – М.: Бином, 2008. – 1104 с.
26. Тель Ж. Введение в распределенные алгоритмы. Пер. с англ. В. А. Захарова. – М.: МЦНМО, 2009. – 616 с.
27. Ушаков И.А. Вероятностные модели надежности информационно-вычислительных систем. – М.: Радио и связь 1991. – 132 с.
28. Хьюз К., Хьюз Т. Параллельное и распределенное программирование на С++. Пер. с англ. – М.: Издательский дом Вильямс, 2004. – 672 с.
29. Шахнович И.А.Современные технологии беспроводной связи. – М.: Техносфера, 2006. – 288 с.
30. Шубин В.И., Красильникова О. С. Беспроводные сети передачи данных. – М.: Вузовская книга, 2012. – 104 с.
31. Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного программирования. Пер. с англ. – М.: Издательский дом Вильямс, 2003. – 512 с.
Приложение А
Текстфайла omnetpp.ini.
[General]
include ../Parameters/Castalia.ini
sim-time-limit = 100s
SN.field_x = 30# meters
SN.field_y = 30# meters
SN.numNodes = 9
SN.deployment = "3x3"
# Removing variability from wireless channel
SN.wirelessChannel.bidirectionalSigma = 0
SN.wirelessChannel.sigma = 0
# Select a Radio and a default Tx power
SN.node[*].Communication.Radio.RadioParametersFile = "../Parameters/Radio/CC2420.txt"
SN.node[*].Communication.Radio.TxOutputPower = "-5dBm"
SN.node[*].ApplicationName = "interNodes"
[Config varyTxPower]
SN.node[*].Communication.Radio.TxOutputPower = ${TXpower="0dBm","-1dBm","-3dBm","-5dBm"}
[Config varySigma]
SN.wirelessChannel.sigma = ${Sigma=0,1,3,5}
Текстфайла interNodes.ned
simple interNodes like node.application.iApplication {
parameters:
string applicationID = default ("interNodes");
bool collectTraceInfo = default (false);
int packetHeaderOverhead = default (8);
int priority = default (1);
int constantDataPayload = default (8);
int packetSpacing = default (100);// ms
int packetsPerNode = default (100);
int packetSize = default (32);// bytes
gates:
output toCommunicationModule;
output toSensorDeviceManager;
input fromCommunicationModule;
input fromSensorDeviceManager;
input fromResourceManager;
}
Текстфайла interNodes.h
#ifndef _INTERNODES_H_
#define _INTERNODES_H_
#include "VirtualApplication.h"
using namespace std;
struct neighborRecord {
int id;
int timesRx;
int receivedPackets;
};
enum interNodesTimers {
SEND_PACKET = 1,
};
class interNodes: public VirtualApplication {
private:
// parameters and variables
int priority;
int packetHeaderOverhead;
bool printConnMap;
int constantDataPayload;
double packetSpacing;
int packetsPerNode;
int packetSize;
vector<neighborRecord> neighborTable;
int packetsSent;
int serialNumber;
int totalSNnodes;
double txInterval_perNode;
double txInterval_total;
protected:
void startup();
void finishSpecific();
void fromNetworkLayer(ApplicationPacket *, const char *, double, double);
void timerFiredCallback(int);
void updateNeighborTable(int nodeID, int theSN);
};
#endif
Текстфайла interNodes.cc
#include "interNodes.h"
Define_Module(interNodes);
void interNodes::startup()
{
packetSpacing = (double)par("packetSpacing") / 1000.0;
packetsPerNode = par("packetsPerNode");
packetSize = par("packetSize");
neighborTable.clear();
packetsSent = 0;
totalSNnodes = getParentModule()->getParentModule()->par("numNodes");
txInterval_perNode = packetsPerNode * packetSpacing;
txInterval_total = (txInterval_perNode * totalSNnodes);
if (strtod(ev.getConfig()->getConfigValue("sim-time-limit"), NULL) < txInterval_total) {
trace() << "ERROR: Total sim time should be at least = " << txInterval_total;
opp_error("\nError: simulation time not large enough for the conectivity map application\n");
}
double startTxTime = txInterval_perNode * self;
setTimer(SEND_PACKET, startTxTime);
}
void interNodes::fromNetworkLayer(ApplicationPacket * rcvPacket, const char *source, double rssi, double lqi)
{
updateNeighborTable(atoi(source), rcvPacket->getSequenceNumber());
}
void interNodes::timerFiredCallback(int timerIndex)
{
switch (timerIndex) {
case SEND_PACKET:{
if (packetsSent >= packetsPerNode)
break;
toNetworkLayer(createGenericDataPacket(0.0, packetsSent, packetSize), BROADCAST_NETWORK_ADDRESS);
packetsSent++;
setTimer(SEND_PACKET, packetSpacing);
break;
}
}
}
void interNodes::finishSpecific()
{
declareOutput("Packets received");
for (int i = 0; i < (int)neighborTable.size(); i++) {
collectOutput("Packets received", neighborTable[i].id,
"Success", neighborTable[i].receivedPackets);
}
}
void interNodes::updateNeighborTable(int nodeID, int serialNum)
{
int i = 0, pos = -1;
int tblSize = (int)neighborTable.size();
for (i = 0; i < tblSize; i++)
if (neighborTable[i].id == nodeID)
pos = i;
if (pos == -1) {
neighborRecord newRec;
newRec.id = nodeID;
newRec.timesRx = 1;
if ((serialNum >= 0) && (serialNum < packetsPerNode))
newRec.receivedPackets = 1;
neighborTable.push_back(newRec);
} else {
neighborTable[pos].timesRx++;
if ((serialNum >= 0) && (serialNum < packetsPerNode))
neighborTable[pos].receivedPackets++;
}
}
ПриложениеБ
ТекстфайлаDataToSink.ned
package node.application.DataToSink;
simple DataToSink like node.application.iApplication {
parameters:
string applicationID = default ("DataToSink");
bool collectTraceInfo = default (true);
int priority = default (1);
int packetHeaderOverhead = default (8);// in bytes
int constantDataPayload = default (12);// in bytes
int maxSampleInterval = default (60000);// in msec
int minSampleInterval = default (1000);// in msec
bool isSink = default (false);
gates:
output toCommunicationModule;
output toSensorDeviceManager;
input fromCommunicationModule;
input fromSensorDeviceManager;
input fromResourceManager;
}
ТекстфайлаDataToSink.h
#ifndef _DATATOSINK_H_
#define _DATATOSINK_H_
#include "VirtualApplication.h"
#include "Packet_m.h"
using namespace std;
enum DataToSinkTimers {
REQUEST_SAMPLE = 1,
SEND_DATA = 2,
};
class DataToSink: public VirtualApplication {
private:
double maxSampleInterval;
double minSampleInterval;
int routingLevel;
double lastSensedValue;
int currSentSampleSN;
double randomBackoffIntervalFraction;
bool sentOnce;
protected:
void startup();
void fromNetworkLayer(ApplicationPacket *, const char *, double, double);
void handleSensorReading(SensorReadingMessage *);
void timerFiredCallback(int);
};
#endif
ТекстфайлаDataToSink.cc
#include "DataToSink.h"
Define_Module(DataToSink);
void DataToSink::startup()
{
maxSampleInterval = ((double)par("maxSampleInterval")) / 1000.0;
minSampleInterval = ((double)par("minSampleInterval")) / 1000.0;
currSentSampleSN = 0;
randomBackoffIntervalFraction = genk_dblrand(0);
sentOnce = false;
setTimer(REQUEST_SAMPLE, maxSampleInterval * randomBackoffIntervalFraction);
}
void DataToSink::timerFiredCallback(int index)
{
switch (index) {
case REQUEST_SAMPLE:{
requestSensorReading();
setTimer(REQUEST_SAMPLE, maxSampleInterval);
break;
}
}
}
void DataToSink::fromNetworkLayer(ApplicationPacket * genericPacket,
const char *source, double rssi, double lqi)
{
DataToSinkDataPacket *rcvPacket = check_and_cast<DataToSinkDataPacket*>(genericPacket);
ValueReportData theData = rcvPacket->getExtraData();
if (isSink)
trace() << "Sink received from: " << theData.nodeID << " \tvalue=" << rcvPacket->getData();
}
void DataToSink::handleSensorReading(SensorReadingMessage * rcvReading)
{
// int sensIndex =rcvReading->getSensorIndex();
// string sensType(rcvReading->getSensorType());
double sensValue = rcvReading->getSensedValue();
// schedule the TX of the value
trace() << "Sensed = " << sensValue;
ValueReportData tmpData;
tmpData.nodeID = (unsigned short)self;
tmpData.locX = mobilityModule->getLocation().x;
tmpData.locY = mobilityModule->getLocation().y;
DataToSinkDataPacket *packet2Net =
new DataToSinkDataPacket("Value reporting pck", APPLICATION_PACKET);
packet2Net->setExtraData(tmpData);
packet2Net->setData(sensValue);
packet2Net->setSequenceNumber(currSentSampleSN);
currSentSampleSN++;
toNetworkLayer(packet2Net, SINK_NETWORK_ADDRESS);
sentOnce = true;
}
ТекстфайлаMultipathRingsRouting.ned
package node.communication.routing.multipathRingsRouting;
simple MultipathRingsRouting like node.communication.routing.iRouting {
parameters:
bool collectTraceInfo = default (false);
int maxNetFrameSize = default (0);// bytes, 0 means no limit
int netBufferSize = default (32);// number of messages
int netDataFrameOverhead = default (14);// bytes
int mpathRingsSetupFrameOverhead = default (13);// bytes
int netSetupTimeout = default (50);// msec
gates:
output toCommunicationModule;
output toMacModule;
input fromCommunicationModule;
input fromMacModule;
input fromCommModuleResourceMgr;
}
ТекстфайлаMultipathRingsRouting.h
#ifndef _MULTIPATHRINGSROUTING_H_
#define _MULTIPATHRINGSROUTING_H_
#include <map>
#include "VirtualRouting.h"
#include "MultipathRingsRoutingPacket_m.h"
#include "MultipathRingsRoutingControl_m.h"
#define NO_LEVEL-110
#define NO_SINK-120
using namespace std;
enum MultipathRingsRoutingTimers {
TOPOLOGY_SETUP_TIMEOUT = 1,
};
class MultipathRingsRouting: public VirtualRouting {
private:
int mpathRingsSetupFrameOverhead;// in bytes
double netSetupTimeout;
// multipathRingsRouting-related member variables
int currentSequenceNumber;
int currentSinkID;
int currentLevel;
int tmpSinkID;
int tmpLevel;
bool isSink;//is a .ned file parameter of the Application module
bool isConnected;//attached under a parent node
bool isScheduledNetSetupTimeout;
protected:
void startup();
void fromApplicationLayer(cPacket *, const char *);
void fromMacLayer(cPacket *, int, double, double);
void sendTopologySetupPacket();
void sendControlMessage(multipathRingsRoutingControlDef);
void timerFiredCallback(int);
void processBufferedPacket();
};
ТекстфайлаMultipathRingsRouting.cc
#include "MultipathRingsRouting.h"
Define_Module(MultipathRingsRouting);
void MultipathRingsRouting::startup()
{
netSetupTimeout = (double)par("netSetupTimeout") / 1000.0;
mpathRingsSetupFrameOverhead = par("mpathRingsSetupFrameOverhead");
// check that the Application module used has the boolean parameter "isSink"
cModule *appModule = getParentModule()->getParentModule()->getSubmodule("Application");
if (appModule->hasPar("isSink"))
isSink = appModule->par("isSink");
else
opp_error("\nMultiPathRings routing has to be used with an application that defines the parameter isSink");
currentLevel = tmpLevel = isSink ? 0 : NO_LEVEL;
currentSinkID = tmpSinkID = isSink ? self : NO_SINK;
isConnected = (isSink) ? true : false;
isScheduledNetSetupTimeout = false;
currentSequenceNumber = 0;
if (isSink)
sendTopologySetupPacket();
}
void MultipathRingsRouting::sendTopologySetupPacket()
{
MultipathRingsRoutingPacket *setupPkt =
new MultipathRingsRoutingPacket("Multipath rings routing setup packet", NETWORK_LAYER_PACKET);
setupPkt->setMultipathRingsRoutingPacketKind(MPRINGS_TOPOLOGY_SETUP_PACKET);
setupPkt->setSource(SELF_NETWORK_ADDRESS);
setupPkt->setDestination(BROADCAST_NETWORK_ADDRESS);
setupPkt->setSinkID(currentSinkID);
setupPkt->setSenderLevel(currentLevel);
toMacLayer(setupPkt, BROADCAST_MAC_ADDRESS);
}
void MultipathRingsRouting::sendControlMessage(multipathRingsRoutingControlDef kind)
{
MultipathRingsRoutingControlMessage *ctrlMsg =
new MultipathRingsRoutingControlMessage("Multipath routing control message",NETWORK_CONTROL_MESSAGE);
ctrlMsg->setMultipathRingsRoutingControlMessageKind(kind);
ctrlMsg->setLevel(currentLevel);
ctrlMsg->setSinkID(currentSinkID);
toApplicationLayer(ctrlMsg);
}
void MultipathRingsRouting::timerFiredCallback(int index)
{
if (index != TOPOLOGY_SETUP_TIMEOUT)
return;
isScheduledNetSetupTimeout = false;
if (tmpLevel == NO_LEVEL) {
setTimer(TOPOLOGY_SETUP_TIMEOUT, netSetupTimeout);
isScheduledNetSetupTimeout = true;
} else if (currentLevel == NO_LEVEL) {
//Broadcast to all nodes of currentLevel-1
currentLevel = tmpLevel + 1;
currentSinkID = tmpSinkID;
if (!isConnected) {
isConnected = true;
sendControlMessage(MPRINGS_CONNECTED_TO_TREE);
trace() << "Connected to " << currentSinkID << " at level " << currentLevel;
if (!TXBuffer.empty())
processBufferedPacket();
} else {
sendControlMessage(MPRINGS_TREE_LEVEL_UPDATED);
trace() << "Reconnected to " << currentSinkID << " at level " << currentLevel;
}
sendTopologySetupPacket();
}
tmpLevel = isSink ? 0 : NO_LEVEL;
tmpSinkID = isSink ? self : NO_SINK;
}
void MultipathRingsRouting::processBufferedPacket()
{
while (!TXBuffer.empty()) {
toMacLayer(TXBuffer.front(), BROADCAST_MAC_ADDRESS);
TXBuffer.pop();
}
}
void MultipathRingsRouting::fromApplicationLayer(cPacket * pkt, const char *destination)
{
string dst(destination);
MultipathRingsRoutingPacket *netPacket =
new MultipathRingsRoutingPacket("Multipath rings routing data packet", NETWORK_LAYER_PACKET);
netPacket->setMultipathRingsRoutingPacketKind(MPRINGS_DATA_PACKET);
netPacket->setSource(SELF_NETWORK_ADDRESS);
netPacket->setDestination(destination);
netPacket->setSinkID(currentSinkID);
netPacket->setSenderLevel(currentLevel);
encapsulatePacket(netPacket, pkt);
if (dst.compare(SINK_NETWORK_ADDRESS) == 0 || dst.compare(PARENT_NETWORK_ADDRESS) == 0) {
netPacket->setSequenceNumber(currentSequenceNumber);
currentSequenceNumber++;
if (bufferPacket(netPacket)) {
if (isConnected)
processBufferedPacket();
else
sendControlMessage(MPRINGS_NOT_CONNECTED);
} else {
//Here we could send a control message to upper layer informing that our buffer is full
}
} else {//++++ need to control flooding
toMacLayer(netPacket, BROADCAST_MAC_ADDRESS);
}
}
void MultipathRingsRouting::fromMacLayer(cPacket * pkt, int macAddress, double rssi, double lqi)
{
MultipathRingsRoutingPacket *netPacket = dynamic_cast <MultipathRingsRoutingPacket*>(pkt);
if (!netPacket)
return;
switch (netPacket->getMultipathRingsRoutingPacketKind()) {
case MPRINGS_TOPOLOGY_SETUP_PACKET:{
if (isSink)
break;
if (!isScheduledNetSetupTimeout) {
isScheduledNetSetupTimeout = true;
setTimer(TOPOLOGY_SETUP_TIMEOUT, netSetupTimeout);
tmpLevel = NO_LEVEL;
tmpSinkID = NO_SINK;
}
if (tmpLevel == NO_LEVEL || tmpLevel > netPacket->getSenderLevel()) {
tmpLevel = netPacket->getSenderLevel();
tmpSinkID = netPacket->getSinkID();
}
break;
}
case MPRINGS_DATA_PACKET:{
string dst(netPacket->getDestination());
string src(netPacket->getSource());
int senderLevel = netPacket->getSenderLevel();
int sinkID = netPacket->getSinkID();
if (dst.compare(BROADCAST_NETWORK_ADDRESS) == 0 ||
dst.compare(SELF_NETWORK_ADDRESS) == 0) {
// We are not filtering packets that are sent to this node directly or to
// broadcast network address, making application layer responsible for them
toApplicationLayer(pkt->decapsulate());
} else if (dst.compare(SINK_NETWORK_ADDRESS) == 0) {
if (senderLevel == currentLevel + 1) {
if (self == sinkID) {
// Packet is for this node, if filter passes, forward it to application
if (isNotDuplicatePacket(pkt))
toApplicationLayer(decapsulatePacket(pkt));
else
trace() << "Discarding duplicate packet from node " << src;
} else if (sinkID == currentSinkID) {
// We want to rebroadcast this packet since we are not its destination
// For this, a copy of the packet is created and sender level field is
// updated before calling toMacLayer() function
MultipathRingsRoutingPacket *dupPacket = netPacket->dup();
dupPacket->setSenderLevel(currentLevel);
toMacLayer(dupPacket, BROADCAST_MAC_ADDRESS);
}
}
} else if (dst.compare(PARENT_NETWORK_ADDRESS) == 0) {
if (senderLevel == currentLevel + 1 && sinkID == currentSinkID) {
// Packet is for this node, if filter passes, forward it to application
if (isNotDuplicatePacket(pkt))
toApplicationLayer(decapsulatePacket(pkt));
else
trace() << "Discarding duplicate packet from node " << src;
}
}
break;
}
}
}
Текстфайла omnetpp.ini.
[General]
include ../Parameters/Castalia.ini
sim-time-limit = 600s
SN.field_x = 100# meters
SN.field_y = 100# meters
SN.numNodes = 36
SN.deployment = "6x6"
SN.node[*].Communication.Radio.RadioParametersFile = "../Parameters/Radio/CC2420.txt"
SN.node[*].Communication.RoutingProtocolName = "MultipathRingsRouting"
SN.node[*].Communication.MACProtocolName = "TMAC"
SN.node[*].ApplicationName = "DataToSink"
SN.node[*].Communication.Routing.collectTraceInfo = true
SN.node[3].Application.isSink = true
[Config varyTxPower]
SN.node[*].Communication.Radio.TxOutputPower = ${TXpower="0dBm","-1dBm","-3dBm","-5dBm"}
[Config varySigma]
SN.wirelessChannel.sigma = ${Sigma=0,1,3,5}
Размещено на Allbest.ru
Дата: 2019-05-29, просмотров: 227.