Проверьте уровень заряда подключенного устройства bluetooth на linux

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

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

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

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

Ответ 1

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

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

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

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

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

    On Android 8.0.1

Ответ 2

Причина, по которой вы не видите уровень заряда батареи в списке характеристик 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.

Ответ 3

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

Ответ 4

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

Ответ 5

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

if (gatt_db_service_get_claimed(attr))
     return;

Ответ 6

Для меня это работает в терминале worked- upower --dump