如何在Windows 10中用Python监控蓝牙Xbox手柄按键?求助bleak使用问题
针对Windows 10下使用Bleak监控Xbox蓝牙手柄的问题解决方案
问题1:无法找到手柄MAC地址或地址无效
- Xbox蓝牙手柄在Windows下使用随机私有地址,每次连接都会动态变化,因此控制面板中无法查看固定MAC。无需手动输入地址,直接使用Bleak扫描获取的
BleakDevice对象创建BleakClient即可。 - 扫描时可过滤设备名称,精准定位Xbox手柄:
devices = await BleakScanner.discover() xbox_devices = [d for d in devices if "Xbox Wireless Controller" in d.name]
问题2:扫描设备不稳定、结果不可靠
- Windows下BLE扫描受系统蓝牙栈限制,可通过以下方式优化:
- 延长扫描超时时间(例如设置
timeout=10),过短的超时会导致设备来不及被发现; - 扫描时避免同时进行其他蓝牙操作(如连接其他BLE设备);
- 确保手柄处于配对/可发现模式(按手柄配对键直到Xbox指示灯闪烁);
- 使用实时监听模式替代一次性扫描,提升发现效率:
from bleak import BleakScanner async def scan_callback(device, advertisement_data): if "Xbox Wireless Controller" in device.name: print(f"发现手柄: {device.name}, 当前地址: {device.address}") async def run(): scanner = BleakScanner(detection_callback=scan_callback) await scanner.start() await asyncio.sleep(10) # 持续扫描10秒 await scanner.stop() asyncio.run(run())
- 延长扫描超时时间(例如设置
问题3:无法连接设备,调用pair()报错'NoneType' object has no attribute 'device_information'
- 原代码问题在于盲目遍历所有扫描设备并尝试连接,多数设备不允许任意连接,且Xbox手柄需先通过系统完成配对。
- 正确操作步骤:
- 先通过Windows系统设置完成Xbox手柄的配对;
- 过滤出Xbox手柄设备后再尝试连接,避免无效设备干扰;
- 修改后的连接代码:
import asyncio from bleak import BleakScanner, BleakClient, BleakError async def run(): devices = await BleakScanner.discover(timeout=10) xbox_devices = [d for d in devices if d.name and "Xbox Wireless Controller" in d.name] if not xbox_devices: print("未发现Xbox手柄") return for device in xbox_devices: try: async with BleakClient(device) as client: if client.is_connected: print(f"成功连接手柄: {device.name}, 地址: {device.address}") # 此处可添加按键监听逻辑 except BleakError as e: print(f"连接失败: {e}") except asyncio.TimeoutError: print(f"连接超时: {device.address}") asyncio.run(run()) - 报错原因是
pair()方法依赖设备的Device Information服务,未配对的Xbox手柄不提供该服务,因此不要通过Bleak执行配对操作,直接用系统蓝牙设置完成配对即可。
替代包推荐
如果Bleak使用体验不佳,可尝试以下更适配手柄场景的包:
- inputs:专注处理游戏手柄输入,支持Xbox手柄,无需手动处理BLE连接,直接读取按键、摇杆数据,Windows兼容性好;
- pygame:经典游戏开发库,内置手柄输入支持,配置简单,适合快速实现按键监控;
- xinput:针对Xbox手柄的专用库,基于Windows原生XInput API读取数据,稳定性高。
内容的提问来源于stack exchange,提问作者TimH
相关产品推荐
相关产品推荐

