我正在开发一个UWP应用程序,它使用蓝牙连接到不同的设备。
我的问题是,一些已经配对或先前发现的设备出现在我的设备列表中,即使它们被关闭或不在范围内。
据我所知,属性 System.Devices.Aep.IsPresent 可用于筛选出当时不可用的缓存设备,但我始终获得该属性的"True“,即使我知道设备是不可访问的。
对如何解决这件事有什么想法吗?
设置
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总是正确的
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)); }
发布于 2018-08-22 20:57:58
具体回答你的问题有点困难,因为你可以通过多种方式使用蓝牙连接到设备上。例如,有些设备需要配对才能使用。除非蓝牙堆栈发出查询,否则无法发现某些设备。
不过,要使这一目标朝着正确的方向发展,还有几件事要做。
就您可以用于AQS选择器的属性而言,我不确定是否存在是否有效,但以下是您在构建选择器/筛选器时可能考虑的其他一些属性。就像我说过的,这种情况会产生很大的不同;就像耳机必须配对一样,而有些LE设备不能配对,只是可以连接。
System.Devices.Aep.Bluetooth.IssueInquiry System.Devices.Aep.Bluetooth.LastSeenTime