You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Bleak模块连接BLE设备超时及连接时长调整咨询

Bleak连接BLE设备超时问题排查与参数调整

问题描述

使用Python Bleak模块实现BLE设备连接与交互时,测试官方示例代码能搜索到目标设备,但无法建立连接,推测可能和广播时长相关,但不知道如何调整对应参数,请求解决连接超时问题并指导时间参数调整方法。

测试代码

import asyncio
import platform
import sys

import bleak.exc
from bleak import BleakClient, BleakScanner
from bleak.exc import BleakError


ADDRESS = (
    "C5:66:28:34:DC:A5"
    if platform.system() != "Darwin"
    else "B9EA5233-37EF-4DD6-87A8-2A875E821C46"
)


async def main(ble_address: str):
    device = await BleakScanner.find_device_by_address(ble_address, timeout=12.0)
    try:
        if not device:
            raise BleakError(f"A device with address {ble_address} could not be found.")
        async with BleakClient(device, timeout=12.0) as client:
            print("Services:")
            for service in client.services:
                print(service)
    except bleak.exc.BleakError as e:
        print(e)
    except asyncio.exceptions.TimeoutError as e:
        print(e)


while True:
    asyncio.run(main(sys.argv[1] if len(sys.argv) == 2 else ADDRESS))

报错信息

Traceback (most recent call last):
  File "C:\Program Files\Python310\lib\asyncio\locks.py", line 213, in wait
    await fut
asyncio.exceptions.CancelledError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files\Python310\lib\asyncio\tasks.py", line 458, in wait_for
    fut.result()
asyncio.exceptions.CancelledError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\nguye\PycharmProjects\BLE_connect\main.py", line 35, in <module>
    asyncio.run(main(sys.argv[1] if len(sys.argv) == 2 else ADDRESS))
  File "C:\Program Files\Python310\lib\asyncio\runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "C:\Program Files\Python310\lib\asyncio\base_events.py", line 641, in run_until_complete
    return future.result()
  File "C:\Users\nguye\PycharmProjects\BLE_connect\main.py", line 26, in main
    async with BleakClient(device, timeout=12.0) as client:
  File "C:\Users\nguye\PycharmProjects\BLE_connect\venv\lib\site-packages\bleak\backends\client.py", line 61, in __aenter__
    await self.connect()
  File "C:\Users\nguye\PycharmProjects\BLE_connect\venv\lib\site-packages\bleak\backends\winrt\client.py", line 249, in connect
    await asyncio.wait_for(event.wait(), timeout=timeout)
  File "C:\Program Files\Python310\lib\asyncio\tasks.py", line 460, in wait_for
    raise exceptions.TimeoutError() from exc
asyncio.exceptions.TimeoutError

解决方案与参数调整指南

1. 增大超时时间参数

从报错信息看,连接阶段超时是核心问题,可直接调整两个关键超时参数:

  • 扫描超时:将BleakScanner.find_device_by_address的timeout从12.0增大到20.0甚至30.0,确保能捕捉到设备的广播包(部分设备广播间隔较长)。
  • 连接超时:将BleakClient的timeout从12.0增大到30.0或60.0,给BLE设备足够的响应时间来建立连接。

修改后的代码片段:

device = await BleakScanner.find_device_by_address(ble_address, timeout=30.0)
# ...
async with BleakClient(device, timeout=30.0) as client:

2. 指定BLE设备地址类型

Windows平台下,部分BLE设备使用随机地址而非公共地址,未指定地址类型会导致连接失败。可在BleakClient中添加address_type参数:

async with BleakClient(device, timeout=30.0, address_type="random") as client:

如果不确定地址类型,可先尝试"public"和"random"两种类型。

3. 持续扫描触发连接

若设备广播间隔过长,单次扫描可能错过连接窗口,可改用持续扫描的方式,检测到设备后立即发起连接:

async def main(ble_address: str):
    scanner = BleakScanner()
    await scanner.start()
    device = None
    
    # 持续扫描直到找到目标设备
    while device is None:
        await asyncio.sleep(0.5)
        discovered_devices = await scanner.get_discovered_devices()
        device = next((d for d in discovered_devices if d.address == ble_address), None)
    
    await scanner.stop()
    
    try:
        async with BleakClient(device, timeout=30.0, address_type="random") as client:
            print("Services:")
            for service in client.services:
                print(service)
    except bleak.exc.BleakError as e:
        print(e)
    except asyncio.exceptions.TimeoutError as e:
        print(e)

4. 其他排查点

  • 确认BLE设备处于可连接状态:部分设备需要手动触发(如按键)才能进入连接模式,而非一直处于可连接广播状态。
  • 检查Windows平台BLE权限:确保当前用户有权限访问蓝牙设备,可尝试以管理员身份运行程序。
  • 验证设备地址正确性:确认使用的BLE设备地址与实际设备一致,避免混淆公共地址和随机地址。

内容的提问来源于stack exchange,提问作者Nguyễn Thuận Hải

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:15:57