Herkese merhaba. Bluetooth projemizin ikinci kısmıyla devam ediyoruz. Bildiğiniz üzere ilk kısımda telefondaki Bluetooth portunu açıp kapatma, bağlanılabilir cihazları listeleme ve eskiden bağlanılmış cihazları listeleme gibi işlemler gerçekleştirmiştik. Bu sayede ilk yazımın açıklama kısmındaki birinci ve ikinci maddeler tamamlanmış oldu. Şimdi ise üçüncü ve dördüncü maddeler olan listelenen cihazlardan birine tıklandığında bağlantının sağlanması ve veri alışverişinin yapılması gibi işlemleri gerçekleştireceğiz. Haydi başlayalım.

3.1. BAĞLANTI CLASS’I

Bu kısımda bağlantının kurulması ve veri alışverişinin sağlanması için gereken işlemlerin gerçekleştirilmesi için kullanacağımız class’ı oluşturacağız. Part-1’de class oluşturmanın bütün projede kullanmak adına kolaylık sağladığından bahsetmiştim. Class oluşturmak aslında yeni bir java sayfası açmaktır. Bunun için soldaki menüden java isimli dosyaya sağ tıklayarak, New → Java Class diyerek sayfamızı oluşturuyoruz. Bizim oluşturduğumuz class’ın ismi “BluetoothConnectionService”. Öncelikle değişkenlerimizi inceliyoruz:

UUID kimlik numarası gibi düşünülebilir. Bluetooth haberleşmesinin gerçekleştirilmesi için bu id’nin kullanılması gerekiyor. Bluetooth Adapter geçen yazımızda bahsettiğimiz üzere telefonumuzda Bluetooth portunun olup olmadığını kontrol etmek için tanımlanmıştır. Bluetooth Socket yine bağlantının oluşması için kullanılması gereken değişkenlerden bir tanesidir. Bluetooth Device ise bizim bağlanmak istediğimiz cihazdır. Yukarıda atladığım “private static BluetoothConnectionService instanceBCS” değişkenine geri dönmek istiyorum. Biz projemizde basitlik açısından bağlantıyı tek sayfada kullanacağız. Yani herhangi bir cihaza bağlanmak için tıkladığımızda bir sayfa açılacak ve bağlantıyı sadece orada kullanacağız. Ancak daha büyük projelerde çok daha fazla sayfada (activity) bağlantıyı kullanmamız gerekebilir. Bir sonraki bölümde göreceğimiz üzere veri alışverişi yaptığımız sayfada şu an oluşturduğumuz class’ı sıfırdan başlatarak bağlantıyı kuracağız. Eğer daha büyük bir projede her sayfada yeni bir bağlantı oluşturmaya çalışırsak bu bize büyük problemler oluşturur. Bu sıkıntıyı ortadan kaldırmak için de hali hazırda bulunan bağlantıyı alıp kullanabilmek için “instance” oluşturuyoruz. Sonuç olarak o anki bağlantıya herhangi bir yerden erişebiliyoruz.

Aşağıda gördüğümüz “ConnectThread” ve “ConnectedThread” bizim oluşturduğumuz değişkenlerdir. Thread bir işlemler dizisi olarak düşünülebilir. Her Thread’in bir önceliği vardır ve o önceliğe gerek çalışırlar. Thread içerisindeki “run()” fonksiyonuna, gerçekleşmesi istenen olaylar yazılır. Biz ConnectThread’de bağlantıyı oluşturuyoruz. Eğer bağlantı başarıyla oluşursa ConnectedThread ile veri alışverişini sağlayacağız.

InputStream ve OutputStream veri okumak ve veri göndermek için oluşturduğumuz değişkenlerdir. “IncomingMessage” da okuduğumuz veriyi kaydedebilmek için oluşturduğumuz bir değişkendir. Listener’larımız ise biraz daha komplike bir değişken olarak gözükebilir. Öncelikle neden tanımladığımızdan bahsetmek istiyorum. Daha önce söylediğim gibi şu an düzenliyor olduğumuz class, sadece bağlantının oluşması ve veri alışverişinin gerçekleşebilmesi için kullanacağımız class’tır. Yani bağlantı sayfası açıldığında biz bu class içerisinde bir değişiklik yapmayacağız ve bu class bize bağlantı sırasında ne yapmamıza izin veriyorsa bağlantı sayfasında onların yapmakla sınırlı kalacağız. Biz de bağlantı kurulurken, bağlantı varken, bağlantı kaybedildiğinde, bir veri okuması gerçekleştirildiğinde neler olacağını elbette kontrol etmek isteriz. Örnek verecek olursak, bağlantı koptuğunda bağlantı sayfasından çıkmamız gerekir ve bunu kullanıcıya bildirmemiz gerekir ki kullanıcı bağlantı olmadığı halde veri alışverişi yapmaya çalışmasın. İşte bu tarz durumları tanımlayabilmek için listener’lar oluşturduk. Şimdi nasıl oluşturduk ona bakalım:

Önce listener’larımızın isimlerini yazdık ve listener’lara ait metodları içerisine yazdık. “onBluetoothConnectingListener” bağlantı kurulurken oluşacak durumları kontrol etmek için kullanacağımız listener’dır. İçerisine yazdığımız “onSuccess” metodu, bağlantı başarıyla kurulduğunda bir işlem yapmak istersek diye yazdığımız metottur. “onFailure” metodu ise, bağlantı başarısız olursa yapmak istediğimiz işlemleri kodlayabilmek için yazdığımız metottur. “onBluetoothConnectionListener” ise bağlantı kurulmuş durumda iken oluşacak durumları kontrol etmek için kullanacağımız listener’dır. İçerisine yazdığımız “onConnectionLost” metodu adından da anlayabileceğiniz üzere bağlantı kesildiğinde yapmak istediğimiz işlemleri yazacağımız metottur. “onRead” metodu ise, herhangi veri okuma işlemi yani cihazımıza okumamız gereken bir veri geri geldiğinde yapmak istediğimiz işlemleri yazacağımız metottur. Biz iki listener için toplamda dört adet durum belirledik. Eğer daha farklı durumları kontrol etmek isterseniz istediğiniz kadar durumu buna benzer şekilde ekleyebilirsiniz. Bağlantı sayfasında bu metotları kullanırken işlevleri çok daha anlaşılır olacaktır, hiç endişe etmeyiniz.

Listener’larımızı ve her listener için kullanacağımız metodları tanımladık. O zaman bir de bu listener ve dolayısıyla metodlara bağlantı sayfasından erişebilmek için birer metod tanımlayacağız. Ya kardeşim iyice kafam karıştı dememeniz için hemen detaylandırıyorum. Biz az önce kontrolümüzün olmasını istediğimiz metodlar oluşturduk ve bunları listener’lara koyduk. Ancak bu listener’lara bağlantı sayfasından erişebilmek için de her listener için bir metot oluşturduk. Gayet basit 🙂

Yukarıda gördüğünüz gibi “setOnBluetoothConnectingListener” ve “setOnBluetoothConnectionListener” olarak iki listener için iki metot oluşturduk ve yukarıda değişken tanımladığımız yerdeki listener’lar ile eşleştirdik. Şimdi bağlantı sayfasında kullanacağımız diğer metotlar ile devam ediyoruz. Instance aldığımız metodumuz:

Gördüğünüz gibi gayet basit, eğer hazırda oluşturulmuş bir bağlantı yoksa, yeni bağlantı oluşturuyor ve metod yeni bağlantıyı döndürüyor. Eğer hali hazırda bağlantı varsa, metod o bağlantıyı döndürüyor.

Daha sonra yanda gördüğünüz gibi önce “setDevice” metotunu tanımladık ve bu metotta, bağlanacağımız cihazı alıyoruz. Daha sonrasında da asıl class’ımızın “constructor”ını oluşturduk, yani bağlantıyı bu şekilde oluşturuyoruz. Hatırlarsanız “getInstanceBCS” metodunda “new BluetoothConnectionService” diyerek bağlantıyı sıfırdan kuruyorduk. O zaman anlıyoruz ki bağlantıyı sıfırdan kurmak demek şu an düzenliyor olduğumuz bağlantı class’ımızın constructor’ına erişmek demektir.

Şimdi ise bağlantının temel parçası olan işlemlerin gerçekleştirilmesi için gereken Thread’leri başlatacağız. Bunu bağlantı sayfasından yapabilmek için yine bir metod tanımlıyoruz:

Gördüğünüz gibi “startClient” metoduyla eğer hali hazırda bir “ConnectThread” varsa onu kapatıp yeni başlatıyoruz.

Bu sayede Thread’in içinde, “run” içerisinde belirtilen işlemler başlamış oluyor. O zaman ConnectThread’te neler gerçekleşiyor onları inceleyelim:

Öncelikle Thread’imizin constructor’ını oluşturuyoruz. Bu noktalarda loglar koyarak işlmelerin nasıl ilerlediğini, eğer hata varsa hangi noktaya kadar düzgün ilerleyip nerede hata aldığını görebilirsiniz. Daha sonrasında run komutunu yazıyoruz:

run içerisinde öncelikle her ihtimale karşı, var olan bir cihaz keşfi varsa onu kapatıyoruz çünkü bağlantı sırasında keşfin gerçekleşmesi bağlantıyı imkansız hale getirir. Arkasından yukarıda oluşturduğumuz Bluetooth Socket’ten hariç geçici bir socket oluşturduk ve ona “null” değerini atadık. Daha sonra bu geçici socket’e “createBluetoothSocket(bluetoothDevice)” metodu ile hangi cihaza bağlanmak istediğimizi belirttik.

Bu metot bizim kendi tanımladığımız bir metottur ve içerisinde yanda görülen işlemler gerçekleştirilir. Burada bir versiyon kontrolü yapıldıktan sonra yukarıda tanımladığımız UUID’deki id ile bağlantı için socket oluşturuldu.

Bu metottaki cihaz, yukarıda tanımladığımız “setDevice” metodu ile aldığımız cihazdır. Bu işlemi bir “try-catch” bloğuna koyduk dikkat ederseniz. Bunu yapmamızın sebebi socket oluşturmanın da bağlantı kurmanın bir parçası olmasıdır. Eğer bu parça doğru gerçekleşmez ise devam etmenin bir anlamı yoktur. İşte bu yüzden herhangi bir hata durumunda olacakları belirtmek için catch kısmını ekliyoruz. Görüldüğü üzere catch kısmında ilk tanımladığımız “onBluetoothConnectingListener” listener’ındaki “onFailure” metodu çalışacak. Yani bu demek oluyor ki bağlantı kurulurken bir hata olması durumunda “onFailure” metoduna biz ne yazdıysak o gerçekleşecek. “onFailure” metodunda ne olacağını da bağlantı sayfasında belirteceğiz.  Socket oluşturma işlemi başarılı bir şekilde gerçekleşirse aşağıda geçici socket’imizi gerçek socket’imizin içerisine koyuyoruz. Ancak yine öncesinde geçici socket dolu mu değil mi diye kontrol ediyoruz. Arkadaş daha yeni doldurduk niye kontrol ediyoruz derseniz, evhamlı olmak kod yazarken işinize yarayabilir. Çünkü siz doldurduktan hemen sonra ufak bir hata ile tekrar istemediğiniz durum oluşabilir. Gördüğünüz gibi bir kez daha keşif işlemi olmasına karşın bunu iptal etme kodunu yazdık ve yine bir try-catch bloğu içerisinde bağlantımızı “bluetoothSocket.connect” ile başlattık. Eğer bağlantı başarılı ise “onBluetoothConnectingListener” içerisinde tanımladığımız “onSuccess” metodu, başarısız ise “onFailure” metodu çalışacak. Bu sayede bağlantı başarılı veya başarısız olduğu durumlarda neler olmasını istiyorsak bunu bağlantı sayfasında kolayca tanımlayabileceğiz. Sanıyorum ki taşlar yavaş yavaş yerine oturmaya başladı 🙂

Thread’imize son olarak “cancel” metodunu ekliyoruz ki istediğimiz zaman Thread’i sonlandırabilelim. Eveeet, bağlantıyı başarıyla kurduk. Şimdi veri alışverişinin gerçekleşebilmesi için gereken Thread’imizi tanımlayacağız. Bunun için “connected” metodunu kullanıyoruz ki bağlantı başarılı olursa bağlantı sayfamızda veri alışverişi Thread’ini başlatabilelim.Bu noktada metotlarla ilgili şu bilgiyi vermekte fayda olduğunu düşünüyorum. En başta dediğim gibi şu an üzerinde durduğumuz class bizim bağlantı class’ımız ve içerisinde birbirinden farklı bazı işlemler gerçekleşiyor. Biz bu işlemlere bazı noktalarda müdahale etmek istiyoruz. İşte tam da bu işlevi gerçekleştirebilmek için metotlar tanımlıyoruz. Aslında metotlar bizim bağlantı sayfasında vereceğimiz görevleri class’a ve dolayısıyla içerisindeki işlemlere aktarıyor. Gördüğünüz gibi “connected” metodunda veri alışverişi Thread’imiz olan “ConnectedThread” başlatılıyor. “ConnectThread”te olduğu gibi öncelikle constructor tanımlıyoruz. Ancak bu sefer constructor’da bazı değişkenlerimiz var. Yukarıda oluşturduğumuz InputStream ve OutputStream’den başka, bu değişkenlerin geçicilerini oluşturduk ve “null” değeri atadık. Hatırlarsanız socket’te de buna benzer bir işlem gerçekleştirmiştik. Sonrasında, daha önce oluşturduğumuz socket’i kullanarak bu geçici değişkenleri doldurduk. Bunu bir try-catch bloğu içerisinde yaptık ve son olarak gerçek Input/Output Stream’leri geçicilerinin değerleriyle doldurduk. Şimdi run metodu ile devam ediyoruz:

Görüldüğü üzere önce bir byte dizisi oluşturduk, çünkü gelen veriler bu şekilde geliyor. Arkasından bir while döngüsüne giriliyor ancak dikkat ederseniz döngünün argümanı “true”. Bu demek oluyor ki içeride döngüden çıkacak bir komut verilmediği sürece döngü içindekiler çalışmaya devam edecek. Döngü içerisinde bir try-catch bloğu çalışıyor ve veri alımı gerçekleştiriliyor. Alınan veri de yukarıda tanımladığımız “incomingMessage” isimli değişkene konuluyor. E kardeşim tamam güzel okuyorsun, değişkeni dolduruyorsun da ben bunları nasıl göreceğim demeyin, çünkü bunun için bir metot tanımladık:

Bu “getIncomingMessage” metodu oldukça basit, alınan mesajı döndürüyor. Eğer ki “incomingMessage” değişkeni boş değilse anlıyoruz ki gelen bir mesaj var ve bu durumda tanımladığımız ikinci listener olan “onBluetoothConnectionListener” listener’ının içerisindeki “onRead” metodu çalışıyor. Biz de bağlantı sayfamızda “onRead” metodu içerisinde neler olacağını kodluyoruz ve veriyi alabiliyoruz. Bu şekilde okuma işlemi sürekli gerçekleşiyor. Eğer ki okumada bir sıkıntı oluşursa anlıyoruz ki bağlantıda bir problem var ve hemen catch kısmına giriyoruz. Bu kısımda görüldüğü üzere ikinci listener’ımızın içerisindeki “onConnectionLost” metodu çalışıyor. Biz de bağlantı sayfamızda “onConnectionLost” metodu içerisinde neler olacağını kodluyoruz. Bu sayede okuma işlemi üzerinden bağlantının varlığını da kontrol edebiliyoruz. Sizce de çok iyi değil mi 🙂

Şimdi gelelim yazma işlemine yani veri gönderme işlemine geçiyoruz. Veri gönderme sürekli olacak bir şey olmadığı için run komutunun içerisine koymak yerine dışarısında yeni bir metot olarak tanımladık. Eğer ki yazma işlemi de düzenli gerçekleşecek bir olay ise onu da run komutunun içerisine koyabilirsiniz. Biz şu şekilde bir metot oluşturuyoruz:

Gördüğünüz gibi metot argüman olarak bir byte dizisi alıyor. Yani biz bağlantı sayfamızda bir mesaj göndermek için byte dizisi oluşturacağız ve bu diziyi metoda argüman olarak vereceğiz.  Sonrasında ise write komutu ile kolayca veriyi gönderiyoruz. Okuma işlemini gerçekleştirmek için bir metot tanımladığımız gibi yazma işlemini de bağlantı sayfasından gerçekleştirmek için bir metot tanımlamamız gerekiyor:

Gördüğünüz “write” metodu oldukça basit, sadece Thread’deki write metodunu çalıştırıyor.

En son olarak da Thread’i kapatmak için bir “cancel” metodu ekledik ve işlemimiz tamamlandı. Dikkat edin, Thread’lerin içerisine yazdığını metodlar şu an üzerinde çalıştığımız class’In herhangi bir yerinden erişebilirsiniz ancak başka sayfalardan (activity) erişemezsiniz. Ekstra tanımladığımız metotları bu yüzden tanımlıyoruz. Bağlantı sayfasından bu metotlara erişebilmek için bir yol oluşturmuş oluyoruz.

Bağlantı class’ımıza ekleyeceğimiz son şey ise, bağlantıyı tamamen durdurmak için bir “stop” metodudur. Bu metotta gördüğünüz üzere Thread’lerdeki “cancel” metotlarını çalıştırarak bağlantıyı koparıyoruz. Böylece bağlantı class’ımız tamamlanmış oldu. Şimdi ise bağlantı sayfamızı oluşturmaya geçelim.

3.2 BAĞLANTI SAYFASI

Bağlantı aktivitemizde basit bir şekilde veri göndereceğiz. Veri okumanın mantığına da anlatacağım ancak şu anda fiziki olarak başka bir cihaza bağlanmadığımız için veri alma kısmını somut olarak gösteremeyeceğim. Aktivitemize layout ile başlıyoruz:

Gördüğünüz üzere gayet temiz bir layout’umuz var. Mesajımızı alacağımız bir adet EditText ve gönderme işlemi için bir adet buton var.

Eğer kod olarak değişiklikler yapmak isterseniz aşağıdaki text kısmına geçebilirsiniz.

Şimdi aktivitemizde tanımladığımız değişkenlere bir göz atalım:

Aktivitemizin isminin olduğu bir TAG’in altında iki adet feedback değişkeni var. Bunlar bildiğimiz String değişkenlerdir ancak kullanım amaçları sadece gönderme işleminin kontrolüdür. Burada mesaj gönderdikten sonra işlemin başarılı olup olmadığını görmek için bir feedback mekanizması kuruyoruz ve onun için bu değişkenleri kullanıyoruz. Daha sonra bağlantımız varsa kullanabilmemiz, yoksa yeniden oluşturabilmemiz için kullanacağımız “BluetoothConnectionService” class’ımızı görüyoruz. Onun haricinde BluetoothAdapter ve BluetoothDevice’ı zaten önceden görmüştük. Onun altında bir “ProgressDialog” görüyoruz.

Progress Dialog, bağlantı işlemi gerçekleştirilirken ufak da olsa bir süre geçeceği için o sürede kullanıcının sayfaya erişmesini engelleme için gösterdiğimiz bir nevi menüdür.

Progress Dialog’dan sonra cihazımızın adresi için bir “String address” değişkeni, okunan gönderilen mesajlar için String değişkenler, layout’ta bulunan buton ve EditText için değişkenler ve part-1’de nasıl oluşturulduğunu anlattığım yeni aktivite açmak için kullandığımız “OpenActivityClass”. Arada Handler değişkenini atladığımı farketmemiş olabilirsiniz. Bağlantı tamamlandığında veya veri alışverişinin başarıyla tamamlanıp tamamlanamaması durumunda ekranda kullanıcıya mesaj göstermek isteriz. Bildiğiniz bağlantı işlemi “BluetoothConnectionService” ile gerçekleştirilir ve benim az önce bahsettiğim durumlar hep bu class içerisinde oluşabilecek durumlardır. İşte böyle farklı bir class’ın aktivitede çalıştığı sırada mesaj göstermek istersek, handler kullanmamız gerekir. Şimdi “onCreate” metodunda yani aktivite açılırken neler olacağının yazılı olduğu metotta neler gerçekleşiyor inceleyelim.

Öncelikle ProgressDialog değişkenimize değer atıyoruz ve sırasıyla üzerinde yazacakları belirliyoruz. “setMessage” metodu dialog’un gövdesinde yazacak mesajı belirler. “setTitle” metodu dialog’un başlığını belirler. “setProgressStyle” metodu da  nasıl bir şekilde olacağını belirler. Yani gözünüze hangisi hoş geliyorsa onu seçebilirsiniz. “show” metodu ile de dialog’u başlatıyoruz. Yani aktivite açılmaya başladığı andan itibaren aynı anda dialog da başlar ve bu andan itibaren kullanıcı uygulamaya müdahalede bulunamaz. Ne zamana kadar, ta ki biz herhangi bir durumda dialog’u kapatana kadar. Çünkü dialog’un otomatik olarak belirli bir süre sonra kendisinin kapanması gibi bir durum söz konusu değildir. Daha sonra handler’a değer atadık, bir önceki aktivitede hangi cihaza tıkladıysak o cihazın adresini aldık, adapter’ı tanımlayıp device’a adresi kullanarak değer atadık ve buton ile EditText’imizi layout’taki karşılıkları ile eşleştirdik.

Şimdi bağlantıyı başlatmanın zamanı geldi, öncelikle “BluetoothConnectionService.getInstanceBCS” metodunu başlattık. Class’tan hatırlayacağımız üzere bu metot eğer hali hazırda bir bağlantı varsa onu alır, yoksa da yeni bir bağlantı başlatır. Metodun sonucunda bağlantı class’ına erişmiş olduk. Daha sonra class içerisinde kullanabilmek için “setDevice” metodu ile hangi cihaza bağlanacağımızı class’a söylemiş olduk. Bunun arkasından “startClient” metodu ile bağlantıyı başlattık. Yine hatırlayacağınız üzere “startClient” metodu “ConnectThread”i başlatarak bağlantının kurulacağı işlemlerin gerçekleşmesini sağlıyordu. Sonrasında class’ımızdaki “onBluetoothConnectingListener”a erişiyoruz. Class’ımızda bu listener’dan detaylıca bahsetmiştik ve içerisinde iki adet metot barındırdığını söylemiştik. İşte burada o metotlara girildiğinde neler olacağını tanımlıyoruz. “onSuccess” metoduna girilirse açık olan dialog’u kapatarak kullanıcının bağlantı sayfasını kullanabilmesine izin veriyoruz, bağlantının başarılı olduğuna dair mesaj bırakıyoruz ve class’ımızdaki “connected” metodunu çalıştırıyoruz. Bu metot ile veri alışverişinin de yolu açılmış oluyor. Eğer “onFailure” metoduna girilirse de dialog yine kapanıyor, mesaj ile bağlantının başarısız olduğu kullanıcıya bildiriliyor ve başlangıç aktivitesine geri dönülüyor. Eğer bu geri dönem işlemini yapmaz ve bağlantı sayfasında kalırsanız kullanıcı bağlantı olmamasına rağmen veri göndermeye çalışabilir ve bu beklenmedik problemlere yol açabilir.

Devamında da görüldüğü gibi class’ımızda tanımladığımız diğer listener olan “onBluetoothConnectionListener”a erişiyoruz. Burada da yine class’ımızda detaylıca konuştuğumuz gibi “onConnectionLost” ve “onRead” metotlarını görüyoruz. Eğer “onConnectionLost” metoduna girilirse bağlantının kesildiğine dair mesaj bırakıyoruz ve yine bağlantı kesildiği için başlangıçtaki aktiviteye geri dönüyoruz. Eğer “onRead” metoduna girilirse bir veri alındığı anlıyoruz ve class’ımızda tanımladığımız “getIncomingMessage” metodunu kullanarak gelen veriyi kendi değişkenimize aktarıyoruz. Eğer biz bir gönderme işlemi yaptıktan hemen sonra FEEDBACK_OK değişkenindeki mesaj gelirse işlemin başarılı olduğunu, FEEDBACK_ERR değişkenindeki mesaj gelirse de işlemin başarısız olduğunu anlıyoruz. Peki bize geri cevap nasıl geliyor ? Bu konunun bizim uygulamamızla doğrudan bir bağlantısı yok. Normal şartlarda hangi cihaz ile bağlantı kuruluyorsa o cihaz için de bir uygulama olacak ve siz o cihaza feedback mekanizmasını kodlamış olacaksınız. Yani o biz bir mesaj gönderdiğimizde  cihaza başarıyla ulaşıyorsa o cihaz da bize FEEDBACK_OK geri dönüşünü yapacak ve biz de anlayacağız.

Son olarak da butona tıklandığında ne olacağını kodluyoruz. Görüldüğü üzere EditText’teki mesajı alıp kendi değişkenimize yerleştiriyoruz ve string olan mesajımızı bir byte dizisine çeviriyoruz. Daha sonra da class’ımızda veri gönderme işlemi için tanımladığımız “write” metodunu kullanarak veri gönderme işlemini gerçekleştiriyoruz.

Şimdiye kadar birkaç defa tekrar ettim ancak çok önemli olduğu için yazımın sonunda tekrar özet geçmek istiyorum. Projemizin ikinci kısmında bir bağlantı class’ına bir aktiviteden erişerek işlemler yapmak üzerine çalıştık. Class’ımız bağlantıyı kurma ve veri alışverişini sağlama üzerine temel işlemleri yerine getiriyor. Ancak biz bağlantı kurulurken bir hata olduğunda, bağlantı koptuğunda, okunacak veri geldiğinde, veri göndermek istediğimizde ve bunun gibi birkaç durumda daha farklı işlemlerin gerçekleşmesini istiyoruz. Bunun için başka bir aktiviteden class’ın içerisindeki (aslında Thread’lerin içerisindeki) metotlara erişmemiz gerekiyor. Bunu yapabilmek için class’ta Thread’lerin haricinde metotlar tanımladık. Bu metotları da aktivitemizde kullanabildik ve bu sayede aktiviteden class’ımızı istediğimiz gibi kontrol edebildik.

Evet arkadaşlar bu yazımı da tamamlamış bulunuyorum. Android Studio platformunda Java ile bir Bluetooth uygulaması yazmanın detaylarını size anlattım. Projemizin tamamına github hesabım üzerinden erişebilirsiniz. Eğer bir sorunuz olursa yorum bırakabilir veya benimle iletişim kurabilirsiniz. Teknolojiyle kalın efendim 🙂