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

Windows下Python Bleak库BLE通信:start_notify与write_gatt_char无响应问题

问题排查与修复方案

1. 修正通知处理函数的类型注解错误

你的notification_handler函数中,sender的类型注解使用了字符串常量WRITE_NOTIFY_ID,这是语法错误,会导致回调无法正常触发,应改为str类型:

def notification_handler(sender: str, data: bytearray):
    print(f"收到通知: {sender}: {data.hex()}")  # 用hex()打印更易读的字节数据

2. 区分Write Response与Notification的差异

调用write_gatt_char时传入的response=True,仅用于请求GATT层的写入确认响应,这只是设备收到写入数据的信号,并非业务层面的响应数据。设备的业务响应是通过你注册的notification_handler回调接收的,answer变量拿到的并不是业务数据,通常为None或空确认。

3. 修正连接检查的异常抛出方式

原代码中直接抛出字符串的写法非法,应改为抛出Exception对象:

if not client.is_connected:
    raise Exception("客户端未连接")

4. 优化通知注册与写入的时序

虽然await client.start_notify()是异步完成的,但部分BLE设备需要短暂时间完成通知订阅注册,可适当调整等待时间,或直接在start_notify之后执行写入操作(await已确保注册完成)。

修正后的完整代码

import asyncio
from bleak import BleakClient

WRITE_NOTIFY_ID = "00001111-2222-aaaa-3333-444geabcd123"  # 替换为真实特征UUID
address_T = "AA:BB:CC:DD:EE:FF"  # 替换为真实设备地址


def notification_handler(sender: str, data: bytearray):
    print(f"收到通知: {sender}: {data.hex()}")


async def main(address):
    async with BleakClient(address) as client:
        if not client.is_connected:
            raise Exception("客户端未连接")

        await client.start_notify(WRITE_NOTIFY_ID, notification_handler)
        print("已注册通知,开始写入数据...")
        
        # 写入数据,response=True仅请求写入确认,不影响通知接收
        await client.write_gatt_char(WRITE_NOTIFY_ID, b'\x24', response=True)
        
        # 根据设备响应时间调整等待时长
        await asyncio.sleep(5)
        
        await client.stop_notify(WRITE_NOTIFY_ID)
        print("已停止通知")

if __name__ == "__main__":
    asyncio.run(main(address_T))

额外排查方向

  • 确认UUID和设备地址有效性:确保使用的特征UUID和设备MAC地址真实准确,Windows下部分设备可能需要用设备GUID而非MAC地址,可通过BLE扫描工具获取正确标识。
  • 验证设备行为:用BLE调试工具(如nRF Connect)测试,确认设备收到b'\x24'指令后确实会发送通知,排除设备端逻辑问题。
  • 检查Windows蓝牙环境:确认蓝牙驱动正常、设备权限充足,尝试重启蓝牙或电脑后重试。

内容的提问来源于stack exchange,提问作者Nunzio Barletta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:07:40