Burak. | Stay With Tech

ANDROID İLE BLUETOOTH UYGULAMASI – PART 2

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ı, 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 🙂

Yanda 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 nokta 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.

ÖNEMLİ: Ş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 🙂

RSS
LinkedIn
Share
Instagram
Twitter
Visit Us
Follow Me

Categories: ANDROİD, YAZILIM

ADVANCED ENCRYPTION STANDARD – ALGORİTMA » « ANDROID İLE BLUETOOTH UYGULAMASI – PART 1

37 Comments

  1. Berat Batuhan Keten

    24 Mart 2018 — 16:53

    Merhaba Burak Bey,

    Öncelikle elinize sağlık çok güzel bir çalışma. Sizi örnek alarak bir uygulama yazmaya çalışıyorum da bende bir sıkıntı ile karşılaştım. Sizin adımlarını gerçekleştirdiğimde bluetooth socket ile ilgili bir hata alıyorum bluetooth ile bağlantı sorunu var. Açık olan cihazları gösterip tıklayabiliyorum ancak öteki sayfaya hiç geçemedim. Sizce sıkıntı ne olabilir. Birde daha sonrasında sesi yazıya dönüştüren google hizmetini kullanarak stringleri arduino mikro işlemcisine yönlendirmek istiyorum. Bir öneriniz var mıdır benim için? Tekrardan elinize sağlık.

  2. Merhabalar Berat Bey,

    Öncelikle teşekkür ederim, faydalı olabildiysem ne mutlu. Ben de uzun bir süre socket ile ilgili hata aldım ve saç yoldurdu diyebilirim. Tahminim UUID kodunu yanlış girmiş olabileceğiniz yönde, ancak hata mesajını bana mail atabilirseniz daha detaylı inceleme fırsatım olur.

    Arduino ile veri aktarımı yapmak benim de en çok yaptığım şeydi denemeler yaparken, android uygulamayı deneyebilmek için genelde arduino kullandım ve bu sayede o kısmı da az çok çözdüğümü söyleyebilirim. Arduino’ya int ve String gibi birçok farklı veri tipini göndermeniz mümkün. Yani sesi String’e çevirdikten sonra yapmanız gereken tek şey o String’i bir byte dizisine çevirmek ve göndermek. Gönderdiğiniz formatta arduinoda görebilirsiniz. Daha detaylı sorularınız olursa bana mail vasıtasıyla ulaşabilirsiniz, her konuda yardımcı olmaya çalışırım. Kolay gelsin 🙂

    • Berat Batuhan Keten

      26 Mart 2018 — 20:01

      Tekrar merhaba Burak Bey,

      Bende aynı şeyden şüpheleniyorum UUID çok fazla UUID kodu denememe rağmen hiç biri olmadı. Arduino kısmı için mailden iletişime geçmem daha doğru olur sanırım ancak mailinizi göremedim. Müsait bir zamanınızda tecrübelerinizden bilgi almak isterim .

  3. Mehmet Çekici

    26 Mart 2018 — 15:11

    Öncelikle paylaşımınız için çok teşekkür ederim. Anlayarak öğrenmeme çok yardımcı oldu.
    sadece aşağıdaki kısım çalışırken
    readBytes=ınputStream.read(readBuffer);
    incomingMessage=new String(readBuffer,0,readBytes);
    Log.d(TAG,”InputStream: “+incomingMessage);

    arduinodan ne gelirse gelsin
    D/BaglantiServisi: InputStream: � seklinde (� birden fazla olabiliyor) geliyor.
    bu problemi nasıl aşabilirim.

  4. Merhabalar Mehmet Bey,

    Öncelikle ilgi gösterdiğiniz için ben teşekkür ederim. Anladığım kadarıyla gelen veri Android Studio tarafından tanımlamayan bir veri olduğu için öyle gösteriyor. Bunun için new String() fonksiyonunun nasıl çalıştığına ve onun muadillerine bakmak lazım.
    https://developer.android.com/reference/java/lang/String.html linkini biraz incelemenizi tavsiye ediyorum.

    https://stackoverflow.com/questions/17912640/byte-and-char-conversion-in-java linkinde yaşadığınız problem çözülmüş gibi duruyor. Bir deneyip sonucu bildirirseniz tekrar tartışabiliriz.

  5. Merhaba Burak bey. Araştırdığım konu ile ilgili çok güzel bir makale yayımlamışsınız, elinize sağlık. İki yazıyıda yazıcıdan çıktı aldım satır satır inceliyorum ancak bazı class’lar nerede başlıyor, tam olarak içeriği nedir göremiyorum, anlayamıyorum. Bu anlamda, konuya hakim olabilmem için mümkün ise kodları paylaşmanızı rica ediyorum. Tekrar teşekkür ederim.

  6. Heyecanla bekliyorum. Tekrar teşekkür ederim.

    • Merhaba Mustafa Bey,

      Kodların paylaşımı anlamında yeni bir GitHub sekmesi oluşturmak yerine bu yazının sonuna linki ekledim. Kodlara oradan ulaşabilirsiniz.

      İyi çalışmalar dilerim.

  7. Çok teşekkür ederim. Başarılı çalışmalarınızın devamını diliyorum.

  8. Merhaba Burak Bey,
    Paylaştığınız kodu çalıştırmaya uğraşıyorum ama ConnectedActivity.java Class’ında
    address=dvc.address;
    System.out.println (“adres bilgisi………….” + address);
    bluetoothDevice = bluetoothAdapter.getRemoteDevice(address);

    kısmında değer null dönüyor. Sebebi ne olabilir acaba?

    Aldığım hata :

    Caused by: java.lang.IllegalArgumentException: null is not a valid Bluetooth address
    at android.bluetooth.BluetoothDevice.(BluetoothDevice.java:610)
    at android.bluetooth.BluetoothAdapter.getRemoteDevice(BluetoothAdapter.java:479)
    at com.mrozpoyraz.bluetoothproject.ConnectedActivity.onCreate(ConnectedActivity.java:56)

  9. Merhabalar,

    Sanıyorum ki cihazlar listesinden bir cihaza tıkladığınızda connectedActivity kısmında cihazı almaya çalışırken adres “null” olarak gözüküyor. Bu da demek oluyor ki;
    – intent.getStringExtra(“Device Address”);
    satırında “Device Address” olarak belirlediğiniz şey ile openActivityClass içindeki openActivityWithSendingAddress() metodunda kullandığınız;
    – intent.putExtra(“Device Address”, address);
    satırındaki ile aynı olduğuna dikkat edin. Umarım probleminize çözüm olur. Kolay gelsin.

  10. hocam,
    ConnectedActivity.java class içindeki
    address=dvc.address ; kod satırını aşağıdaki
    dvc.address=address; kod ile değiştirince “bonded device” butonu çalışmaya başladı.
    Saygılar…

  11. Merhaba Burak Bey,

    Bu programlama dilinde daha çok yeniyim aslında elektronik programcısıyım ve bir kart ile iletişim kurmaya çalışıyorum. Kodlarınızı çalıştırmaya çalışıyorum fakat bulunan BT cihazına tıkladığımda UUID ile ilgili sorunu bir türlü halledemedim;
    ConnectThread: run(), Could not connect to UUID: 00001101-0000-1000-8000-00805f9b34fb
    buradaki yapılması gereken nedir acaba ??

    • Merhaba Barış Bey,

      Bildiğim kadarıyla bazı cihaz türleri, mesela bluetooth kulaklık, farklı UUID kodu gerektiriyor. Benim yazdığım kod genel olarak telefonlarda geçerli oluyor. Siz ne tür bir cihaza bağlanmaya çalışıyorsunuz ?
      Farklı UUID kodlarını internette bulup deneyebilirsiniz, yine olmazsa bana mail atınız, detaylı inceleyebiliriz. Örneğin benim bulduğum farklı bir kod:
      “00001108-0000-1000-8000-00805F9B34FB”
      kulaklıklar için kullanılıyormuş.
      Kolay gelsin.

      • Merhaba Burak bey tekrardan,

        aslında listede hem telefon hemde pc var, ben ikisinede bağlanamadım. bilgisayarın UUID adresini buldum ve değiştirdim ama yine aynı problemi aldım. Belki başka biryede hata yapıyorum ama onuda bulamadım açıkçası. Yenıtınız için teşekkür ederim.
        logcat bu sefer resim olarak ekliyorum buraya resimag.com/1b6dd5bd3d.png

  12. Logcat’i inceledim Barış Bey, gördüğüm kadarıyla hata socket’ten kaynaklanıyor. Ben de uzun süre bu hata ile uğraştım. Ben de daha sonra UUID kodunu düzelterek problemi ortadan kaldırmıştım, ancak şu an kestiremiyorum hatanın nereden kaynaklanmış olabileceğini. Kodunuzu mail olarak benimle paylaşırsanız belki daha faydalı bir geri dönüş yapabilirim.
    İyi çalışmalar.

    • merhaba bluetooth chat uygulaması yazıyorum fakat belli yerlerde hata alıyorum yardımcı olurmusunuz
      connectedThread.cancel(); dediğimde cancel kırmızı renk olarak hata veriyor ve new connectedThread dediğimdede altı çizili hata alıyorum nasıl düzeltebilirm lütfen yardmcı olurmusunuz üni bitirme projem

  13. İyi günler Burak Bey;
    Projenizi indirdim , ve bluetooth 4.0 üzerindeki bir cihaza bağlanmaya çalıştım ama söyle bir sorunla karşılaştım . soket üzerinde connect olurken bağlanmayı bekliyor ve timeout düşüyor , uuid değiştirdim ama aynı hata ile karşılaştım.Eğer böyle bir hata ile kaşılaştıysanız ,yardımcı olursanız çok sevinirim.
    iyi çalışmalar.

    • Merhaba Erol Bey,

      Bahsettiğiniz probleme benzer bir problemi ben de yaşamıştım. Socket’e bağlanmakta problem yaşıyordu ancak ben UUID’i yanlış girdiğimden kaynaklanan bir durumdu. Daha detaylı bilgi verebilirseniz yardımcı olmaya çalışayım.

      İyi çalışmalar dilerim.

  14. slm vermiş olduğunuz bilgiler için tşk ederim. 10 gündür vermiş olduğunuz kodlarla boğuşuyorum. yapmak istediğim elimdeki stm32 kitinden basit bir değeri android üzerinden cep telefonuna bluetooth ile gönderebilmek, ne var ki bir türlü başarı sağlayamadım. sizin koddaki ConnectedActivity kısmına bir Textview ekleyip burada bu datayı göremedim. nerde hata yaptığım konusuna bir çözüm bulamadım yardımcı olabilirmisiniz?

  15. Burak Hocam Selamlar, elinize sağlık müthiş bir ders olmuş, devamını bekleriz. Kolay Gelsin

  16. abdullah erturk

    9 Kasım 2019 — 23:55

    İyi akşamlar burak bey, paylaşımınız için emeğinize sağlık. arduino ile led uygulaması yaptım. sorum şu ki, telefonum başka cihazlarla da eşleştirilmiş durumda, uygulamayı açınca direk arduinyo ya bağlanması için nasıl bir yol izlemeliyim. tekrar paylaşımınız için teşekkürler.

    • Merhaba Abdullah Bey,
      Discover işleminin tamamlanmasının ardından tıklanan cihaza değil de direk sizin manuel olarak bilgilerini girdiğiniz cihaza bağlanmasını sağlamayı denerseniz sonuç alabilirsiniz.

      İyi çalışmalar dilerim.

  17. hocam elinize sağlık fakat gradle dosyası eski olduğu için açılmıyor suanda rica etsem düzeltip atma imkanınız var mı yeniyim androidde ben anlamadığım için yapamıyorum teşekkürler

  18. Sevgi Güçlü

    6 Mart 2020 — 19:56

    Merhaba Burak Bey, öncelikle teşekkürler emeğiniz için. Sizin çalışmanızdan fazlaca yararlanarak bir proje yapıyorum.Fakat broadcast receiver kısmı çalışmıyor. Yaptığım araştırmalar sonucunda bi yere varamadım, acaba yardımcı olabilir misiniz? Kolay gelsin 🙂

    • Merhaba Sevgi Hanım,

      Tam olarak nasıl bir hata aldığınızı öğrenebilirsem daha iyi yardımcı olabilirim.

      İyi çalışmalar dilerim,
      Burak.

      • Sevgi Güçlü

        6 Mart 2020 — 21:06

        E/AwareLog: AtomicFileUtils: readFileLines file not exist: android.util.AtomicFile@c0eaa42
        E/: APS:IFLoad:importExternalFunctions, search function createNewHwApsUtils failed, dlsym err:undefined symbol: createNewHwApsUtils
        Pardon, gözümden kaçmış. Aldığım hatalar bu şekilde.
        Teşekkürler.

  19. Sevgi Güçlü

    6 Mart 2020 — 20:49

    Hata almıyorum ama oluşturduğum toast mesajları ve loglardan anladığım kadarıyla registerReceiver çağrısı ile çalışması gereken receiver çalışmıyor.İsterseniz kodu mail olarak atabilirim daha anlaşılır olur diye düşünüyorum.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Copyright © 2020 Burak. | Stay With Tech

Theme by Anders NorenUp ↑