检查linux上连接的蓝牙设备的电池电量

时间:2018-03-02 22:58:21

标签: linux bluetooth bluez

如何检查连接的蓝牙设备的电池电量?设备会在Android上显示电池电量,因此我假设设备支持GATT-based Battery Service。但是,通过输入" menu gatt"在bluetoothctl中,然后使用" list-attributes [dev]"列出设备的GATT属性,没有任何显示。

A similar question was posted to SO但是OP似乎找到了一个对我不起作用的解决方案。当我运行" info [dev]"在bluetoothctl中,我没有看到电池服务的UUID。

我更喜欢在命令行上运行并且与驱动程序无关的解决方案。

如果这个问题应该发布在SuperUser上,请告诉我。

9 个答案:

答案 0 :(得分:15)

这对聚会来说可能有点晚了,但是对我来说,这个Python项目运行良好:

https://github.com/TheWeirdDev/Bluetooth_Headset_Battery_Level

我只需要将我的无名X5耳机的第57行的端口更改为3。如果挂起或“连接被拒绝”错误,请尝试其他端口。

Python程序通过RFCOMM使用AT命令,并且在Pulseaudio使用A2DP接收器(我的重新连接)时应该可以运行。需要Python 3,因为2没有BT串行套接字。 Windows可能会因为缺少bluez而无法工作。它基本上与此处的Pulseaudio骇客做同样的事情:https://stackoverflow.com/a/56390625/920122

如果要在交换命令时查看它们,请尝试我的调试叉:https://github.com/clst/Bluetooth_Headset_Battery_Level

答案 1 :(得分:5)

在当前可用的开发和工具之前,这是一个很大的问题。

简短答案(于2018年10月)

  

您必须自己编写!它不会是终端机中的一个班轮。我将用Python自己编写,但是C有更多文档,所以如果您精通C,那就去吧。

答案很长,但这是一个建议的起点:

  1. Tony D:https://youtu.be/5fQR2PHMDWE?t=4644设法使用bluetoothctl读取属性并将数据发送到蓝牙设备。一定要查看视频信息,您会找到很棒的链接和参考:https://learn.adafruit.com/introduction-to-bluetooth-low-energy/gatt
  2. Szymon Janc:https://youtu.be/VMDyebKT5c4开发人员和LINUX蓝牙协议栈的贡献者
  3. 绝对,查看如何在移动设备上回答此问题。对于Android,它是BAS(电池服务):https://android.stackexchange.com/questions/106073/displaying-bluetooth-gadgets-battery-status-on-the-phone

    On Android 8.0.1

答案 2 :(得分:1)

在bluez版本中你使用Gatt属性可能是实验性的。如果你需要通过-E关键字运行bluetoothd deamon来启用实验特性 像“/ usr / libexec / bluetooth / bluetoothd -E” 这对我有用。

答案 3 :(得分:1)

在GATT特性列表中看不到“电池电量”的原因是因为自从Bluez v5.48以来,他们将这个特定的GATT特性移到了DBUS org.bluez.Battery1 interface中。

从命令行:

  1. 使用bluetoothctl连接到目标BLE设备
  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

注意:您可能会使用Bluez DBUS API扫描并连接到设备。

答案 4 :(得分:1)

对我来说,在终端机上运行该命令 upower --dump

答案 5 :(得分:1)

(此答案特定于耳机/耳机)

我一直在使用clst的答案中的Python程序,尽管它可以工作,但它要求我先连接,然后断开连接并再次运行它。如果我正确地理解了问题,那是因为 只有一个程序可以打开一个套接字来与蓝牙设备进行通讯,所以最终它与PulseAudio进行了争斗。

我最近发现了有关hsphfpd的信息。

hsphfpd是带有用于连接的一些原型实现的规范 在Linux操作系统上具有HSP和HFP配置文件的蓝牙设备。

基本上,由于只有一个程序可以立即与头戴式耳机进行通信,并且在音频服务器中实现电池电量报告或在电源管理软件中实现音频都没有意义,因此它将该功能移至外部守护程序。这样,PulseAudio和其他任何东西都可以同时使用耳机。修补了version of PulseAudio以使用hsphfpd。即使它们仍然是原型,它们似乎也可以很好地工作。

hsphfpd通过DBus报告电池状态(和其他内容),因此只需从命令行获取即可

dbus-send --system --dest=org.hsphfpd --print-reply /org/hsphfpd/hci0/dev_XX_XX_XX_XX_XX_XX/hsp_hs org.freedesktop.DBus.Properties.Get string:org.hsphfpd.Endpoint string:BatteryLevel

甚至从程序中调用它。

如果您使用Arch Linux,这两种功能都可以在AUR中使用。

答案 6 :(得分:0)

这是一种通过带有一些hack的pulseaudio日志获取电池电量的方法。 我的蓝牙耳机使用专有的Apple HFP AT命令,HFP / A2DP协议直接由pulseaudio处理。似乎获得这些值的唯一方法是通过脉冲。

答案 7 :(得分:-1)

默认情况下,Bluez“隐藏”电池服务UUID。这是因为在启动蓝牙时加载了一个“电池插件”。

如果您不希望激活电池插件并使“电池服务” UUID在bluetoothctl或任何其他应用程序中再次可见,则将bluetoothd的启动命令更改为如下所示:'bluetoothd -P battery'。这样可以确保未加载电池插件。在Raspberry Pi上,bluetooth.service位于/lib/systemd/system/bluetooth.service中,因此您需要在该文件中进行更改。

答案 8 :(得分:-2)

如上面@OlivierM所说,UUID由蓝牙过滤。通过从export_service()

中的src/gatt-client.c函数中删除以下内容,可以撤消该操作并将UUID与其他任何服务特征一样导出
if (gatt_db_service_get_claimed(attr))
     return;