Windows UWP蓝牙应用程序,即使关闭电源,扫描时仍会显示设备 [英] Windows UWP bluetooth app, devices showing up when scanning even when they are powered off
问题描述
我正在开发一个UWP应用程序,该应用程序使用蓝牙连接到不同的设备.
I am developing a UWP app that is using bluetooth to connect to different devices.
我的问题是,某些已配对或先前发现的设备显示在我的设备列表中,即使它们已关闭或不在范围内.
My problem is that some devices that has been paired or previously discovered is showing up in my device list even though they are turned off or not in range.
据我了解,该属性系统.Devices.Aep.IsPresent 可用于过滤出当时不可用的缓存设备,但是即使我知道设备不可访问,我也总是会获得"True"属性.
As of my understanding the property System.Devices.Aep.IsPresent can be used to filter out cached devices that are not available at the time but I always get "True" for that property even though I know the device is not reachable.
关于如何解决这个问题的任何想法?
Any ideas on how this can be solved?
string[] requestedProperties = { "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected", "System.Devices.Aep.IsPresent", "System.Devices.Aep.ContainerId", "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.Manufacturer", "System.Devices.Aep.ModelId", "System.Devices.Aep.ProtocolId", "System.Devices.Aep.SignalStrength"};
_deviceWatcher = DeviceInformation.CreateWatcher("{REMOVED, NOT IMPORTANT}", requestedProperties, DeviceInformationKind.AssociationEndpoint);
_deviceWatcher.Added += DeviceAdded;
_deviceWatcher.Updated += DeviceUpdated;
_deviceWatcher.Removed += DeviceRemoved;
_deviceWatcher.EnumerationCompleted += DeviceEnumerationCompleted;
添加设备时的回调
此处isPresent始终为
Callback for when device is added
Here isPresent is always true
private void DeviceAdded(DeviceWatcher sender, DeviceInformation deviceInfo)
{
Device device = new Device(deviceInfo);
bool isPresent = (bool)deviceInfo.Properties.Single(p => p.Key == "System.Devices.Aep.IsPresent").Value;
Debug.WriteLine("*** Found device " + deviceInfo.Id + " / " + device.Id + ", " + "name: " + deviceInfo.Name + " ***");
Debug.WriteLine("RSSI = " + deviceInfo.Properties.Single(d => d.Key == "System.Devices.Aep.SignalStrength").Value);
Debug.WriteLine("Present: " + isPresent);
var rssi = deviceInfo.Properties.Single(d => d.Key == "System.Devices.Aep.SignalStrength").Value;
if (rssi != null)
device.Rssi = int.Parse(rssi.ToString());
if (DiscoveredDevices.All(x => x.Id != device.Id) && isPresent)
{
DiscoveredDevices.Add(device);
DeviceDiscovered(this, new DeviceDiscoveredEventArgs(device));
}
}
推荐答案
Look into the Microsoft Bluetooth LE Explorer source code of GattSampleContext
. You need to get properties: System.Devices.Aep.IsConnected, System.Devices.Aep.Bluetooth.Le.IsConnectable
and filter only devices, which are connectable. Take care, that the device may become connectable after the DeviceWatcher.Updated
event is called. So you have to keep some track of unusedDevices
.
例如我的IsConnactable过滤器方法是:
E.g. my IsConnactable filter method is:
private static bool IsConnectable(DeviceInformation deviceInformation)
{
if (string.IsNullOrEmpty(deviceInformation.Name))
return false;
// Let's make it connectable by default, we have error handles in case it doesn't work
bool isConnectable = (bool?)deviceInformation.Properties["System.Devices.Aep.Bluetooth.Le.IsConnectable"] == true;
bool isConnected = (bool?)deviceInformation.Properties["System.Devices.Aep.IsConnected"] == true;
return isConnectable || isConnected;
}
这篇关于Windows UWP蓝牙应用程序,即使关闭电源,扫描时仍会显示设备的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!