首页 文章

蓝牙LE设备无法在Win 10 IoT UWP应用程序中断开连接

提问于
浏览
3

我试图在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并重新启动应用程序以便新广告从同一设备中得到认可 . 在与设备的通信完成之后,可以识别来自相同类型的不同设备的广告 . 但是当第二设备完成通信时,不能再次识别来自它或第一设备的新广告 . 调试模式中未报告任何异常或其他问题 . 这在应用程序 生产环境 版本中实际上是不可接受的 .

请告诉我如何解决这个问题 . 谢谢 .

1 回答

  • 2

    此问题可能是由GattDeviceService的活动会话未关闭引起的 .

    当您连接BLE设备并访问其服务和特性时,您的操作会有一个活动会话 . 您处置设备但会话仍处于打开状态 .

    要解决此问题,您需要在断开设备时再做一些工作,如下所示:

    • 如果您打开了服务(GattDeviceService),则需要调用 service?.Dispose() .

    • 如果您打开了一个特征(GattCharacteristic),则需要调用 characteristic?.Service?.Dispose() .

    要检查会话状态,您可以调用 service?.Session.SessionStatuscharacteristic?.Service?.Session.SessionStatus

    Update: 可能serval特征属于一个服务 . 因此,当您从特征级别进行处置时可能会遇到异常,因为您可能会复制以关闭已关闭的服务 . 要解决此问题,您可以在服务级别进行配置工作 . 以下代码段基于BluetoothLE sample . 您可以像这样编辑ClearBluetoothLEDeviceAsync():

    private async Task<bool> ClearBluetoothLEDeviceAsync()
            {
                ...
    
                foreach (var ser in ServiceCollection)
                {
                    ser.service?.Dispose();
                }
    
                bluetoothLeDevice?.Dispose();
                bluetoothLeDevice = null;
                return true;
            }
    

相关问题