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

Ric*_*rdo 37 linux bluetooth bluez

如何查看连接的蓝牙设备的电池电量?该设备显示Android上的电池电量,因此我假设该设备支持基于GATT的电池服务.但是,通过在bluetoothctl中输入"menu gatt",然后使用"list-attributes [dev]"列出设备的GATT属性,则不显示任何内容.

一个类似的问题被张贴到SO但OP似乎已经发现,不为我工作的解决方案.当我在bluetoothctl中运行"info [dev]"时,我没有看到电池服务的UUID.

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

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

cls*_*lst 28

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

https://github.com/TheWeirdDev/Bluetooth_Headset_Battery_Level

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

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

如果您想查看交换的命令,请尝试我的调试分支:https : //github.com/clst/Bluetooth_Headset_Battery_Level

  • 嘿@clst,感谢您的回答!看起来很有希望!你的意思是原始代码第 56 行和你的分支中第 58 行的端口?那个写着“s.connect((BT_ADDRESS, 3))”的?我尝试了从 1 到 11 的所有数字,但没有成功。我应该继续尝试更多端口号吗?您知道端口可能位于的数字范围是多少吗? (2认同)
  • 我再次尝试,这次是在使用“bluetoothctl”与设备断开连接之后。**它有效!!** `:)` 我正在使用您的叉子和端口号 3。唯一需要注意的是,我不能在听音乐时使用它,因为我必须断开与设备的连接才能使用蟒蛇脚本。 (2认同)

小智 16

对我来说,在终端工作中运行它- upower --dump

  • 感谢亚什的建议。不幸的是,这不适用于我的设置。输出中仅显示笔记本电脑的电池“battery_BAT0”、线路电源“line_power_AC”和神秘的“/org/freedesktop/UPower/devices/DisplayDevice”设备。 (12认同)

VeR*_*eRo 13

在开发和目前可用的工具之前,这是一个非常好的问题.

简答(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

    在Android 8.0.1上

  • 由(内核开发人员)更新“必须使用 power_supply_register(或以 devm_ 为前缀的变体)向电源子系统注册电池。对于 BT HID 设备,发生在 drivers/hid/hid-input.c 中并且基于 HID 协议。其他 BT 设备不使用 HID 协议,需要自己的处理程序。据我所知,对于其他设备类型,高级协议是在用户空间/bluez 中实现的。这需要像电源 uinput 这样的东西,以便 bluez 可以将电池信息反馈回内核。据我所知,目前没有人致力于此。 (2认同)

Oli*_*erM 10

您在GATT特性列表中看不到Battery Level的原因是因为从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
Run Code Online (Sandbox Code Playgroud)

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

  • 按照这些说明进行操作时,我得到以下错误信息$ $ dbus-send --print-reply = literal --system --dest = org.bluez / org / bluez / hci0 / dev_E9_09_EF_A6_24_70 org.freedesktop.DBus.Properties.Get字符串: “ org.bluez.Battery1”字符串:“百分比”错误org.freedesktop.DBus.Error.InvalidArgs:没有这样的接口'org.bluez.Battery1'` (5认同)
  • 我刚刚尝试了 Bluez 来源的 5.50,它也适用于我。您确定您的设备公开了电池服务吗?你能运行这个命令吗:`dbus-send --system --print-reply --dest=org.bluez /org/bluez/hci0/dev_E9_09_EF_A6_24_70 org.freedesktop.DBus.Introspectable.Introspect` (2认同)

use*_*729 8

一种可能的方法(虽然很hacky)是在日志中进行 grep 操作:

journalctl -b --user-unit pulseaudio -g "Battery Level" -o cat 
Run Code Online (Sandbox Code Playgroud)

-b仅显示当前启动中的信息。显然以前启动中的信息是不相关的)

在我的机器上,例如输出

Battery Level: 70%
Battery Level: 70%
Battery Level: 70%
Battery Level: 70%
Battery Level: 70%
Battery Level: 60%
Battery Level: 60%
Run Code Online (Sandbox Code Playgroud)

选择最后一行(可以通过附加 来完成|tail -n 1)。

该解决方案不区分蓝牙设备当前是否已连接,或者如果有多个蓝牙设备,则不区分是哪一个。


替代方案包括运行,然后使用接受的答案/sf/answers/4179689601/bluetoothctl disconnect中的脚本来获取电池电量,然后再次运行。如果您当前已连接,这通常是不可接受的,但它是有效的。bluetoothctl connect


另一种选择(如果适合您)是使用 bluez 包的实验性功能。请参阅https://askubuntu.com/a/1420501/996767


koo*_*oos 6

在 Ubuntu 20+ 上,它在电源面板的设备选项卡下显示电池

在此输入图像描述


Vas*_*hov 5

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