Bluetooth teknolojisi oldukça komplekstir. Aslında bu, Bluetooth’un yapabildiği işler düşünüldüğünde çok da şaşırtıcı sayılmaz. Temel de RS 232 veri kablolarına, kablosuz alternatif üretmek için geliştirilmiş ve üç çekirdek protokolden oluşan bir seri haberleşmedir. Bu protokoller; Mantıksal link ve bağdaştırma protokolü (L2CAP – Logical Link Layer and Adaptation Protocol), Servis Keşif Protokolü (SDP – Service Discovery Protocol) ve Radyo Frekansı Haberleşme Protokolü (RFCOMM – Radio Frequency Communication) olarak bilinir.
Android Programlamada bizim kullanacağımız Bluetooth ile ilgili dört temel sınıf var.
BluetoothAdapter: Uygulamanın üzerinde çalıştığı cihaz ile ilgili işlemler yapmak için bu sınıf kullanılır.
BluetoothDevice: Haberleşme yapılan karşı cihaz ile ilgili işlemler yapmak için ise bu sınıf kullanılır.
BluetoothSocket: Haberleşmede bağlantının kurulması ve veri transferi için bu sınıf kullanılır.
BluetoothServiceSocket: Haberleşme de kullanılan cihazın “server” gibi davranması ve diğer cihazları dileyip işlem yapması isteniyorsa bu sınıf kullanılıyor.
Aslında eğer ingilizceniz varsa bu konu Android Studio’nun kendi web sayfasında örneklerle ve çok güzel bir şekilde anlatılmış. Buraya göz atabilirsiniz.
BluetoothAdapter sınıfını bir önceki yazımda kullanarak cihazın isim ve mac adresini sorgulayan bir örnek program vermiştim. Bluetooth Adapter sınıfı cihazın Bluetooth özelliğini destekleyip desteklemediğini ve cihazda bluetooth kapalıysa bluetooth’u açmak için kullanılabilir. Mesela aşağıdaki kod parçası Bluetooth Kapalıysa Bluetooth’u açar.
if (!mBluetoothAdapter.isEnabled()) { // Bluetooth Kapalıysa Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); // Bluetooth'u aç }
BluetoothAdapter sınıfı ile aynı zamanda haberleşme yapılacak cihazların bulunması da sağlanır. Mesela aşağıdaki kod parçası Bluetooth üzerinde eşleşmiş cihazları bulmaya yarar;
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); // Eşleşmiş Cihazlar için bir Array Oluşturuluyor. if (pairedDevices.size() > 0) {// Eğer eşleşmiş cihaz varsa for (BluetoothDevice device : pairedDevices) {// Eşleşmiş cihaz sayısı kadar bu loop dönecektir. mArrayAdapter.add(device.getName() + "\n" + device.getAddress());// Daha önceden belirlenmiş marrayadapter listesine bu cihazların mac adresi ve isimleri ekleniyor. } }
Herhangi bir cihaza bağlanarak cihaza veri göndermek ve ya veri almak için BuetoothDevice ve BluetoothSocket sınıfları kullanılıyor. Mesela aşağıdaki kod parçası belirli isimdeki bir cihaza bağlantı kurmak için kullanılır.
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); // Eşleşmiş Cihazlar için bir Array Oluşturuluyor. BluetoothDevice Baglanilacak_Cihaz==null // Bağlantı kurulmak istenilen cihaz tanımlanıyor. if (pairedDevices.size() > 0) {// Eğer eşleşmiş cihaz varsa for (BluetoothDevice device : pairedDevices) {// Eşleşmiş cihaz sayısı kadar bu loop dönecektir. if(device.getName()=="İstenilen Cihaz İsmi") // Eğer eşleşmiş cahzlar arasından istenilen cihaz ismini bulursa; { Baglanilacak_Cihaz=="İstenilen Cihaz İsmi"; // Bağlanılacak cihaz nesnesine istenilen cihaz ismini ata break; } } }
Son olarak ise cihaza veri gönderme ve veri alma işlemi kaldı. Bunun için ise BluetoothSocket sınıfını kullanacağız. Burada iki cihaz arasında bir Socket oluşturulup bağlantının kurulabilmesi için bir UUID tanımlanması gerekiyor. UUID açılımı Universally Unique Identifier olarak geçiyor. UUID 128 bit, string ID dir. Bu ID ne işimize yarıyor? Yazdığımız uygulamanın haberleşmesine verilen bir ID dir aslında. Yazdığınız uygulama üzerinden istenilen cihazla haberleşirken bu ID kullanılır ve bu ID haberleşmede sizin uygulamanızı tanımlayan bir ID olup sizin seçtiğiniz bir ID dir. Uygulamanızın UUID sini belirlerken internette bulunan bir çok UUID generator’ü kullanabilirsiniz. createRfcommSockettoServiceRecord() fonksiyonu uygulamamıza bu ID yi atamamıza yarıyor. Mesela Aşağıdaki kod parçası istenilen bir cihaz ile socket oluşturup veri transferi yapmaya yarar;
UUID uuid=UUID.fromString("20:13:04:24:20:51") // bir UUID seçildi BluetoothSocket socket=createRfcommSockettoServiceRecord(UUID); //Soket bağlantısı oluşturuluyor. socket.connect(); // Soket bağlantısı Açılıyor;, OutputStream strm=socket.getOutputStream(); // gönderilecek veri bulutu oluşturuluyor OutputStreamWriter osw=new OutputStreamWriter(strm); // Veriyi buluta yazacak ara nesne oluşturuluyor osw.Write("A"); // "A" karakteri istenilen cihaza gönderiliyor. osw.Close(); strm.close(); socket.close();
Böylece veriyi cihaz üzerine göndermiş olduk. Veri okuma işlemi için is InputStream, getInputStream() ve read(byte[]); fonksiyon ve nesneleri kullanılır.