Как я могу проверить уровень заряда батареи подключенного устройства Bluetooth? Устройство показывает уровень заряда батареи в Android, поэтому я предполагаю, что устройство поддерживает Служба батарей на основе GATT. Однако после ввода «menu gatt» в bluetoothctl и последующего перечисления атрибутов GATT устройства с помощью «list-attribute [dev]» ничего не появляется.

A аналогичный вопрос был отправлен на SO, но ОП, кажется, нашел решение, которое не работает для меня. Когда я запускаю "info [dev]" в bluetoothctl, я не вижу UUID для обслуживания батареи.

Я бы предпочел решение, которое работает в командной строке и является дистроагностичным.

Пожалуйста, дайте мне знать, если этот вопрос должен быть размещен на SuperUser вместо.

85
Ricardo 3 Мар 2018 в 01:58

8 ответов

Лучший ответ

Это может быть немного поздно для вечеринки, но для меня этот проект Python работал нормально:

https://github.com/TheWeirdDev/Bluetooth_Headset_Battery_Level

Мне нужно было только изменить порт в строке 57 на 3 для моей безымянной гарнитуры X5. Если он зависает или ошибки с «отказано в соединении», попробуйте другой порт.

Программа Python использует AT-команды через RFCOMM и должна работать, пока Pulseaudio использует приемник A2DP (мои переподключения). Python 3 необходим, так как 2 не имеет BT-Serial сокетов. Windows, вероятно, не будет работать, так как ей не хватает bluez. Он в основном делает то же самое, что и взлом Pulseaudio здесь: https://stackoverflow.com/a/56390625/920122

Если вы хотите посмотреть на команды, которыми они обмениваются, попробуйте мой ответвление: https://github.com/clst / Bluetooth_Headset_Battery_Level

7
clst 13 Янв 2020 в 02:14

Вот способ получить уровень заряда батареи с помощью журналов pulseaudio с помощью некоторого хака. Моя Bluetooth-гарнитура использует запатентованные команды Apple HFP AT, протоколы HFP / A2DP обрабатываются с помощью pulseaudio напрямую. Кажется, что единственный способ получить эти значения - через импульс.

1
Vasily Olekhov 31 Май 2019 в 07:30

В версии bluez вы можете использовать экспериментальные атрибуты Gatt. Если вам нужно включить экспериментальные характеристики, запустив команду bluetoothd deamon по ключевому слову -E, как "/ usr / libexec / bluetooth / bluetoothd -E", это сработало для меня.

0
Jayanth Rajan 6 Мар 2018 в 07:55

По умолчанию Bluez «скрывает» UUID службы батареи. Это связано с тем, что при запуске bluetoothd загружается «плагин батареи».

Если вы не хотите, чтобы плагин батареи активировался и чтобы UUID службы батареи снова становился видимым для bluetoothctl или любого другого приложения, измените команду запуска для bluetoothd следующим образом: «bluetoothd -P battery». Это позволит убедиться, что плагин батареи не загружен. На Raspberry Pi служба bluetooth.service находится в /lib/systemd/system/bluetooth.service, поэтому вам нужно внести изменения в этот файл.

-1
Martijn van Welie 24 Ноя 2019 в 20:11

Как сказано выше @OlivierM, UUID фильтруется через bluetoothd. Вы можете отменить это и экспортировать UUID так же, как любые другие характеристики сервиса, удалив следующее из функции export_service() в src/gatt-client.c

if (gatt_db_service_get_claimed(attr))
     return;
-2
br1 1 Окт 2019 в 15:53

Это такой большой вопрос, опережающий разработку и инструменты, которые доступны на данный момент.

Краткий ответ (в октябре 2018 года)

ты должен написать это сам! Это не будет один лайнер в терминале. Я собираюсь написать это для себя на Python, но у C есть немного больше документации, так что если вы разбираетесь в C, сделайте это.

Длинный ответ , но это скорее рекомендуемая отправная точка:

  1. Тони Д: https://youtu.be/5fQR2PHMDWE?t=4644 удалось использовать {{ X0}} для чтения атрибутов и отправки данных на устройство Bluetooth. Обязательно проверьте видео информацию, вы найдете отличные ссылки и ссылки: https: / /learn.adafruit.com/introduction-to-bluetooth-low-energy/gatt
  2. Сжимон Янк: https://youtu.be/VMDyebKT5c4 разработчик и участник Bluetooth-стека LINUX
  3. Определенно . Узнайте, как на этот вопрос отвечают мобильные устройства. Для Android это BAS (Battery Battery): https: // android.stackexchange.com/questions/106073/displaying-bluetooth-gadgets-battery-status-on-the-phone

    На Android 8.0.1

16
VeRo 20 Окт 2018 в 09:35

Вы не видите Уровень заряда батареи в списке характеристик GATT начиная с Bluez v5.48, потому что эта особая характеристика GATT была перемещена в Интерфейс DBUS org.bluez.Battery1.

Из командной строки:

  1. Подключитесь к целевому BLE-устройству с помощью bluetoothctl
  2. А затем запросите DBUS, запустив: 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"

В моем случае с моим периферийным устройством BLE со следующим 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

Примечание. Вы можете сканировать и подключаться к своему устройству с помощью API Bluez DBUS.

16
MarshmallowTech 25 Дек 2019 в 01:27

Для меня запуск этого в терминале работал upower --dump

6
Yash Nahta 2 Окт 2019 в 00:08