Windows下Python Bleak库连接BLE网关时因加密不足导致特征读写失败的解决方案咨询
你遇到的这个问题其实是Windows下Bleak库处理BLE加密连接时的常见痛点,我之前做类似项目时也踩过同样的坑。先帮你理清楚当前状况:你已经通过Windows蓝牙管理器手动配对了Linux BLE网关,脚本能成功连接设备并获取特征UUID,但读写加密特征时就抛出Insufficient Encryption (0x0F)的协议错误——这说明虽然系统层面配对完成,但Bleak的连接会话并没有正确启用加密。
下面给你几个针对性的解决思路,按优先级尝试:
明确指定Bleak连接的安全级别
Windows下Bleak默认可能不会自动启用加密连接,即使系统已经配对设备。你需要在初始化BleakClient时显式指定安全级别,强制建立加密会话。修改你的连接代码如下:from bleak import BleakClient, BLESecurityLevel import asyncio from datetime import datetime ADDRESS = "你的设备地址" CONNECTIVITY_INFO_UUID = "你的特征UUID" async def read_connectivity_info_only(): try: # 明确指定安全级别为加密模式 async with BleakClient(ADDRESS, timeout=30.0, security=BLESecurityLevel.ENCRYPTED) as client: if not client.is_connected: print("Failed to connect") return print("Connected to device.") for i in range(100): print(i) try: value = await client.read_gatt_char(CONNECTIVITY_INFO_UUID) timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") print(f"[{i}] {timestamp} - connectivity info: {value}") await asyncio.sleep(1.0) except Exception as e: print(f"Error on read {i}: {e}") break except Exception as e: print(f"Connection error: {e}") asyncio.run(read_connectivity_info_only())这里的
BLESecurityLevel.ENCRYPTED会强制Bleak使用加密连接,如果设备需要更高安全级别(比如带MITM保护的加密),可以尝试BLESecurityLevel.ENCRYPTED_MITM。验证Windows配对的权限与有效性
手动配对时,Windows可能会询问设备访问权限,确保你选择了允许设备访问所有数据的选项。另外可以尝试删除现有配对,重新配对一次,配对完成后重启蓝牙服务(在服务管理器里找到Bluetooth Support Service并重启),再运行脚本。处理配对回调(如果需要PIN码)
如果你的BLE网关需要PIN码配对,即使手动配对过,Bleak建立连接时可能仍需重新验证配对信息。这时可以添加配对回调函数处理PIN码输入:def pairing_callback(device, pin): # 返回你的网关PIN码 return "1234" # 替换成实际PIN码 # 在初始化BleakClient时添加配对回调参数 async with BleakClient(ADDRESS, timeout=30.0, security=BLESecurityLevel.ENCRYPTED, pairing_callback=pairing_callback) as client: # 后续代码不变升级Bleak到最新版本
Windows下BLE的加密支持一直在迭代,旧版本Bleak可能存在兼容性问题。执行pip install --upgrade bleak升级到最新版,很多加密相关的bug在新版本中已经修复。检查网关的特征属性配置
确认你要读写的特征确实配置了加密访问属性(比如READ_ENCRYPTED或WRITE_ENCRYPTED),如果属性设置正确,问题大概率还是在Bleak的连接配置上。
另外,你遇到的错误日志可以再确认下:
ERROR:main: Connectivity read error: Could not read characteristic handle 90: Protocol Error 0x0F: Insufficient Encryption
ERROR:main: Status read error: Could not read characteristic handle 93: Protocol Error 0x0F: Insufficient Encryption
INFO:main: Sending command: 010203
ERROR:main: Command error: Could not write value b'\x01\x02\x03' to characteristic 0064: Protocol Error 0x0F: Insufficient Encryption
这些错误明确指向连接会话未加密,优先尝试前面提到的指定安全级别和重新配对的方法,应该能解决问题。
内容来源于stack exchange




