我试图控制在我的Win 10 IoT UWP C#应用程序中的蓝牙LE设备连接/断开,运行在Raspberry Pi 3 SBC上。Win 10 IoT是Windows内部人士预览版10.0.17035.1000。当我启动我的应用程序,它识别广告BLE设备,成功地与它连接和通信。然后,我尝试通过应用推荐的程序来断开这个设备:
device.Dispose();
设备=空;
GC.Collect();
甚至停止并重新启动BluetoothLEAdvertisementWatcher。但是当这个设备再次开始广告时,它就不被识别了。据我理解,原因是设备实际上没有断开(尽管它显示断开连接状态),或者某些连接信息仍在等待,这使得它无法在新的广告中被识别。
即使我不应用上述过程,一个新的设备广告(来自同一设备或其他BLE设备)也不被识别,在这两种情况下,唯一的方法是重新启动Win 10 IoT并重新启动应用程序,以便从同一设备上获得一个新的广告才能被识别。在与设备的通信完成后,可以识别来自同一类型不同设备的广告。但是,当第二设备完成通信时,无法再次识别来自它或第一设备的新广告。在调试模式下没有报告任何异常或其他问题。在应用程序生产版本中,这确实是不可接受的。
请告诉我如何解决这个问题。谢谢。
发布于 2017-12-08 06:18:17
此问题可能是由于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;
}https://stackoverflow.com/questions/47702584
复制相似问题