101 votes

Vérifier le niveau de la batterie d'un appareil bluetooth connecté sous linux

Comment puis-je vérifier le niveau de la batterie d'un appareil bluetooth connecté ? L'appareil affiche le niveau de la batterie sur Android. Je suppose donc que l'appareil prend en charge la fonction de vérification de la batterie. Service de batterie basé sur le GATT . Cependant, en entrant "menu gatt" dans Bluetoothctl, puis en listant les attributs GATT du périphérique avec "list-attributes [dev]", rien n'apparaît.

A une question similaire a été postée sur SO mais l'OP semble avoir trouvé une solution qui ne fonctionne pas pour moi. Lorsque je lance "info [dev]" dans Bluetoothctl, je ne vois pas l'UUID pour Battery Service.

Je préférerais une solution qui fonctionne en ligne de commande et qui soit indépendante de la distribution.

Veuillez me faire savoir si cette question doit plutôt être postée sur SuperUser.

0 votes

De quel type d'appareil s'agit-il ? Le niveau de la batterie peut être signalé via de nombreux profils différents sur Bluetooth, et pas seulement via le service LE GATT... pouvez-vous utiliser une application d'exploration BLE ou autre pour parcourir les services GATT et confirmer ce qu'il prend réellement en charge ?

0 votes

Pouvez-vous recommander une application d'exploration BLE ? Existe-t-il un moyen de savoir quel type d'appareil est connecté à partir d'un outil de ligne de commande (par exemple bluetoothctl) ?

0 votes

Je vérifie le contenu de /sys/class/power_supply comme expliqué dans cette autre réponse .

34voto

Yash Nahta Points 11

Pour moi, exécuter ceci dans le terminal a fonctionné. upower --dump

26 votes

Merci Yash pour votre suggestion. Malheureusement, cela ne fonctionne pas pour mon installation. Seule la batterie de l'ordinateur portable battery_BAT0 la puissance de la ligne line_power_AC et le mystérieux /org/freedesktop/UPower/devices/DisplayDevice apparaissent dans la sortie.

1 votes

Cela a parfaitement fonctionné pour moi !

26voto

OlivierM Points 946

Vous ne voyez plus le niveau de la batterie dans la liste des caractéristiques du GATT depuis Bluez v5.48, car cette caractéristique spécifique du GATT a été déplacée dans la section "Caractéristiques du GATT". DBUS org.bluez.Battery1 interface .

Depuis la ligne de commande :

  1. Connectez-vous à votre appareil BLE cible avec bluetoothctl
  2. Et ensuite demander DBUS en exécutant : 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"

Dans mon cas avec mon périphérique BLE avec l'adresse MAC suivante 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

Remarque : Vous pouvez potentiellement scanner et vous connecter à votre appareil en utilisant l'API Bluez DBUS.

22 votes

En suivant ces instructions, j'obtiens cette erreur $ dbus-send --print-reply=literal --system --dest=org.bluez /org/bluez/hci0/dev_E9_09_EF_A6_24_70 org.freedesktop.DBus.Properties.Get string:"org.bluez.Battery1" string:"Percentage" Error org.freedesktop.DBus.Error.InvalidArgs: No such interface 'org.bluez.Battery1'

0 votes

Quelle version de 'bluez' utilisez-vous ?

0 votes

@OlivierM, j'utilise bluez 5.50 sur archlinux

22voto

VeRo Points 362

C'est une excellente question, en avance sur le développement et les outils disponibles pour le moment.

La réponse courte (en octobre 2018)

vous devez l'écrire vous-même ! Il ne s'agira pas d'une simple phrase dans le terminal. Je vais l'écrire pour moi-même en Python, mais le C a un peu plus de documentation, donc si vous êtes compétent en C, allez-y.

La réponse longue mais il s'agit plutôt d'un point de départ recommandé :

  1. Tony D : https://youtu.be/5fQR2PHMDWE?t=4644 a réussi à utiliser bluetoothctl pour lire les attributs et envoyer des données à un dispositif Bluetooth. Consultez les informations de la vidéo, vous y trouverez des liens et des références utiles : https://learn.adafruit.com/introduction-to-bluetooth-low-energy/gatt
  2. Szymon Janc : https://youtu.be/VMDyebKT5c4 développeur et contributeur de la pile Bluetooth de LINUX
  3. Définitivement Vérifiez comment cette question est traitée sur les appareils mobiles. Pour Android, il s'agit du BAS (Battery Service) : https://Android.stackexchange.com/questions/106073/displaying-bluetooth-gadgets-battery-status-on-the-phone

    On Android 8.0.1

0 votes

J'ai vérifié la première vidéo et le gars utilise list-attributes en bluetoothctl qui ne montre rien dans mon cas. C'est pourquoi je pense qu'il y a peut-être un moyen non GATT de vérifier l'état de la batterie ? J'ai également vérifié les autres liens, à l'exception de la conférence de Szymon Janc qui est un peu trop longue. Faites-moi savoir si vous parvenez à écrire un programme qui lit le niveau de la batterie d'un appareil BLE.

0 votes

N'oubliez pas d'utiliser sudo en cours d'exécution bluetoothctl . Mais oui, il n'y a pas vraiment de moyen confortable de faire cela sous Linux, aujourd'hui. C'est aussi la motivation pour ce projet python : github.com/peplin/pygatt#motivation Je ne vais pas aller plus loin dans mes recherches, sur ce sujet, par manque de temps. Utilisez le projet git et le code d'exemple ci-dessus, si vous décidez de poursuivre cette voie de résolution de ce problème. github.com/peplin/pygatt#example-use Je ne pourrai probablement aider que l'année prochaine. Bonne chance !

0 votes

Merci @VeRo pour l'aide ! Je ne savais pas que j'étais censé courir. bluetoothctl comme Root (en utilisant sudo ). J'ai essayé cela et toujours rien ne s'affiche lorsque je fais list-attributes après s'être connecté à l'appareil. Je ne sais pas ce qu'il faut faire pour que l'attribut soit répertorié ou ce qu'il faut faire si le dispositif ne répertorie aucun attribut de gatt. A la vôtre !

4voto

Vasily Olekhov Points 13

Voici un moyen d'obtenir le niveau de la batterie via les journaux de pulseaudio avec quelques pirater . Mon casque bluetooth utilise des commandes propriétaires Apple HFP AT, les protocoles HFP/A2DP sont gérés par pulseaudio directement. Il semble que le seul moyen d'obtenir ces valeurs soit de passer par pulse.

0 votes

Merci Vasily et désolé pour le long délai. Savez-vous s'il existe un moyen d'envoyer ces commandes AT à partir de la ligne de commande (en utilisant la fonction dbus-send par exemple) pour obtenir le niveau de la batterie ?

0 votes

Vous pouvez construire pulseaudio vous-même et appliquer le patch mentionné. Vous pouvez le modifier : par exemple, remplacer pa_log_notice par une sortie vers un tuyau dans /tmp et avoir une application qui surveille ce tuyau. J'ai choisi cette méthode. Cela fonctionne pour moi. Ce code n'est déclenché qu'une seule fois, lorsque l'appareil est appairé. Vous pouvez le placer sur les fonctions de changement de volume. Je pense qu'il existe un moyen d'ajouter un listener dbus à une commande spécifique dans pulseaudio, de sorte qu'il déclenche PA pour envoyer ces commandes AT, mais c'est trop compilé pour moi.

0 votes

Je vois. Merci. Je préfère ne pas maintenir un fork de pulseaudio.

1voto

Jayanth Rajan Points 11

Dans la version de bluez que vous utilisez, les attributs Gatt peuvent être expérimentaux, si c'est le cas, vous devez activer les caractéristiques expérimentales en exécutant le deamon bluetoothd avec le mot clé -E. Comme "/usr/libexec/bluetooth/bluetoothd -E". ceci a fonctionné pour moi.

0 votes

Le démon Bluetoothd est lancé par systemd lorsque vous faites "systemctl start bluetooth", n'est-ce pas ? Comment puis-je dire à systemd d'utiliser le paramètre -E ? J'ai la version 5.48 de bluez

0 votes

En exécutant la commande 'systemctl start bluetooth', vous invoquez le service bluetooth, recherchez ce service dans votre répertoire personnel. A l'intérieur du service, vous pouvez ajouter le paramètre -E à la ligne invoquant le service bluetooth, qui fait partie du paquet bluez. La ligne ressemblerait à ceci : "ExecStart=/usr/libexec/bluetooth/bluetoothd", ajoutez le paramètre -E à la fin "ExecStart=/usr/libexec/bluetooth/bluetoothd -E".

0 votes

Après l'ajout de ce mot clé, lorsque vous connectez votre appareil en utilisant l'application Bluetoothctl, il énumérera les services supportés par votre appareil Bluetooth. à partir de là, vous pouvez sélectionner l'attribut du service "Battery-Level" et utiliser la commande read pour obtenir la valeur. il existe également des moyens d'obtenir le niveau de la batterie directement en utilisant dbus-send, un utilitaire utilisé pour envoyer des commandes dbus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X