【问题标题】:Bluetooth LE device cannot disconnect in Win 10 IoT UWP application蓝牙 LE 设备无法在 Win 10 IoT UWP 应用程序中断开连接
【发布时间】:2018-05-22 00:06:26
【问题描述】:

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

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

【问题讨论】:

  • 实际上只有一个来自不同BLE设备的新广告只被识别一次,而来自已服务设备的其他广告则无法识别。

标签: uwp windows-10-iot-core


【解决方案1】:

这个问题可能是GattDeviceService的活动会话没有被关闭。

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

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

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

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

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

        private async Task<bool> ClearBluetoothLEDeviceAsync()
        {
            ...

            foreach (var ser in ServiceCollection)
            {
                ser.service?.Dispose();
            }

            bluetoothLeDevice?.Dispose();
            bluetoothLeDevice = null;
            return true;
        }

【讨论】:

  • 谢谢丽塔。我会试试你的方法。
  • 再次感谢您。我实现了活动会话和特征处理,尽管我的应用程序与之通信的 BLE 设备只是一个信标设备,并且不需要显式打开连接。这有帮助。但另一个似乎有必要的想法是使用设备系列默认服务 UUID 在 ServiceUuids 中设置 BluetoothLEAdvertisementWatcher 过滤器。然后我必须应用我之前提到的序列。
  • @PaulTomov 要明确,我们需要关注最初的问题:建立连接时或仅在使用信标(无连接)时出现问题?是我的误会还是有新的问题?
  • 我的解释不准确。据我了解,应按照以下说明建立与 BLE 设备的连接:docs.microsoft.com/en-us/windows/uwp/devices-sensors/…。同一链接指出:“为设备处理所有对 BluetoothLEDevice 对象的引用(并且如果系统上没有其他应用程序对该设备的引用)将在一小段超时后触发自动断开连接。”但这还不够,此外,我必须按照您的建议处理有源设备的服务和特征。
  • 我发现除了 ser.Service?.Dispose();为了最大限度地减少内存泄漏,应用 ser.Service?Session?.Dispose();
猜你喜欢
  • 2016-01-19
  • 2018-11-16
  • 1970-01-01
  • 2021-05-21
  • 2012-10-09
  • 2020-09-14
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多