【问题标题】:Why does BluetoothLEAdvertisementWatcher stop firing `Received` events?为什么 BluetoothLEAdvertisementWatcher 停止触发“已接收”事件?
【发布时间】:2019-04-18 16:44:50
【问题描述】:

使用 BluetoothLEAdvertisementWatcher 的 WPF 应用程序最终将停止接收广告数据,并且似乎处于错误状态。

Windows 10 专业版 1809 内部版本 17763.292。 通过此 winmd 文件使用 Win 10 本机 API 的 WPF 应用程序:C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.17763.0\Windows.winmd

触发不良状态需要 1-7 小时,但最终总会发生。

进入bad状态后,“System”进程显示CPU占用率高。

在树莓派上发现了一些似乎描述相同行为的东西:https://github.com/MicrosoftDocs/windows-uwp/issues/812

可通过此 repo 重现:https://github.com/jeremywho/win10testingAdWatcher

这是BluetoothLEAdvertisementWatcher周围使用的代码:

public class MainWindowViewModel : BaseViewModel
{
    public ObservableCollection<DeviceViewModel> Devices { get; } = new ObservableCollection<DeviceViewModel>();
    private readonly BluetoothLEAdvertisementWatcher _watcher;
    private object _locker = new object();

    public MainWindowViewModel()
    {
        _watcher = new BluetoothLEAdvertisementWatcher {ScanningMode = BluetoothLEScanningMode.Active};
        _watcher.Received += OnAdvertisementReceived;
        _watcher.Stopped += OnAdvertisementWatcherStopped;

        _watcher.Start();
    }

    private void OnAdvertisementWatcherStopped(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementWatcherStoppedEventArgs args)
    {
        Debug.WriteLine($"{DateTime.Now} [{sender.Status}] [{sender.GetHashCode()}] stopped called");
    }

    private void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
    {
        if (string.IsNullOrEmpty(eventArgs.Advertisement.LocalName)) return;

        var timestamp = eventArgs.Timestamp;
        var advertisementType = eventArgs.AdvertisementType;
        var rssi = eventArgs.RawSignalStrengthInDBm;
        var localName = eventArgs.Advertisement.LocalName;

        Debug.WriteLine($"[{DateTime.Now}] [{timestamp}] [{localName}] [{rssi}] [{advertisementType}]");

        lock(_locker)
        {
            var foundDevice = Devices.FirstOrDefault(d => d.BluetoothAddress == eventArgs.BluetoothAddress.ToString());
            if (foundDevice != null)
            {
                foundDevice.LastSeen = timestamp.ToString();
                return;
            }
        }

        Application.Current.Dispatcher.Invoke(() =>
        {
            lock (_locker)
            {
                var device = new DeviceViewModel(eventArgs.Advertisement.LocalName, eventArgs.BluetoothAddress, timestamp);
                Devices.Add(device);
            }
        });
    }
}

【问题讨论】:

  • 这可能是内存问题。如果您不介意,可以试试我们的Bluetooth Framework。有 Beacon 演示可以满足您的需求。
  • 我有完全相同的问题,可以在 3 台机器上重现它。 (相同的 Windows 版本)一旦我尝试重新启动,就会出现蓝屏。看起来确实是驱动程序问题。
  • 我现在已经使用 UWP 测试应用进行了尝试。它以相同的结果失败(Win 10 1809)。所以我认为我们可以排除在.net中使用UWP SDK会导致这个错误。

标签: bluetooth windows-10 bluetooth-lowenergy


【解决方案1】:

如果您运行“主动扫描”,这似乎是 Windows 10(1809 也可能更早)中的一个已知错误。

是的,如果您的应用程序导致操作系统执行“主动扫描”,则您的应用程序可能会导致此行为。您是否在使用 DeviceWatcher,如果是,您可以分享您的应用程序正在使用的查询吗?

我们也在研究缓解措施,我们在最新的 19H1 版本中有一个。如果您加入 Windows 预览体验成员并选择包含“主动开发”的选项,则不建议长时间进行主动扫描。

https://social.msdn.microsoft.com/Forums/en-US/274e5d96-d21d-490d-8c8b-934a41239f88/windows-100177631-microsoftbluetoothlegacyleenumeratorsys-stuck-in-its-deviced0entry-routine?forum=wdk

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多