.NET with Windows RT Bluetooth LE API - 重启后无法读取或写入设备 Windows

.NET with Windows RT Bluetooth LE API - cannot read or write device after restarting Windows

我一直在使用 WinRT API 为 Windows 8.1 及更高版本的低功耗蓝牙开发应用程序。它已经工作了一段时间,但我 运行 遇到了一个严重的问题:在 Windows 重新启动后,软件无法连接到设备。

如果我关闭并重新启动软件,它仍然无法配对。唯一可行的是,如果我取消配对并重新配对设备。但是,考虑到我们用户的用例,这是完全不能接受的。这不可能是设备固件的问题,因为它仍然能够与 iOS.

配对和交互

在调试中,每当我尝试使用 txCharacteristic.WriteValueAsync(chunk, GattWriteOption.WriteWithoutResponse) 写入设备时,我都会得到 "Incorrect function." 但是,我知道这是正确的功能,因为这正是设备所支持的,而不是如果我取消配对并重新配对,请提及代码工作正常。此外,当我尝试扩展 PresentationFormats 属性:

时出现此错误

PresentationFormats 'this.txServiceCharacteristic.PresentationFormats' 引发了 'System.AccessViolationException' System.Collections.Generic.IReadOnlyList {System.AccessViolationException}

类型的异常

所以这告诉我这是 Windows 的问题。我目前 运行宁 10.

我已尝试更新设备驱动程序,将蓝牙服务设置为自动启动(从默认手动 "triggered" 启动),似乎没有任何方法可以缓解此问题。有谁知道是什么原因造成的,有什么解决办法吗?

谢谢!

编辑:显然,如果我将 GattProtectionLevel 从 EncryptionAndAuthenticationRequired 更改为 Plain,则错误已修复。但是为什么仅 Windows 重启后 EncryptionAndAuthenticationRequired 就会成为不正确的模式?

正如我在编辑中提到的,如果我将 GattProtectionLevelEncryptionAndAuthenticationRequired 更改为 Plain,则错误已修复。

现在,我们担心这意味着没有加密或身份验证。然而,在我们使用蓝牙数据包嗅探器来确定之后,情况似乎并非如此。这是因为加密和身份验证的细节是在配对时完成的,而不是在连接

时完成的

根据 documentation:

Plain: Uses the default protection level.

Plain 并不代表 None。这意味着 "use the minimum security the device requires," 或本质上,根据配对时获得的信息自动进行。