4. J2ME(JAVA 2 MICRO EDITION) PLATFORMU
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 ardından bulunan cihazlar Cihaz Listesi’ne eklenir.
// CİHAZ SORGULAMASI Vector cihazSorgulamasiYap(){
try {
// onceki cihaz bilgileri siliniyor cihazlar.removeAllElements();
cihazSiniflari.removeAllElements();
yerelCihazAdresi = LocalDevice.getLocalDevice();
yerelCihazAdresi.setDiscoverable(DiscoveryAgent.GIAC); . kasif = yerelCihazAdresi.getDiscoveryAgent();
79
cihazaramatamamlandi = false;
} catch (BluetoothStateException ex) { ex.printStackTrace(); } return cihazlar;
}
// CİHAZ SORGULAMASI
“yerelCihazAdresi= LocalDevice.getLocalDevice();
yerelCihazAdresi.setDiscoverable(DiscoveryAgent.GIAC); .
Kodları ile mevcut cihaz bulunur ve yerel cihaz arama için hazırlanır.
kasif = yerelCihazAdresi.getDiscoveryAgent();
kasif.startInquiry( DiscoveryAgent.GIAC , new BlueDinleyici() );
Kodlarıyla kasif adında ajan belirtilir ve bu ajanla civardaki bluetooth cihazları aranır. Bulunan cihazlar BlueDinleyici isimli dinleyici sınıfı tarafından tututulur . BlueDinleyici sınıfında bulunan ;
public void deviceDiscovered(RemoteDevice uzakCihaz, DeviceClass cihazSinif) { if(cihazSinif.getMajorDeviceClass() == 0x0100 )
{cihazlar.addElement( uzakCihaz );
cihazSiniflari.addElement( cihazSinif );}
prosedür ile keşfedilen cihazlardan sadece PC veya Laptop olanlar (cihaz sınıfı 0x0100 olanlar ) Cihaz Listesi’ne aktarılır. Cihaz Listesi’nden sunucu programın bulunduğu cihaz seçildikten sonra aşağıdaki fonksiyon ile servis araması yapılır.
// SERVİS SORGULAMASI
public void servisSorgulamasiYap(RemoteDevice secilencihaz, UUID[] uuids){
try {
kasif.searchServices(null,uuids, secilencihaz, new BlueDinleyici());
while(!servisaramatamamlandi) { } servisaramatamamlandi = false;
}
catch(BluetoothStateException e) {}
}
// SERVİS SORGULAMASI
80
Uygun bir servis bulunmasıyla sunucuyla istemci telefon arasındaki haberleşme başlatılır. Cihazlar arası iletisim için aşağıdaki sınıf kullanılır.
// Cihaza bağlanma class cihazabaglanma {
public void setServiceRecord(ServiceRecord sr){
secilenservis = sr;
try {streamconnection = (StreamConnection) Connector.open( baglantiURL );
dataoutputstream = streamconnection.openDataOutputStream();
datainputstream = streamconnection.openDataInputStream();}
8.3.1.1.İstemci J2ME Uygulamasının Cep Telefonuna Yüklenmesi
Uygulama derlendikten sonra jad(Java Description) ve jar (Java Archive) uzantılı iki dosya oluşur. Derleme sonucu oluşan dosyalar ve uygulamamızda kullandığımız ses yada resim dosyaları jar uzantılı dosya içerisinde bulunur. Jad dosyası uygulamanın profil, konfigürasyon jar dosyasının yeri ve boyu gibi bilgileri vermektedir. Uygulama
kurulmadan önce bu dosyaya bakılır eğer cihazımız bu uygulamayı kurmaya uygunsa jar dosyası jad dosyasının işaret ettiği yerden indirilir ve kurulur. Uygulamanın cep
telefonuna aktarılması için hem bilgisayarın, hem de telefonun desteklediği veri aktarım teknojilerinden birisi kullanılabilir. Bu aktarım Bluetooth, kızılötesi veya veri kablosu kullanarak yapılabilir.
81
8.3.2. PC Tarafında Oluşturulan J2SE Uygulaması
AnaForm class’ı programın arayüzünü oluşturmaktadır. Bu class üzerinde sunucunun başlatılmasını ve bağlı olan istemcilerin liste kutusunda görülmesini ve bluetooth cihazı hakkındaki bilgilerin ekranda görüntülenmesini sağlar.
PCServer class’ı sunucu üzerindeki yerel bluetooth cihazının bulunması, sunucunun oluşturulması, bağlanacak istemciler için gerekli servislerin sağlanması ve bağlanan istemciden gelen mesajları alıp bu mesajları yorumlayan classtır.
PCServer class’ında, cep telefonu üzerindeki istemcide de belirtiğimiz aynı 32 karakterlik UUID numarası bağlantı adresi belirtilirken kullanılır. UUID , haberleşme sırasında Bluetooth sinyallerinde kullanılan bir servis için verilmiş tekil kimlik
numarasıdır. Haberleşmenin kolay ve özel olması için bu kimlik özel belirtilmiştir. İstemci cep telefonu bu kimlik numarası ile PC’ deki server’a bağlanır.
İstemci cep telefonu için serverı başlatmak amaçlı “Bluetooth cihazı” menüsü içinde “Sunucuyu Başlat” komutu yer almaktadır. Bu komut çalıştırılmasıyla PCServer class’ının run() prosedürü çalışmaya başlar. Bu prosedürde istemci programında olduğu gibi yerel bluetooth cihazı aktif edilmektedir ve ekranda PC server da tanımlanan UUID numarasıyla sunucunun adresi tanımlanır. Sunucunun adresi
“btspp://localhost:102030405060708090a0b0c0d0e0f010; name=PCSunucu” olarak belirlenmiştir. Buradaki “btspp” ifadesi Bluetooth Serial Port Profile nin kullanıldığını belirtir. “localhost” ise sunucu olduğunu belirtir. “102030405060708090a0b0c0d0e0f010”
şeklinde belirtilen ise UUID dir. Tanımlanan adreste en son belirtilen “PCSunucu” ise servis ismini belirmektedir.
String url = "btspp://localhost:" + uuid.toString() +";name="+ uygulamaAdi;
form.mesajGoster("URL: " + url );
Adres belirtildikten sonra bağlantı için istemci cep telefonundan adrese bağlanması beklenir ve tanımlanan servis istemci için tanımlı kılınır.
server = (StreamConnectionNotifier)Connector.open( url );
ServiceRecord rec = cihaz.getRecord( server );
Bağlantı kabul etme ve sağlama metodu ile istemci bağlanana kadar servis aşağıdaki kod bölümüyle sağlanır.
form.mesajGoster("Sunucu istemci baglantisi icin bekliyor...");
82
İstemci cep telefonu bağlandıktan sonra istemciden gelen mesajlar okunmaya başlanır. Okunan mesajlar PCServer class’ında belirtilen mesajlar ile aynı olduğunda belirtilen kodlar çalıştırılır. Robot sınıfında bulunan mause ve klavye metodları ile gelem mesajlar icra edilir. Örneğin aşağıda belirtilen kodlar ile farenin sağa ve sola hareket etmesi sağlanır.
8.4. İstemci ve Server Uygulamalarının Çalıştırılması Kullanımı
Hazırlanan istemci ve sunucu uygulamalarının çalıştılması ve kullanımıngöz atalım.
8.4.1.İstemci Cep Telefonu Uygulamasının Çalıştırılması ve Kullanımı
İstemci program çalıştırıldığında öncelikle bir açılış formu görünür. Daha sonra Şekil 8.3 (a) da belirtilen menü isimli List ekrana gelir. Menüden “Bağlantı Oluşturma”
elementini seçerek “Cihaz Listesi” List’i görünür duruma gelir (Şekil 8.3 b). “Cihaz Ara”
tuşuna basarak civardaki PC veya Laptop sınıfı görünür cihazların Bluetooth isimleri listeye yazılır.
83
Arama tamamlandıktan sonra, Sunucu programınının bulunduğu bilgisayarın Bluetooth ismi seçilir ve cihaza bağlanım sağlanır. Bağlantı kurulduktan sonra
“Bağlantılar” menüsü görünür hale gelir ve “Fare Kontrolü” ile “klavye” fonksiyonları kullanılabilir hale getirilir(Şekil 8.3 c ). Klavye fonksiyonu için de oluşturulan arayüz Şekil 8.3 (d) de gösterilmiştir.
(a) (b)
(c) (d) Şekil 8.3: Cep istemci programının Arayüzleri
84
8.4.2.PC Taraflı Server Uygulamasının Çalıştırılması ve Kullanımı
PC tarafında çalışan programın çalıştırılmadan önce bluetooth cihazının takılmış olması gerekir. Daha sonra sunucu tarafı aşağıda görüldüğü gibi çalıştırılır.
PC tarafında çalışan programın çalıştırılmadan önce bluetooth cihazının takılmış olması gerekir. Daha sonra sunucu tarafı aşağıda görüldüğü gibi çalıştırılır.