• Sonuç bulunamadı

4. J2ME(JAVA 2 MICRO EDITION) PLATFORMU

5.3. MIDP’de Kullanıcı Etkileşimlerinin Yönetilmesi

5.3.3. Etkileşimlerin Yönetildiği Yüksek Seviyeli Kullanıcı Arayüzü Örneği

“displayMngr.setCurrent(entryForm)” komut satırı kullanılarak cep telefonunun ekranında görünür hale getirilir. Kullanıcı Şekil 2.5’deki gibi ilgili alanlara adını, yaş grubunu ve hobilerini girer. Daha sonra ekranın sağ tuşunun yönettiği “Get” komutuna basıyor. Bu tuşa basınca kullanıcının seçtiği bilgilerin görüntülendiği bir “Alert” oluşturulur ve Şekil 2.5 (c)’deki gibi ekranda görüntülenir. Kullanıcı bu mesajı ekranda gördükten sonra ekranın sağındaki

“Done” tuşuna basınca, Şekil 2.5 (a)’daki gibi boş bir form ekranda tekrar görüntülenir.

Kullanıcı bu ekranın solunda “Exit” komutunu yöneten tuşa bastığında uygulamayı sonlandırır.

61

AnketMIDlet.java package AnketDemo;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class AnketMIDlet extends MIDlet {

String sym = new String(); // textfielda girilen ismi tutan değişken

String soru2 = new String(); // seçilen yaş grubunun tutulduğu değişken String soru3; // seçilen hobileri tutan değişken

//uygulamanın hayat devresini tutması için bir lokal değişken tanımlanır.

private Display displayMngr = null;

//EntryForm sinifindan bir degisken tanimlaniyor.

private EntryForm entryForm = null;

//Alert nesnesine bir referans degiskeni tanimlaniyor.

private Alert resultsAlert = null;

public AnketMIDlet () { }

private void initListener () {

CommandListener commandListener = new CommandListener() { public void commandAction(Command c, Displayable d) { soru3 = new String();

62 +"grubundasin.\n"+ "Hobilerin: "+ soru3);

} //END OF else if (c == entryForm.getGetCommand()) } //END OF public void commandAction

};

entryForm.setCommandListener(commandListener);

}

//tanimlanan EntryFormun ekranda gosterilmesi icin bir metod private void displayEntryForm () {

if (entryForm == null) {

entryForm = new EntryForm("Anket");

}

//sonsuza kadar ekranda kalabilecek olan alert icin bir metod olusturuluyor private void displayInformation(String quoteString) {

if (resultsAlert == null) {

resultsAlert = new Alert("Anket Sonuclari", null, null, AlertType.CONFIRMATION);

resultsAlert.setTimeout(Alert.FOREVER);

}

resultsAlert.setString(quoteString);

//o an Alert in gosterilmesini, ancak bir sonraki ekran olarak //EntryForm'a donulmesi tanimlaniyor

displayMngr.setCurrent(resultsAlert, entryForm);

entryForm.setcevap1Field();

entryForm.setsoru2Choice();

entryForm.setsoru3Choice();

}

//Display instance alinir ve referansi displayMngr degiskeni içine koyulur

63

// entryForm sinifi olusturuldugunda displayEntryForm metodu cagriliyor protected void startApp() {

displayMngr = Display.getDisplay(this);

displayEntryForm();

}

protected void pauseApp() { }

protected void destroyApp(boolean unconditional) { notifyDestroyed();

}

public void commandAction(Command c, Displayable s) { } } //END OF AnketMIDlet.java

EntryForm.java package AnketDemo;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

//Form sinifi iki tane consructor a sahiptir.

//bunlarin en azindan birinin yeni sinifta overridden edilmesi gerekir public class EntryForm extends Form {

// exit ve get komutlari icin referans degiskenleri tanimlaniyor private Command exitCommand = null;

private Command getCommand = null;

// kullanıcı isminin tutulduğu bileşenler private StringItem soru1Field = null;

private TextField cevap1Field = null;

// yas grubunu belirleyen bileşenler private StringItem soru2Field = null;

private ChoiceGroup soru2Choice = null;

// hobilerin tutulduğu bileşenler private StringItem soru3Field = null;

private ChoiceGroup soru3Choice = null;

public EntryForm(String title) { super(title);

soru1Field = new StringItem(null, "1- ADINIZ:");

//textField tanimlaniyor.

//1. parametre -> textfield'in etiketini olusturuyor.

//2. -> "" oldugundan baslangic degeri verilmiyor.

//3. -> kullanici en fazla 10 karakter girebilir.

//4. -> bu alana giris yaparken herhangi bir kisit olmadigi belirtiliyor.

cevap1Field = new TextField("", "", 10, TextField.ANY);

64

soru2Field = new StringItem(null, "2- YASINIZ:");

String choices_yas[] = {"20-39", "40-59"};

soru2Choice = new ChoiceGroup("", Choice.EXCLUSIVE, choices_yas, null);

soru3Field = new StringItem(null, "3- HOBILERINIZ:");

String choices_hobi[] = {"Muzik", "Resim", "Sinema",

"Tenis", "Yuzme"};

soru3Choice = new ChoiceGroup("", Choice.MULTIPLE, choices_hobi, null);

// exit ve get komutlari olusturuluyor, // exit komutuna en yuksek oncelik veriliyor

exitCommand = new Command("Exit", Command.EXIT, 1);

getCommand = new Command("Get", Command.SCREEN, 2);

// tanımlanan ekran bileşenleri forma ekleniyor append(soru1Field); addCommand(exitCommand);

addCommand(getCommand);

}

// anket sorularının cevaplarının alınabilmesi ve gerektiğinde ilgili // alanların boşaltılması için getter ve setter metodlar tanımlanıyor public StringItem getsoru1Field() {

return soru1Field;

}

public StringItem getsoru2Field() { return soru2Field;

}

public StringItem getsoru3Field() { return soru3Field;

}

public TextField getcevap1Field() { return cevap1Field;

}

public void setcevap1Field() { cevap1Field.setString("");

65

}

public ChoiceGroup getsoru2Choice() { return soru2Choice;

}

public void setsoru2Choice() {

soru2Choice.setSelectedIndex(0,true);

}

public ChoiceGroup getsoru3Choice() { return soru3Choice;

}

public void setsoru3Choice() {

soru3Choice.setSelectedIndex(0,false);

soru3Choice.setSelectedIndex(1,false);

soru3Choice.setSelectedIndex(2,false);

soru3Choice.setSelectedIndex(3,false);

soru3Choice.setSelectedIndex(4,false);

}

//commandlere erisebilmek icin getter metodlar tanimlaniyor public Command getExitCommand() {

return exitCommand;

}

public Command getGetCommand() { return getCommand;

} }

Uygulama Çalıştırıldığında Oluşan Ekran Görüntüleri

(a) (b) (c)

Şekil 5.5: AnketMIDlet Uygulaması Çalıştırıldığında Oluşan Ekran Görüntüleri

66 6.BLUETOOTH STACK VE YAPISI 6.1.Bluetooth Stack

Bluetooth stack, PC de bluetooth cihazını kontrol etmek amacıyla kullanılan yazılımdır.

Bluetooth stack bluetooth protokolünü gerçekler ve aynı zamanda bluetooth cihazının programlanabilirliğini kontrol etmeye izin verir. Bu izinler şunlardır.

 Diğer bluetooth cihazları ile haberleşmek

 Üzerinde bulunduğu Bluetooth cihazını kontrol etmek

Bir bluetooth protokol stack bluetooth istemcileri ve sunucularının kablosuz ağ üzerinde veri alışverişine izin verir. Bluetooth cihazı ve bluetooth stack birlikte nasıl çalıştığını ve aralarındaki ilişkiyi şöyle özetleyebiliriz. Bluetooth cihazı, bluetooth stack olmadığında tıpkı işletim sistemi olmayan bir bilgisayar gibi düşünülebilir. Ya da sürücüsü olmayan bir cihaz gibidir.

Şekil 6.1: Kablo veya Bluetooth Bağlantısı Durumunda Sürücü Gereksinimi Bluetooth protokolü ile haberleşme yapmak ve bir bluetooth cihazını kontrol etmek için bilgisayar bluetooth stack’ını kullanır. Stack’ın her bir bileşeni bir katman olarak adlandırılır.

6.2.Bluetooth Stack’ın Katmanları

Uygulama geliştiriciler, Bluetooth protokol, iki ana parçaya ayrılabilir. Bunlar, katmanlar ve profillerdir. Bluetooth protokolün tüm katmanları protokol stack’ını oluşturur. Bluetooth protokol katmanları aşağıdaki gibidir.

 Host Controller Interface (HCI)

 Logical Link Control and Adaptation Protocol (L2CAP)

 Service Discovery Protocol (SDP)

 RFCOMM

 Telephony Control Protocol Specification (TCS-BIN)

 Wireless Access Protocol (WAP)

67

 Object Exchange (OBEX)

 Bluetooth Network Encapsulation Protocol (BNEP)

 Human Interface Device Protocol (HID) 6.3.Bluetooth Stack Profilleri

Bir bluetooth profili, bluetooth cihazları için tasarlanmış işlevsellik kümesidir. Örneğin, telefon ve PDA aralarında veri senkronizasyonu yapmak için senkronizasyon profilini

desteklemelidir. PDA dan cep telefonuna bir dosyanın nesne olarak gönderilmesi için her iki cihazında Object Push Profilini gerçeklemiş olması gerekir. PDA nın cep telefonunu kullanarak interneti kablosuz kullanabilmesi için Dial-Up Networking Profilini her iki cihazda

desteklemelidir. Bluetooth özelliğine sahip cihazlarının birbirleriyle haberleşebilmesi için bluetooth stack yeterli değildir. Ayrıca bu cihazların aynı profillere sahip olması da gerekmektedir. Bluetooth profilleri aşağıdaki gibidir.

 Generic Access Profili

 Service Discovery Application Profili

 Serial Port Profili

 Dial-up Networking Profili

 Fax profili

 Headset Profili

 LAN Access Profili

 Personal Area Networking Profili

 Cordless Telephony Profili

 Intercom Profili

 Generic Object Exchange Profili

 Object Push Profili

 File Transfer Profili

 Synchronization Profili

 Basic Printing Profili

 Hard Copy Cable Replacement Profili

 Basic Imaging Profili

 Hands Free Profili

 Human Interface Device Profili

68 6.3.1.Generic Access Profili (GAP)

GAP, iki Bluetooth birimlerinin nasıl birbirlerini keşfedip bağlantı kuracağını tanımlar.

Bağlanmamış birimler arasında keşif ve kurulumu yönetir. Bu profil genel olan ve GAP’a değinilen ve çok profilli cihazlar tarafından kullanılan işlemleri tanımlar. GAP herhangi iki Bluetooth birimi, herhangi üretici veya uygulamanın Bluetooth üzerinden bilgi alışverişini sağlamak amacıyla birimlerin ne tür uygulama birimlerini desteklediğini bilgilerini verir. Başka herhangi bir bluetooth profilini desteklemeyen Bluetooth birimleri temel çalışabilirlik ve birlikteliği sağlamak için GAP’ı kullanmalıdır. Ayrıca güvenliği yönetir.

6.3.2.Service Discovery Application Profile (SDAP)

SDAP mevcut olan Bluetooth birimi servislerini araştırıp tanımlar. Bu profil bilinen ve hemen hemen genel olan belirli servislerin aranmasını yönetir. SDAP , kullanıcı uygulamaları araştırma servisi adında Bluetooth biriminde servis bulmak için gerekli olan uygulama içerir.

Bu uygulamanın arayüzü olan the Service Discovery Protocol diğer Bluetooth birimlerinden servis soruşturması gönderip alır. Bu nedenle SDAP belirli Bluetooth protocolu ile son kullanıcı için avantajlı arayüzlü bir uygulama tanımlar. SDAP, GAP’a bağlıdır.

6.3.3. Serial Port Profile

Bu profil nasıl iki cihaz üzerinde sanal seri bağlantı noktaları kurulacağını tanımlar ve bu bağlantının Bluetooth ile kurulmasını sağlar. Bu profilin kullanımıyla Bluetooth birimleriyle RS232 kontrol sinyalizasyonu kullanan bir seri kablonun bir öykünümü sağlanır (RS232 veri haberleşme araçları için ortak arayüz standardı; bir sıradan PC'nin seri portunda kullanılan standart). Bu profil kullanılabilir 128kbit/sn. veri yolu sağlar. Serial Port Profile, GAP'a bağlıdır. SDAP gibi Serial Port Profile da GAP'ın bir paçasını kullanır.

69 7.JAVA VE OBEX

Bluetooth, data göndermek ve almak için bize üç tane protokol sunmaktadır. Bunlar,

 RFCOMM (stream data göndermek için)

 L2CAP(paket data göndermek için)

 OBEX(obje data göndermek için)

Bu bölümde OBEX protokol mekanizmasını ve bluetooth cihazları arasında nesnelerin nasıl gönderildiğinden bahsedilecektir. Bu java.obex paketindeki API leri kapsayacak ve iki cihaz arasında OBEX kullanarak dosya göndermenin nasıl gerçekleştileceği gösterilecektir.

7.1.OBEX

OBEX(Object Exchange) iki cihaz arasında obje data transferine izin veren bir

haberleşme protokolüdür. Burada cihazların kablosuz veya fiziksel bağlantı ile bağlı olmasının bir önemi yoktur. OBEX, aslında kızılötesi için geliştirilmişti. Fakat daha sonra bluetooth protokollerinden biri haline geldi. OBEX, bluetooth ve kızılötesi(IrDA) için uygun bir protokoldür.

Şekil 7.1: OBEX, IrDA Protokol Yığınında IrOBEX Olarak Bilinir.

Bluetooth tanımlamasında, OBEX protokolünün temelinde aşağıdaki bluetooth profilleri kullanılmaktadır.

 Generic Object Exchange Profili

 Object Push Profili

 Senkronizasyon Profili

 Dosya Transfer Profili

 Basic Imaging Profili

 Basic Printing Profili OBEX implement edilirken javax.bluetooh.obex değil javax.obex paketinin import edilmesi gerekmektedir.

IrOBEX

IAS Tiny Transport Protocol

Infrared Link Manager

Infrared Link Protocol

70

OBEX protokolü basit bir istemci/sunucu mimarisine sahiptir. OBEX istemciler nesneleri OBEX sunuculara yerleştirme ve alma işlemlerini gerçekleştirir. OBEX sunucular, istemcilerden gelen istekleri bekler. OBEX tanımı iki kısımda özetlenebilir. Bunlar OBEX Object Model ve OBEX Session Protokoldür. Object Model OBEX nesnelerin tanımlanmasını ve nasıl transfer edileceği hakkında bilgi verir. Session Protokol, cihazlar arasında nesnelerin transferi esnasında istemci ve sunucu arasında olması gereken el sıkışmayı tanımlamaktadır.

7.2.OBEX Object Model

OBEX Object Model, bir nesne hakkındaki tüm detayları temsil eder. Örneğin header olarak bilinen özellikleri tanımlar. Her header nesne yada nesnenin kendisi hakkında bir bilgi içerecektir. (Örnegin, nesnenin ismi gibi.) Object Model header lardaki header ID yi bir byte ile tanımlarken header in değeri bir veya daha fazla byte ile tanımlamaktadır.

Şekil 7.2 OBEX header

OBEX Object Model, bir OBEX nesne özellikleri için 17 header tanımlamıştır. Java OBEX tanımlamasında java.obex.HeaderSet interface içerisinde sabitlerden yalnızca 12 tanesi tanımlanmıştır.

7.3.OBEX Oturum Protokolü

OBEX Session Protokolü, OBEX sunucu ve istemci arasıdaki haberleşme için gerekli tüm kuralları ve süreçleri tanımlar. Haberleşme yapısı istek-cevap işlemi şeklinde olup basittir.

İstemci bir istek gönderir ve sunucu bu isteğe bir cevap verir. İstek ve cevabın her ikiside paketler şeklinde gönderilirler. İstemciler, sunucuyla 8 basit işlem aracılığıyla haberleşir.

Bunlar;

OBEX sunucular, sırasıyla OBEX istemcilere cevap verirler. Bu cevap şekli aşağıdaki gibidir.

SUCCESS FAILURE

Bir Byte Bir veya daha fazla byte

71 CONTINUE

Pek çok OBEX cevabı bulunmaktadır. Tüm cevap kodlarını javax.obex API paketi

içerisindeki javax.obex.ResponseCodes classı içerisinde görebilirsiniz. OBEX oturumu boyunca meydana gelen mesaj akışı aşağıda gösterildiği gibidir.

Şekil 7.3: OBEX İstemci ve Sunucu Arasındaki Mesaj Akışı İstemci CONNECT operasyonu ile bir istek paketi göndererek haberleşme sürecini başlatır. İstek paketi, operasyon, paket uzunluğu ve headerlar için kod içermektedir. Bu istek alındığında sunucu gönderdiği paketde cevap kodunu, cevabın uzunluğunu ve cevap verisini karşılık olarak gönderir. Normal durumda sunucu SUCCESS cevap kodu ile birlikte paketi gönderir. Eğer bazı problemler meydana geldi ise sunucu FAILURE kodunu gönderir.

PUT operasyonu, istemciden sunucuya bir nesne gönderilmesine izin vermektedir. Boyutu küçük bir nesne, bir tek PUT istek paketi ile gönderilebilir. Eğer tek paket ile gönderilemiyorsa istemci bir den fazla paket gönderir ve sunucu CONTINUE cevap kodu ile yanıt verir. Sunucu istemcinin gönderdiği son PUT paketine SUCCESS kodu ile cevap verir.

Benzer şekilde istemciler GET istek paketi göndererek sunucudan nesneleri alabilir. Eğer sunucu paketi kabul ederse, SUCCESS veya CONTINUE kodlarından herhangi birisiyle yanıt verir. Eğer sunucu CONTINUE ile yanıt verirse, istemcide GET isteğini göndermeye devam eder. Sunucu SUCCESS kodu ile yanıt verene kadar bu işlem devam eder.

OBEX İstemci Uygulaması OBEX Sunucu Uygulaması

Connect Request

Success

Put/Get

Continue

Put/Get

Success

Disconnect

Success

72

İstemci, sunucudaki bir dizini değiştirmek istediğinde PUT ve GET işlemleri ile birlikte SETPATH işlemini kullanır. İstemci, zamanından önce sunucu ile olan oturumu sonlandırmak istiyorsa ABORT işlemini kullanabilir. Aynı zamanda CREATE-EMPTY işlemini kullanarak sunucu üzerinde boş bir dosya oluşturabilir . PUT-DELETE işlemini kullanarak sunucu üzerinde bulunan bir nesneyi kaldırabilir.

7.4.JSR82’deki OBEX API’leri

JSR deki APIsindeki java.obex paketinde bulunan classlar aşağıdaki gibidir.

 Authenticator

 ClientSession interface 7.4.1.Javax.obex.ClientSession

ClientSession interface javax.microedition.io.Connection classının bir alt classıdır ve istemci açısından bir OBEX bağlantısını temsil eder. Aşağıdaki kod satırında bu interface den bir nesne oluşturulmuştur.

ClientSession session = (ClientSession) Connector.open(baglantiURL);

Bu interface OBEX işlemleri için bir header tanımlanmasını sağlar. Örneğin, put() ve get() metodu sırasıyla PUT ve GET işlemlerini gerçekleştirmemize izin verir. Bu metodlar

javax.obex.Operation nesnesini geri döndürür ve böylece işlemi tamamlayabiliriz.

Connect(), disconnect() ve setPath() metodları sırasıyla CONNECT, DISCONNECT ve SETPATH işlemlerini tanımlar. Javax.obex.HeaderSet nesnesi sonuç olarak geri döner.

7.4.2.Javax.obex.HeaderSet

HeaderSet interface tüm OBEX headerlarını tanımlamak için kullanılır.

ClientSession.createHeaderSet() çağrısı ile temsil edilir. Aşağıda bir OBEX istemci örneği görülmektedir.

HeaderSet hdr = clientSession.createHeaderSet();

// Sunucudan resim.png dosyası istemek için bir header set oluşturulur.

hdr.setHeader(HeaderSet.TYPE," image/png");

hdr.setHeader(HeaderSet.NAME," masaustu.png");

73

Bir OBEX sunucu, sırasıyla getHeader() veya getHeaderList() metodlarının herhangi birisini çağırarak istenciden gönderilen header’ları alabilir.

7.4.3.Javax.obex.Operation

Bu interface GET ve PUT işlemleri için gerekli olan metodları sağlar. Aşağıdaki kod parçacığında ClientSession daki put() metodu kullanılarak bir işlem oluşturuldu.

ClientSession session = (ClientSession)Connector.open(baglantiURL);

Operation op = session.put(null);

Ancak, gönderilmek istenen nesneyi yerleştirine kadar ve bazı headerlar eklenene kadar Operation işlemi tamamlanmayacaktır. PUT örneği aşağıdaki gibidir.

ClientSession session = (ClientSession)Connector.open(baglantiURL);

Operation op = session.put(null);

OutputStream out=op.openOutputStream();

Out.write(“Deneme”.getBytes());

Out.close();

CREATE-EMPTY işlemini gerçekleştirmek için, herhangi bir data yazmaksızın OutputStream i açıp kapatarak bu işlemi gerçekleştirebiliriz. Bu işlem aşağıdaki gibidir.

ClientSession session = (ClientSession)Connector.open(baglantiURL);

Operation op = session.put(null);

OutputStream out=op.openOutputStream();

Out.close();

Bu classdaki delete() metodunu çağırılarak PUT-DELETE işlemini yapmak daha basittir.

7.4.4.Javax.obex.ResponseCodes

ResponseCodes classı, OBEX sunucunun, istemcilerine gönderebileceği tüm geçerli cevap kodlarını içerir. OBEX istek/cevap modeli HTTP den çok daha basit bir modeldir.

Aşağıda verilen bazı cevaplar gösterilmektedir.

 OBEX_HTTP_ACCEPTED

74

Eğer PUT işlemi başarılı olursa ResponseCodes classının nasıl kullanıldığına dair bir örnek verelim.

ClientSession session = (ClientSession)Connector.open(baglantiURL);

Operation op = session.put(null);

OutputStream out = op.openOutputStream();

out.write("Deneme".getBytes());

out.close();

if(op.getResponseCode() ==ResponseCodes.OBEX_HTTP_OK) System.out.println("PUT işlemi başarılı şekilde gerçekleşti.");

7.4.5.javax.obex.ServerRequestHandler

ServerRequestHandler, OBEX sunucu için çok kullanışlı bir classtır. OBEX isteklerini cevaplayan event listener içerir. Bu bir classtır, interface değildir. Implement etmeden miras yoluyla kullanabiliriz. Bu class uygun operasyonu içeren istemci istekleri geldiği zaman çağrılacak olan aşağıdaki metotlara sahiptir.

 OnConnect()

 onSetPath()

 onDelete()

 onGet()

 onPut()

JVM tarafından çağrılan callback metodundan sonra Operation nesnesinden headerları elde edebiliriz.

public int onGet(Operation op) { try{

HeaderSet hdr = op.getReceivedHeaders();

} }

7.4.6.javax.obex.SessionNotifier

SessionNotifier interface J2ME deki tüm notifierlar gibi benzer bir yöntem kullanır.

Bir OBEX sunucuya bağlanmak isteyen bir cihaz bu interface’i implement etmeli, acceptAndOpen() metodunu çağırmalı ve istemcileri beklemelidir. Aşağıdaki kod bu işlemleri göstermektedir.

75

SessionNotifier sn = (SessionNotifier)

Connector.open("btgoep://localhost:1106;name = FTP");

sn.acceptAndOpen(serverRequestHandler);

Sunucu, istemciden gelen bağlantıları kabul eder. Daha sonra istemci için bir kanal açılır. serverRequestHandler dan oluşturulan alt class acceptAndOpen() metoduna geçirilerek istemciden gelen tüm istekler sunucu tarafından alınır.

76

8.PROJE TASARIMI VE GERÇEKLEŞTIRILMESI 8.1. Proje Hakkında

Projede yapılmak istenen bluetooth teknolojisini kullanarak cep telefonu üzerinden bilgisayarın fare ve klavyesini kontrol edebilmektir. Cep telefonları için uygulama

yazmada sağladığı esnekliklerden dolayı java programlama dili kullanıldı. Java’nın dili ile yazılmış programların çalışması için gerekli olan java sanal makine’nin birçok cihazda bulunması Java programlama dilinin tercih edilmesinde büyük bir etkendir. Bu sebeplerden dolayı cep telefonu üzerinde J2ME platformu, bilgisayar tarafında ise J2SE platformu kullanılmıştır. Bilgisayar tarafında yazılan program sunucu cep telefonu tarafındaki program ise istemci olarak düşünülmüştür.

Sunucu tarafı, öncelikle yerel bluetooth aygıtına erişip istemcinin bağlanması için gerekli olan servisleri açmak zorundadır. İstemci ise öncelikle çevredeki bluetooth cihazlarını arar. Arama işlemi sona erdiğinde uygun bluetooth cihazı kullanıcı tarafından seçilir. Sonraki aşamada seçilen bluetooth cihazının servisleri taranır. Eğer uygun bir servis bulunursa bağlantı sağlanmış olur. Aksi takdirde servis bulunamadığı için bağlantı

sağlanamaz.

8.2. Proje Mimarisi

Projede öncelikli olarak PC tarafında kullanılan bluetooth cihazı usb dongle olmak zorundadır ve bu cihazın kendi yazılımı yüklenmeyip Microsoft bluetooth sürücüleri yüklenmelidir. Microsoft bluetooth sürücüleri yüklendiğinde Microsoft bluetooth stack da yüklenmiş olacaktır. Microsoft bluetooth stack bize cihazı programlama esnekliğini sunmaktadır. Usb bluetooth dongle haricinde bir bluetooth cihazı kullandığımızda örnegin dizüstü bilgisayarın bluetooth cihazına erişmek istediğimizde cihazın sürücüleri yazılım geliştirme esnekliğini sağlamıyorsa cihaza erişip programlama mümkün olamamaktadır.

Bu nedenden dolayı usb bluetooth cihazı ve Microsoft Bluetooth Stack kullanılmıştır.

Microsoft Bluetooth Stack’a java ile doğrudan erişmek mümkün değildir. Bunun için java geliştiricileri tarafından yazılmış bluecove paketinin yüklenmesi gerekir. Bu paket içerisinde JNI(Java Native Interface) formunda yazılmış “intelbth.dll” dosyası

bulunmaktadır. Bu dosya Microsoft Bluetooth Stack’daki Bluetooth API lerine erişmeyi sağlar. JNI formunda yazıldığı için java tarafından, intelbth.dll dosyasındaki fonksiyonları çağırmak mümkün olabilmektedir. Şekil 8.1 bu yapıyı bize açık olarak göstermektedir.

77

Şekil 8.1 PC tarafında bluetooth cihazına erişim

Şekilde de görüldüğü PC üzerindeki bluetooth cihazına erişim ancak JNI üzerinden gerçekleştirilmektedir. Javanın Bluetooth Stack eksikliği ancak bu şekilde

giderilebilmektedir. Cep telefonunda ise JSR-82 API leri kullanılarak bluetooth cihazına erişimi işletim sisteminin kendi sağlamaktadır.

Gerçekleştirlen projede bluetooth cihazları arasındaki haberleşmenin şeklini çizelim.

Şekil 8.2 PC ile Cep telefonu arasındaki haberleşme

Şekil 8.2 de görüldüğü gibi Microsoft Bluetooth Stack API(Application programming Interface) ve Bluecove paketi cihaza erişim sorununu çözmektedir.

Bluetooth Cihazı

Microsoft Bluetooth Stack API

Bluecove (intelbth.dll-JNI)

JAVA

78

Microsoft Bluetooth Stack API’si C’API sidir. BlueCove ve Microsoft API arasındaki entegrasyonun sağlanması ise JNI aracılığıyla sağlanmıştır.

Bluecove API’si JSR-82 tabanlıdır. BlueCove aşağıdaki profilleri desteklemektedir.

 Genel Erişim Profili

 Servis Araştırma Profili

 Seri Port Profili

8.3. Uygulamada Kullanılan Classlar ve İşlevleri

Uygulamayı oluşturan classların temel görevleri ve yazılış amacına göz atalım.

8.3.1. Cep Telefonunda Oluşturulan J2ME Uygulaması

Cep telefonu istemci yazılımında arayüzlerin oluşturulması ve arayüzler arasında geçişi sağlamak amacıyla ilkMIDlet isimli MIDlet oluşturuldu. ilkMIDlet MIDlet’i ile programın başlangıcında bir tanıtıcı açılış ekranı (splash form) oluşturuldu. Açılış ekranın ardından ana menü olarak bir List oluşturdu. Bu List ekranına bağlantı oluşturma işlemi için hazırlanan List olan Cihaz Listesi’ne bağlı olan “Bağlantı Oluşturma” elementi, programı tanıtan forma bağlı olan “Program Hakkında” elementi, çıkış için ise “ Çıkış”

elementleri eklendi. Cihaz Listesi List’inde “cihaz ara” butonuyla yakındaki cihazlar aranmaya başlanır. Bu süreçte aşağıda belirtilen cihaz sorgulama fonksiyonu kullanılır ve

elementleri eklendi. Cihaz Listesi List’inde “cihaz ara” butonuyla yakındaki cihazlar aranmaya başlanır. Bu süreçte aşağıda belirtilen cihaz sorgulama fonksiyonu kullanılır ve