Get bluetooth signal strength
Asked Answered
R

4

47

I want to get the Bluetooth signal strength of an another device which connected to my phone,

How can I get the Bluetooth signal strength?

I tried to search a lot over google and did not find any answer.

Does someone know how can I implement it?

this is myActivity:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private final BroadcastReceiver receiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {

            String action = intent.getAction();
            if(BluetoothDevice.ACTION_FOUND.equals(action)) {
                int rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);
                Toast.makeText(getApplicationContext(),"  RSSI: " + rssi + "dBm", Toast.LENGTH_SHORT).show();
            }
        }
    };

}

I also has a Bluetooth permission in my manifest file.

Reference answered 9/3, 2013 at 16:11 Comment(3)
#3020907Obligatory
i already saw it, however there is no any example of how to find the signal strength..maybe can you help me?Reference
I think your code is Ok. In order to see the Toast you need to execute a Discover first.Rumney
C
48

To get the signal you can check Bluetooth RSSI, you can read RSSI for connected devices, or perform a Bluetooth discovery to check the RSSI for any nearby devices.

Basically a Bluetooth discovery is a broadcast to all stations within range to respond back. As each devices responds back, Android fires off an ACTION_FOUND intent. Within this intent you can getExtra EXTRA_RSSI to obtain the RSSI.

Note that not all bluetooth hardware supports RSSI.

Also Related: Android IRC Office Hours Question About Android Bluetooth RSSI here is a Bluetooth Classic broadcast receiver example

private final BroadcastReceiver receiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        if(BluetoothDevice.ACTION_FOUND.equals(action)) {
            short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);
            Toast.makeText(getApplicationContext(),"  RSSI: " + rssi + "dBm", Toast.LENGTH_SHORT).show();
        }
    }
};
Concertante answered 9/3, 2013 at 16:31 Comment(10)
can you give me an example, how can i reed the RSSI and get from it the bluetooth strength?Reference
thanks alot, i wrote this code, however when i paired with device it does not show me in Toast the signal strength, do you have another way? i also add my activity to the main threadReference
EXTRA_RSSI value is a short type instead of int change it and then checkConcertante
Don't forget to accept his answer if you're happy with it(The green icon left of the answer)Lizettelizotte
i will accept it, its still doesnt work for me... @Arvind, the EXTRA_RSSI value is short and not int in my code, i also updated my code(in the main thread) however it still does not workReference
I telling you to change it from short to int .Take into consideration that rssi values are usually negative (it could be dBm )Concertante
i changed it to int instead of short, however still when i get paired with another device it does not show any Toast..do you have another suggestion?thanks alotReference
You forget to change Integer.MIN_VALUEConcertante
i changed it, still show me nothing...maybe something wrong with my code above?Reference
I think your code is Ok. In order to see the Toast you need to execute a Discover first.Rumney
R
36

I think your code is ok, but you need to implement startDiscovery() in order to see results.

The true is that BluetoothDevice.EXTRA_RSSI only works for discovering devices, when you connect to one of them you are not able any more to get its RSSI.

Here I developed a very simple sample of an Activity that permit you see the RSSI of the devices near to you. You first need to add a TextView and a Button to your layout, then enable the Bluetooth Adapter and then just click the button.

package com.in2apps.rssi;

import android.os.Bundle;
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.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class RSSIActivity extends Activity {

    private BluetoothAdapter BTAdapter = BluetoothAdapter.getDefaultAdapter();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rssi);
        registerReceiver(receiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));

        Button boton = (Button) findViewById(R.id.button1);
        boton.setOnClickListener(new OnClickListener(){
            public void onClick(View v) {
                BTAdapter.startDiscovery();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_rssi, menu);
        return true;
    }

    private final BroadcastReceiver receiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {

            String action = intent.getAction();
            if(BluetoothDevice.ACTION_FOUND.equals(action)) {
                int rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);
                String name = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
                TextView rssi_msg = (TextView) findViewById(R.id.textView1);
                rssi_msg.setText(rssi_msg.getText() + name + " => " + rssi + "dBm\n");
            }
        }
    };
}

It looks this way:

RSSI Detection - Android Example

Rumney answered 5/8, 2013 at 0:35 Comment(1)
Can you check this question please?Wulf
F
13

The necessary API was introduced in API 18 (Android 4.3). You need to call BluetoothGatt#readRemoteRssi() to initiate the request. The response shows up on the BluetoothCallback#onReadRemoteRssi() callback. (That's the callback object that handles connect, discovery, characteristic reads, etc.)

The broadcast receiver stuff is no longer required.

Festivity answered 7/3, 2017 at 23:28 Comment(2)
How i can use this with Bluetooth Classic socket connection .Herndon
This answer is for BLE devices not for Classic BluetoothJimjams
P
6

You can get the signal strengh of a BluetoothDevice using its rssi. This can be done using BluetoothAdapter to get the bounded devices.

Once you have the one you are interested in, just call connectGatt() on it and define a new BluetoothGattCallback. This is an interface that provides few method to override. The two written below will allow you to have the rssi everytime the connection state changes.

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  // Get the default bluetoothAdapter to store bonded devices into a Set of BluetoothDevice(s)
  BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  // It will work if your bluetooth device is already bounded to your phone
  // If not, you can use the startDiscovery() method and connect to your device
  Set<BluetoothDevice> bluetoothDeviceSet = bluetoothAdapter.getBondedDevices();

  for (BluetoothDevice bluetoothDevice : bluetoothDeviceSet) {
    bluetoothDevice.connectGatt(this, true, new BluetoothGattCallback() {
      @Override
      public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        super.onConnectionStateChange(gatt, status, newState);
      }
      @Override
      public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
        if(status == BluetoothGatt.GATT_SUCCESS)
          Log.d("BluetoothRssi", String.format("BluetoothGat ReadRssi[%d]", rssi));
      }
    });
  }

}

NOTE : This sample requires a the following permission declared in your manifest file

<uses-permission android:name="android.permission.BLUETOOTH" />
Provincetown answered 27/3, 2018 at 9:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.