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

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 并重新启动应用程序以获取新广告从同一设备被识别。与设备的通信完成后,可以识别来自不同设备的同一类型的广告。但是当第二个设备完成通信时,不能再次识别来自它或第一个设备的新广告。在调试模式下没有报告异常或其他问题。这在应用程序生产版本中确实是不可接受的。

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

Rit*_*Han 9

此问题可能是由于GattDeviceService的活动会话未关闭所致

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

要解决此问题,您需要在像这样断开设备连接时做更多的工作:

  1. 如果您打开了一个服务(GattDeviceService),您需要调用service?.Dispose().
  2. 如果您打开了一个特性(GattCharacteristic),您需要调用characteristic?.Service?.Dispose().

要检查会话状态,您可以致电service?.Session.SessionStatuscharacteristic?.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)

  • 我发现除了 ser.Service?.Dispose(); 为了最大限度地减少内存泄漏,应用 ser.Service?Session?.Dispose(); 会很有帮助。 (2认同)