RSSI-Messungen von Bluetooth auf Android
Von Christoph Fabritz am 24.04.2014
Bei RSSI handelt es sich um die Stärke, mit welcher ein Signal empfangen wird. Dies kann (mit Vorsicht) als Entfernungs-Indikator zwischen zwei Geräten genutzt werden.
Wer solche Messungen mit Bluetooth auf Android-Geräten schon einmal durchgeführt hat, muss schnell feststellen, dass ein fortlaufendes Auslesen dieses RSSI-Wertes in Android nicht so einfach funktioniert. Dies liegt daran, dass dar Event zum Auslesen nur gefeuert wird, wenn ein neues Gerät gefunden wurde. Da das andere Gerät nach dem ersten Mal schon bekannt ist, bekommt man nur eine einzelne Momentaufnahme des Wertes, was Beobachtungen über die Zeit schwer macht. Verändert sich der Abstand der Geräte zueinander, muss man die Mess-Applikation daher neu starten.
Um den Messvorgang einfacher zu gestalten, habe ich eine einfache Funktion geschrieben, die auch für andere Entwickler und Tüftler interessant sein könnte.
package com.example.rssi_test.app; 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.util.Log; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bluetooth_search(); } public void bluetooth_search() { final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { return; } if (!mBluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, RESULT_OK); } registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, (short) 0); Log.i("rssi", "" + rssi); unregisterReceiver(this); mBluetoothAdapter.cancelDiscovery(); bluetooth_search(); } }, new IntentFilter(BluetoothDevice.ACTION_FOUND)); mBluetoothAdapter.startDiscovery(); } }
Diese einfache Funktion registriert einen Handler, welcher feuert, wenn ein Gerät entdeckt wurde. Es wird der RSSI ausgelesen, der Handler entfernt und die Erkennung neugestartet. Dadurch kann dasselbe Gerät mehrmals ausgelesen werden.
Hier sind ein paar meiner Messungen.
Entfernung [m] | RSSI min | RSSI max |
---|---|---|
0.5 | -48 | -51 |
1 | -54 | -62 |
2 | -69 | -79 |
3 | -77 | -86 |
4 | -76 | -81 |
Wie man sieht, sind die Werte nicht allzu aussagekräftig. Falls man erkennen will, ob jemand durch eine Tür geht, würde ich jedoch nach einem RSSI-Wert größer (positiv größer) -60 Ausschau halten.
The comments are closed.