Android 2.1: ¿cómo puedo sondear el valor RSSI de una conexión Bluetooth existente?

Necesito saber la potencia de la señal de una conexión Bluetooth a un dispositivo remoto que hago con mi teléfono Android 2.1. Desde el SDK, puedo ver que puedo determinar el RSSI en el momento en que descubro el dispositivo remoto. Pero no veo cómo actualizar ese valor de RSSI a lo largo del tiempo.

¿Alguien puede darme una mano? ¡¡Gracias!!

Desde el SDK es la única forma de obtener RSSI. Es un poco incómodo, ya que no es útil si solo desea monitorear periódicamente la intensidad de la señal de un dispositivo emparejado.

Sin embargo, hay una manera, pero fuera de SDK. Puede usar API nativa (mediante NDK) y funciones de llamada proporcionadas por Bluez API , el marco bluetooth subyacente en Android (y casi cualquier sistema Linux). La función en cuestión es hci_read_rssi() proporcionada por libbluetooth.so (parte de la stack Bluez). Para aprender a usarlo, puede echar un vistazo a las fonts de la herramienta Hcidump (que viene con Bluez). Podría escribir un código de envoltura JNI para su función, para que pueda obtener la potencia de la señal del dispositivo emparejado.

Hay dos inconvenientes de usar este método:

  • Para medir RSSI primero debe conectarse al dispositivo remoto , al menos a bajo nivel (no se requiere autenticación para esta conexión) y liberar la conexión después de llamar a hci_read_rssi() . Esto es más lento que simplemente medir el RSSI de las balizas, como proporcionan otros medios de comunicación inalámbrica (GSM o WIFI)
  • La conexión de bajo nivel a dispositivos remotos con bluetooth requiere derechos de superusuario de Android . Así que olvídate de la escritura y la aplicación que se pueden ejecutar en teléfonos no pirateados (generalmente vienen sin acceso de root, y algunos como Motorola Droid / Milestone incluso anulan la garantía si intentas obtenerla).

Desafortunadamente no para Android 2.1, pero eche un vistazo a esta API para el nivel 18 (Android 4.3) que puede sondear:

 BluetoothGatt.readRemoteRssi() 

Lea el RSSI de un dispositivo remoto conectado.

Ver los documentos de Android aquí