在Windows系统下使用Python提取已连接蓝牙设备的电池电量
蓝牙设备电池详情获取方案解答
我来帮你梳理下这个问题:
关于PyBlueZ的可行性
PyBlueZ 并不适合用来读取蓝牙设备的电池详情。它主要针对传统蓝牙(BR/EDR)的基础通信功能开发,对低功耗蓝牙(BLE)的GATT服务支持非常有限——而绝大多数消费级蓝牙设备(比如耳机、智能手环)的电池信息,都是通过BLE的GATT电池服务(UUID: 0x180F)来对外暴露的。PyBlueZ在GATT操作这块的API不完善,甚至部分平台上根本没法访问这类服务,所以不建议用它来做这件事。
推荐方案:Python + Bleak 模块
如果你还是想用Python来实现,Bleak绝对是更好的选择——它是专门为Python打造的跨平台BLE客户端库,完美支持GATT服务的读写操作,上手简单,能轻松搞定电池信息读取。
快速上手步骤:
- 先安装Bleak:
pip install bleak
- 参考这个代码示例,扫描并读取已连接设备的电池电量:
from bleak import BleakClient, BleakScanner # 固定的电池服务UUID和电量特征UUID BATTERY_SERVICE_UUID = "0000180f-0000-1000-8000-00805f9b34fb" BATTERY_LEVEL_CHAR_UUID = "00002a19-0000-1000-8000-00805f9b34fb" async def get_battery_level(device_address): async with BleakClient(device_address) as client: # 读取电池电量的特征值 battery_data = await client.read_gatt_char(BATTERY_LEVEL_CHAR_UUID) # 把字节数组转换成整数百分比 return int(battery_data[0]) async def main(): # 扫描附近的BLE设备(如果已经知道设备地址,可以直接跳过扫描步骤) devices = await BleakScanner.discover() for device in devices: # 替换成你的蓝牙设备名称(比如"AirPods Pro") if "你的设备名称" in device.name: battery_percent = await get_battery_level(device.address) print(f"设备 {device.name} 当前电池电量:{battery_percent}%") if __name__ == "__main__": import asyncio asyncio.run(main())
小提示:
- 确保你的设备是BLE设备,并且开启了GATT电池服务(现在绝大多数蓝牙设备都支持)。
- 如果设备已经和电脑连接,你可以直接用设备的MAC地址(Windows上可能是设备GUID)初始化
BleakClient,不用再扫描。 - 不同平台的蓝牙权限要求不同:Linux可能需要蓝牙相关权限,macOS/Windows可能需要系统授权访问蓝牙。
其他可选方案
- 如果你用的是Linux,也可以直接用
bluetoothctl命令行工具读取:
bluetoothctl info <设备MAC地址>
输出里找Battery Percentage相关内容就行,不过这种方式需要手动解析输出,灵活性不如Bleak。
- 要是考虑其他编程语言:JavaScript可以用
noble库,Swift用CoreBluetooth框架,Android开发用Java/Kotlin的BluetoothGatt API,但跨平台场景下,Python+BLEAK是最省心的选择。
内容的提问来源于stack exchange,提问作者rawwar




