You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows下Python Bleak库连接BLE网关时因加密不足导致特征读写失败的解决方案咨询

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_ENCRYPTEDWRITE_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

火山引擎 最新活动