【发布时间】:2021-08-07 00:41:48
【问题描述】:
我正在使用 Windows 蓝牙 LE GATT 库连接和配对支持 BLE 的设备 D。由于 D 的存储空间有限,如果与它绑定的客户端超过 N 个,那么它将删除第一个在绑定期间创建的长期密钥对。
假设删除此密钥对的设备是启用 Windows 的机器。我们称之为W。下次W尝试与D连接时,当它接收到来自W的LTK_Request_Event时,它以Long_Term_Key_Requested_Negative_Reply响应,W终止连接。
但这就是事情变得真正令人恼火的地方。尽管 Windows BLE 堆栈似乎知道此响应(因为它断开连接),但这似乎并没有通过蓝牙 LE GATT 库向下游传递给应用程序。实际上,从应用程序的角度来看,配对请求将返回“已配对”,并不表示出现任何问题。当然,一旦应用程序尝试访问受保护的特征,它就无法访问,而且到目前为止,这是配对不成功的唯一迹象。更糟糕的是,它收到的错误并不一致。有时,它会“无法访问”。有时,它会出现协议错误。其他时候,它会收到 ABORT。
现在,作为一种启发式方法,我可以将这种情况的检测用作尝试重新配对的标准。不幸的是,这并不理想,因为这些错误实际上并不意味着设备不再支持 LTK,而是可能表明其他问题,例如设备超出范围。
有什么方法可以检测到现有的 LTK 被设备拒绝了吗?
【问题讨论】:
-
很遗憾没有。我们发现的最佳解决方案是每次建立连接后都与设备配对。并在断开连接后取消配对。为什么我们在连接后配对?因为某些设备在连接之前拒绝配对/修复(我不知道为什么原因无法用嗅探器检查它)。通过此链接,您可以查看我们如何执行此操作的代码:github.com/btframework/GattAuth
标签: windows bluetooth bluetooth-lowenergy gatt ltk