.NET 与 Windows RT 蓝牙 LE API - 重新启动 Windows 后无法读取或写入设备
Posted
技术标签:
【中文标题】.NET 与 Windows RT 蓝牙 LE API - 重新启动 Windows 后无法读取或写入设备【英文标题】:.NET with Windows RT Bluetooth LE API - cannot read or write device after restarting Windows 【发布时间】:2017-04-05 09:45:46 【问题描述】:我一直在为 Windows 8.1 及更高版本使用低功耗蓝牙的 WinRT API 开发应用程序。它工作了一段时间,但我遇到了一个严重的问题:Windows 重新启动后软件无法连接到设备。
如果我关闭并重新启动软件,它仍然无法配对。唯一有效的是,如果我取消配对并与设备重新配对。但是,考虑到我们用户的用例,这是完全不能接受的。设备固件不会有问题,因为它仍然能够与 ios 配对和交互。
在调试中,每当我尝试使用txCharacteristic.WriteValueAsync(chunk, GattWriteOption.WriteWithoutResponse)
写入设备时,我都会收到“功能不正确”。但是,我知道这是正确的功能,因为这正是设备支持的功能,更不用说如果我取消配对并重新配对,代码也可以正常工作。此外,当我尝试展开 PresentationFormats 属性时出现此错误:
PresentationFormats 'this.txServiceCharacteristic.PresentationFormats' 引发了“System.AccessViolationException” System.Collections.Generic.IReadOnlyList System.AccessViolationException 类型的异常
所以这告诉我这是 Windows 的问题。我目前正在运行 10。
我尝试过更新设备驱动程序,将蓝牙服务设置为自动启动(从默认的手动“触发”启动),但似乎没有什么可以缓解这个问题。有谁知道是什么原因造成的,有什么解决办法吗?
谢谢!
编辑:显然,如果我将 GattProtectionLevel 从 EncryptionAndAuthenticationRequired 更改为 Plain,则错误已得到修复。但是,为什么仅在 Windows 重新启动后 EncryptionAndAuthenticationRequired 会是不正确的模式?
【问题讨论】:
【参考方案1】:正如我在编辑中提到的,如果我将 GattProtectionLevel
从 EncryptionAndAuthenticationRequired
更改为 Plain
,错误就会得到修复。
现在,我们担心这意味着没有加密或身份验证。但是,在我们使用蓝牙数据包嗅探器确定之后,情况似乎并非如此。这是因为加密和身份验证的细节是在配对时完成的,而不是在连接时完成的。
根据documentation:
普通:使用默认保护级别。
Plain
不代表None
。这意味着“使用设备所需的最低安全性”,或者本质上是根据配对时获得的信息自动进行的。
【讨论】:
以上是关于.NET 与 Windows RT 蓝牙 LE API - 重新启动 Windows 后无法读取或写入设备的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 Windows 10 中使用蓝牙 LE 库 C# 与传感器或微控制器通信?
有啥方法可以从 Windows 10 中的 c# 桌面应用程序使用蓝牙 LE?