¿Cómo puedo verificar el nivel de batería de un dispositivo bluetooth conectado? El dispositivo muestra el nivel de batería en Android, así que supongo que el dispositivo es compatible con Servicio de baterías basado en GATT. Sin embargo, al ingresar "menu gatt" en bluetoothctl y luego enumerar los atributos GATT del dispositivo con "list-atributos [dev]", no aparece nada.

A pregunta similar se publicó en SO pero el OP parece haber encontrado una solución que no funciona para mí. Cuando ejecuto "info [dev]" en bluetoothctl, no veo el UUID para el Servicio de batería.

Preferiría una solución que se ejecute en la línea de comandos y sea independiente de la distribución.

Avíseme si esta pregunta debería publicarse en SuperUser en su lugar.

53
Ricardo 3 mar. 2018 a las 01:58

8 respuestas

La mejor respuesta

Esto podría ser un poco tarde para la fiesta, pero para mí este proyecto de Python ha funcionado bien:

https://github.com/TheWeirdDev/Bluetooth_Headset_Battery_Level

Solo tuve que cambiar el puerto en la línea 57 a 3 para mi auricular X5 sin nombre. Si se cuelga o se produce un error con "conexión rechazada", intente con un puerto diferente.

El programa Python usa comandos AT a través de RFCOMM y debería funcionar mientras Pulseaudio está usando el sumidero A2DP (la mía se vuelve a conectar). Python 3 es necesario ya que 2 no tiene enchufes BT-Serial. Windows probablemente no funcionará ya que carece de bluez. Básicamente hace lo mismo que el hack de Pulseaudio aquí: https://stackoverflow.com/a/56390625/920122

Si desea ver los comandos a medida que se intercambian, pruebe mi bifurcación de depuración: https://github.com/clst / Bluetooth_Headset_Battery_Level

7
clst 13 ene. 2020 a las 02:14

Aquí hay una manera de obtener el nivel de batería mediante los registros de pulseaudio con algunos hack. Mis auriculares bluetooth utilizan comandos de Apple HFP AT, los protocolos HFP / A2DP son manejados por pulseaudio directamente. Parece que la única forma de obtener esos valores es a través del pulso.

1
Vasily Olekhov 31 may. 2019 a las 07:30

En la versión bluez que está utilizando, los atributos de Gatt pueden ser experimentales. Si es así, debe habilitar las características experimentales ejecutando el bluetoothd deamon con la palabra clave -E como "/ usr / libexec / bluetooth / bluetoothd -E", esto funcionó para mí.

0
Jayanth Rajan 6 mar. 2018 a las 07:55

Por defecto, Bluez 'oculta' el UUID del servicio de batería. Esto se debe a que hay un 'complemento de batería' cargado al inicio de bluetoothd.

Si no desea que se active el complemento de la batería y hacer que el UUID del servicio de batería vuelva a ser visible para bluetoothctl o cualquier otra aplicación, cambie el comando de inicio de bluetoothd para que sea así: 'bluetoothd -P battery'. Eso asegurará que el complemento de la batería no esté cargado. En una Raspberry Pi, el bluetooth.service se encuentra en /lib/systemd/system/bluetooth.service, por lo que debe realizar el cambio en ese archivo.

-1
Martijn van Welie 24 nov. 2019 a las 20:11

Como dijo anteriormente @OlivierM, el UUID se filtra por bluetoothd. Puede deshacer eso y exportar el UUID como cualquier otra característica del servicio eliminando lo siguiente de la función export_service() en src/gatt-client.c

if (gatt_db_service_get_claimed(attr))
     return;
-2
br1 1 oct. 2019 a las 15:53

Esta es una gran pregunta, antes del desarrollo y las herramientas que están disponibles en este momento.

La respuesta corta (en octubre de 2018)

tienes que escribirlo tu mismo! No será un trazador de líneas en la terminal. Voy a escribir esto por mí mismo en Python, pero C tiene un poco más de documentación, así que si eres hábil con C, adelante.

La respuesta larga , pero es más un punto de partida recomendado:

  1. Tony D: https://youtu.be/5fQR2PHMDWE?t=4644 logró usar {{ X0}} para leer atributos y enviar datos a un dispositivo bluetooth. Verifique definitivamente la información del video, encontrará excelentes enlaces y referencias: https: / /learn.adafruit.com/introduction-to-bluetooth-low-energy/gatt
  2. Szymon Janc: https://youtu.be/VMDyebKT5c4 desarrollador y colaborador de LINUX Bluetooth Stack
  3. Definitivamente comprueba cómo se responde esta pregunta en dispositivos móviles. Para Android es el BAS (Servicio de batería): https: // android.stackexchange.com/questions/106073/displaying-bluetooth-gadgets-battery-status-on-the-phone

    En Android 8.0.1

16
VeRo 20 oct. 2018 a las 09:35

No ve el nivel de batería en la lista de características de GATT desde Bluez v5.48 porque esta característica específica de GATT se movió a interfaz DBUS org.bluez.Battery1.

Desde la línea de comando:

  1. Conéctese a su dispositivo BLE objetivo con bluetoothctl
  2. Y luego solicite DBUS ejecutando: dbus-send --print-reply=literal --system --dest=org.bluez /org/bluez/hci0/dev_<mac_address_of_your_ble_peripheral> org.freedesktop.DBus.Properties.Get string:"org.bluez.Battery1" string:"Percentage"

En mi caso con mi periférico BLE con la siguiente dirección MAC C3:41:A6:C8:93:42:

$ dbus-send --print-reply=literal --system --dest=org.bluez /org/bluez/hci0/dev_C3_41_A6_C8_93_42 org.freedesktop.DBus.Properties.Get string:"org.bluez.Battery1" string:"Percentage
   variant       byte 94

Nota: Podría escanear y conectarse a su dispositivo con la API Bluez DBUS.

16
MarshmallowTech 25 dic. 2019 a las 01:27

Para mí, ejecutar esto en la terminal funcionó upower --dump

6
Yash Nahta 2 oct. 2019 a las 00:08