You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Windows系统下使用Python提取已连接蓝牙设备的电池电量

蓝牙设备电池详情获取方案解答

我来帮你梳理下这个问题:

关于PyBlueZ的可行性

PyBlueZ 并不适合用来读取蓝牙设备的电池详情。它主要针对传统蓝牙(BR/EDR)的基础通信功能开发,对低功耗蓝牙(BLE)的GATT服务支持非常有限——而绝大多数消费级蓝牙设备(比如耳机、智能手环)的电池信息,都是通过BLE的GATT电池服务(UUID: 0x180F)来对外暴露的。PyBlueZ在GATT操作这块的API不完善,甚至部分平台上根本没法访问这类服务,所以不建议用它来做这件事。

推荐方案:Python + Bleak 模块

如果你还是想用Python来实现,Bleak绝对是更好的选择——它是专门为Python打造的跨平台BLE客户端库,完美支持GATT服务的读写操作,上手简单,能轻松搞定电池信息读取。

快速上手步骤:

  1. 先安装Bleak:
pip install bleak
  1. 参考这个代码示例,扫描并读取已连接设备的电池电量:
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

火山引擎 最新活动