【发布时间】: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