Bu çalışmada Ad-Hoc modunda çalışan bir 802.11 modülünün haberleşme halinde iken kanal değiştirme senaryosunu gerçekleştireceğiz. Kanal değişimini ise Omnet++ ortamında C++ ile yazdığımız kod parçası sayesinde gerçekleştireceğiz.
Gelelim Senaryomuza: 802.11 alt yapısını kullanrak Ad-Hoc modda UDP haberleşmesi yapan iki adet cihazımız var. Bu iki cihazda mobileHost[0] 100 ms aralılarla 1000Bayt lık bir UDP paketi gönderiyor. 100 saniye süren simulasyon boyunca 10 saniye aralılarla göndericinin MAC katmanında kanalı değiştiriliyor. Kanal haberleşmenin olduğu 5. kanalda başlarken 10 saniye aralıklarla 5. ve 0. kanal arasında değiştiriliyor.
## file name: omnetpp.ini
sim-time-limit = 100s
**.mobileHost[0].numApps = 1
**.mobileHost[0].app[0].typename = "UdpBasicApp"
**.mobileHost[0].app[0].destAddresses = "mobileHost[1]"
**.mobileHost[0].app[0].destPort = 1000
**.mobileHost[0].app[0].messageLength = 1000B
**.mobileHost[0].app[0].sendInterval = 0.1s
**.mobileHost[1].numApps = 1
**.mobileHost[1].app[0].typename = "UdpSink"
**.mobileHost[1].app[0].localPort = 1000
**.mobileHost[*].wlan[0].radio.channelNumber = 5
Kanal değiştirme.
802.11 de oluğu gibi omnet oratamında kanal değiştirme 2. katmanda yönetiliyor. Mac katmanında oluşturulan “physicallayer::Ieee80211ConfigureRadioCommand” mesajnı radyo modülüne göndererek yapılır. Komutta kanal numarası alanı istenilen kanal olarak atanır ve oluşturulacak Request’e ControlInfo olarak eklenir ve gönderilir.
void Ieee80211Mac::handleSelfMessage(cMessage *msg)
{
//ASSERT(false);
Ieee80211Radio * myradio = check_and_cast<Ieee80211Radio *>(this->radio);
Ieee80211TransmitterBase *ieee80211Transmitter = const_cast<Ieee80211TransmitterBase *>(check_and_cast<const Ieee80211TransmitterBase *>(myradio->getTransmitter()));
int channel = ieee80211Transmitter->channel->getChannelNumber();
if(channel==5)
channel=0;
else
channel=5;
physicallayer::Ieee80211ConfigureRadioCommand *conf = new Ieee80211ConfigureRadioCommand();
conf->setChannelNumber(channel);
auto request = new Request("configureRadioMode", RADIO_C_CONFIGURE);
request->setControlInfo(conf);
take(request);
sendDown(request);
scheduleAt(simTime() + 10.0, msg); // Tekarar değişimi tetikler.
}
Radyo katmanı ilgili komutu alır ve trensmiite ve reciever modüllerini ayrı ayrı istenilen kanala ayarlar.
Sonuçlar
Simulasyon sonucu mobilHost[0] için kanal değilşim ve mobilHost[1] için alınan PaketByte verisi tek garfik te çizdirildiğinde aşağıdaki sonuç elde edilmektedir. Şekil 3 tende görüldüğü üzere kanl değişiminden sonra tekrardan veri gönderimi başlayana kadar biraz süre geçmekte ve haberleşme gecikmeli olarak başlayabilmektedir. Burada sebep Routing Algoritması AODV’nin (ve dolayısıyla link katmanının) tekrardan link kurulumunu sağlaması için geçen süredir.
Yine şekil 1 de görüldüğü üzere 1000 paket gönderilmiş fakat 479 paket alınmıştır. Bir paket alınamadan simülasyon bittiği için 480 paket kabul edilmelidir. Sonuç olarak Yarı yarıya iletim sağlanması beklenirken 20 paket iletim hatası vardır. Başlangıç hariç 4 kez tekrardan haberleşme kanalına geçildiği düşünülürse 20/4 ten her tekrardan link kurulumu 5 paket süresi yani 500 ms sürmekte ve bu aralıkta 5 paket kaybı olmaktadır.
Ek bilgi: Simülasyon Akışı
Senaryoyu oluşturmak için self message yöntemi kullanılmıştır. Bunun için Ieee80211Mac.cc dosyasında init fonksiyonuna aşağıdaki kod bloğu eklenmiştir ve Her bir mesaj tekrardan 10 saniye sonra gelecek bir mesajı tetiklemektedir.
if(strcmp(this->getParentModule()->getParentModule()->getFullName(),"mobileHost[0]")==0)
{
cMessage *msg = new cMessage("tecrubedenkatreler.com");
scheduleAt(simTime()+10.0, msg);
}