Get bluetooth signal strength

后端 未结 4 1252
面向向阳花
面向向阳花 2020-12-01 01:09

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

相关标签:
4条回答
  • 2020-12-01 01:12

    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 respons 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 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)) {
                int  rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE);
                Toast.makeText(getApplicationContext(),"  RSSI: " + rssi + "dBm", Toast.LENGTH_SHORT).show();
            }
        }
    };
    
    0 讨论(0)
  • 2020-12-01 01:12

    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.

    0 讨论(0)
  • 2020-12-01 01:13

    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

    0 讨论(0)
  • 2020-12-01 01:32

    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" />
    
    0 讨论(0)
提交回复
热议问题