我正在尝试控制在Raspberry Pi 3 SBC上运行的Win 10 IoT UWP C#应用程序中的蓝牙LE设备连接/断开连接。 Win 10 IoT是Windows Insiders Preview build 10.0.17035.1000。当我启动我的应用程序时,它识别广告BLE设备,成功连接并与之通信。然后我尝试通过应用建议的过程断开此设备:
device.Dispose();
device = null;
GC.Collect的();
甚至停止并重新启动BluetoothLEAdvertisementWatcher。但是,当此设备再次开始广告时,无法识别。根据我的理解,原因是该设备实际上并未断开连接(尽管它显示断开状态)或某些连接信息仍处于待处理状态,这阻止了它在新广告中被识别。
即使我不应用上述程序,也无法识别新的设备广告(来自相同或其他BLE设备),在这两种情况下,唯一的办法是重新启动Win 10 IoT并重新启动应用程序为了识别来自同一设备的新广告。在与设备的通信完成之后,可以识别来自相同类型的不同设备的广告。但是当第二设备完成通信时,不能再次识别来自它或第一设备的新广告。调试模式中未报告任何异常或其他问题。这在应用程序生产版本中确实是不可接受的。
请告诉我如何解决这个问题。感谢。
答案 0 :(得分:3)
此问题可能是由GattDeviceService的有效会话尚未关闭引起的。
当您连接BLE设备并访问其服务和特性时,您的操作会有一个活动会话。您丢弃设备但会话仍处于打开状态。
要解决此问题,您需要在断开设备时再做一些工作:
service?.Dispose()
。characteristic?.Service?.Dispose()
。要检查会话状态,您可以拨打service?.Session.SessionStatus
或
characteristic?.Service?.Session.SessionStatus
<强>更新强> serval特征可能属于一个服务。因此,当您从特征级别进行处置时可能会遇到异常,因为您可能会复制以关闭已关闭的服务。 要解决此问题,您可以在服务级别进行配置工作。以下代码段基于BluetoothLE sample。您可以像这样编辑ClearBluetoothLEDeviceAsync():
private async Task<bool> ClearBluetoothLEDeviceAsync()
{
...
foreach (var ser in ServiceCollection)
{
ser.service?.Dispose();
}
bluetoothLeDevice?.Dispose();
bluetoothLeDevice = null;
return true;
}