Pau*_*mov 6 windows-10-iot-core uwp
我试图在我的 Win 10 IoT UWP C# 应用程序中控制蓝牙 LE 设备的连接/断开,在 Raspberry Pi 3 SBC 上运行。Win 10 IoT 是 Windows Insiders Preview 版本 10.0.17035.1000。当我启动我的应用程序时,它识别广告 BLE 设备,成功连接并与之通信。然后我尝试通过应用推荐的程序断开此设备的连接:
device.Dispose();
设备 = 空;
GC.Collect();
甚至停止并重新启动 BluetoothLEAdvertisementWatcher。但是当这个设备再次开始广告时,它就无法识别了。据我了解,原因是该设备实际上并未断开连接(尽管它显示断开连接状态)或某些连接信息仍处于待处理状态,这会阻止它在新广告中被识别。
即使我不应用上述程序,也无法识别新设备广告(来自相同或其他 BLE 设备),在这两种情况下,唯一的方法是重新启动 Win 10 IoT 并重新启动应用程序以获取新广告从同一设备被识别。与设备的通信完成后,可以识别来自不同设备的同一类型的广告。但是当第二个设备完成通信时,不能再次识别来自它或第一个设备的新广告。在调试模式下没有报告异常或其他问题。这在应用程序生产版本中确实是不可接受的。
请告诉我如何解决这个问题。谢谢。
此问题可能是由于GattDeviceService的活动会话未关闭所致。
当您连接 BLE 设备并访问其服务和特性时,您的操作就会有一个活动会话。您处理了设备,但会话仍处于打开状态。
要解决此问题,您需要在像这样断开设备连接时做更多的工作:
service?.Dispose().characteristic?.Service?.Dispose().要检查会话状态,您可以致电service?.Session.SessionStatus或
characteristic?.Service?.Session.SessionStatus
更新: 可能有一些特征属于一项服务。因此,当您从特征级别进行处置时,您可能会遇到异常,因为您可能会重复关闭已关闭的服务。要解决此问题,您可以在服务级别进行处置工作。以下代码基于BluetoothLE 示例。您可以像这样编辑 ClearBluetoothLEDeviceAsync():
private async Task<bool> ClearBluetoothLEDeviceAsync()
{
...
foreach (var ser in ServiceCollection)
{
ser.service?.Dispose();
}
bluetoothLeDevice?.Dispose();
bluetoothLeDevice = null;
return true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3016 次 |
| 最近记录: |