Skip to content

Android’de Bluetooth Cihazlarını Taramak ve RSSI Değerini Almak

İstanbul Teknik Üniversitesi, Elektrik-Elektronik Mühendisliğinde RSSI ile konum belirleme ve haritalama ile ilgili bir çalışma yapılmış. Alınan İşaret Gücü Göstergesi olarak türkçeleştirilmeye çalışılan RSSI(received signal strength indicator) bu çalışmaya, daha az maliyetle konum belirleme ve haritalama yapabildiği için girmiş. Ayrıca kapalı mekanda gps kullanımı sorun oluşturacağı için (gps uydu iletişimi gerektirir) rssi değerlerine göre uzaklık ölçümü ve haritalama yapılmaya çalışılmış.

Android’deki bluetooth cihazındaki RSSI değerini projede gözüme çarpan ilk uzaklık formülüne yerleştirsem sonuç alabilme ihtimalini düşündüğümden denedim. Sonuç pek iç açıcı değildi. Sonra projeyi okuyunca gördüm ki yayının yapıldığı frekans ve çıkış gücü seviyelerini hesaba katmamışım. RSSI değerinden elde edeceğim değerler bu yüzden sağlıklı değildi. Cihazımla farklı uzaklıklarda ölçüm yapıp (projede 500 ölçüm yapılmış) çıkarılacak grafiğin formülüne göre uzaklık hesaplayabilirsem kodun sadece formül kısmını değiştirerek doğru hesaplama yapabileceğim. (Bu yazının yazılış amacı da bunu internete not düşmek)

Programın kodlarına bakalım. Önce arayüzü inceleyelim.

Screenshot from 2013-05-30 00:46:12

Bluetooth durumu için iki tane text view kullanıyoruz. Yandaki görselde onlar gözükmüyor ama xml kodlarına bakılırsa görülecektir. Bir text view görünür şekildedir.

Bir tane buton ve bir de listview eklenmiştir. Bunlar kod yazılmadan arayüz programı sayesinde kolaylıkla oluşturulabilir veya aşağıdaki xml verisini doğrudan kullanabilirsiniz.

Grafiksel düzen için xml kodları:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/bluetoothstate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/bluetoothstate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Set Discoverable Duration"
/>

<Button
android:id="@+id/scandevice"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:text="Bluetooth Araçlarını Ara" />

<ListView
android:id="@+id/devicesfound"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>

İnternette araştırdıysanız  bluetooth tarama ile ilgili kodların hepsi hemen hemen aynı fakat rssi değerini alma ile ilgili fazla örnek yok. Aşağıdaki kod taramanın yanı sıra rssi değerini alıyor ve hatalı olarak uzaklık hesaplıyor.


package com.scanbluetooth;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

private static final int REQUEST_ENABLE_BT = 1;

ListView listDevicesFound;
Button btnScanDevice;
TextView stateBluetooth;
BluetoothAdapter bluetoothAdapter;

ArrayAdapter<String> btArrayAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnScanDevice = (Button)findViewById(R.id.scandevice);

stateBluetooth = (TextView)findViewById(R.id.bluetoothstate);
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

listDevicesFound = (ListView)findViewById(R.id.devicesfound);
btArrayAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1);
listDevicesFound.setAdapter(btArrayAdapter);

CheckBlueToothState();

btnScanDevice.setOnClickListener(btnScanDeviceOnClickListener);

registerReceiver(ActionFoundReceiver,
new IntentFilter(BluetoothDevice.ACTION_FOUND));
}

@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(ActionFoundReceiver);
}

private void CheckBlueToothState(){
if (bluetoothAdapter == null){
stateBluetooth.setText("Bluetooth NOT support");
}else{
if (bluetoothAdapter.isEnabled()){
if(bluetoothAdapter.isDiscovering()){
stateBluetooth.setText("Bluetooth is currently in device discovery process.");
}else{
stateBluetooth.setText("Bluetooth is Enabled.");
btnScanDevice.setEnabled(true);
}
}else{
stateBluetooth.setText("Bluetooth is NOT Enabled!");
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);//Bluetooth açma isteği gönderir
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);//Kabul ederseniz açar
}
}
}

private Button.OnClickListener btnScanDeviceOnClickListener//butona tıklandığında
= new Button.OnClickListener(){

@Override
public void onClick(View arg0) {

btArrayAdapter.clear();//Eski bluetooth bilgileri silinir
bluetoothAdapter.startDiscovery();//bluetooth aracı taramaya başlar
}};

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if(requestCode == REQUEST_ENABLE_BT){
CheckBlueToothState();
}
}

private final BroadcastReceiver ActionFoundReceiver = new BroadcastReceiver(){

@Override
public void onReceive(Context context, Intent intent) {

String action = intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
float rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);//rssi değerini almak için oluşturulan intent
float d = (float) (0.4425*rssi*rssi+10.2174*rssi+78.6547);//projede kullanılan formül burada uygulandı, bu cihaz için doğru sonuç vermiyor
btArrayAdapter.add(device.getName() + "n" + device.getAddress()+"n"+rssi+" dbm "+"uzaklık = "+d);
btArrayAdapter.notifyDataSetChanged();
}

}};

}

Sonuçta aşağıdaki gibi bir görüntü ortaya çıkmaktadır.
SC20130530-010811
rssi değeri çabuk değişebilen bir değerdir. Eğer iki cihaz arasına herhangi bir cisim girerse rssi değeri etkilenmektedir. RSSI değeri çevreden etkilenebilen bir değer olduğu için sağlıklı uzaklık bilgisi vermez. Fakat uzaklık hakkında nisbi olarak bilgi verebilir ve kullanılabilir.

Be First to Comment

Bir Cevap Yazın

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