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
相关产品推荐
相关产品推荐

