我正在开发一个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-05-03 09:00:34
看看GattSampleContext
。您需要获得属性:System.Devices.Aep.IsConnected, System.Devices.Aep.Bluetooth.Le.IsConnectable
和只过滤设备,它们是可连接的。注意,在调用DeviceWatcher.Updated
事件后,设备可能变得可连接。因此,您必须跟踪一些unusedDevices
。
例如,我的IsConnactable过滤器方法是:
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;
}
发布于 2020-03-11 21:09:26
对我起作用的是让设备观察者枚举AssociationEndpointContainers,这与文档的意思相反。
具体来说,我用,
string[] RequestedProperties = { "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected", "System.Devices.Aep.Bluetooth.Le.IsConnectable"};
DeviceInformation.CreateWatcher(BluetoothLEDevice.GetDeviceSelectorFromConnectionStatus(BluetoothConnectionStatus.Disconnected), RequestedProperties, DeviceInformationKind.AssociationEndpointContainer)
我通过记录在发现过程中提供的每个DeviceInformation和DeviceInformationUpdate的所有属性来找出这一点,并发现与AssociationEndpoint和Device ( device !)不同,System.Devices.Aep.Bluetooth.Le.IsConnectable属性总是出现并直接对应于设备是否接通。
顺便说一句,回想起来,这是有道理的。在文档中,我们看到AssociationEndpointContainer
表示可能有多个与其关联的AssociationEndpoint对象的单个物理设备。例如,如果一个电视支持两个不同的网络协议,那么AssociationEndpointContainer就是电视。它还将有两个AssociationEndpoint对象来表示每个协议。
因此,这是Windows为跟踪与设备的连接而构造的中心结构。这是合理的,它将能够告诉我们,设备是否可以连接,或不。
我必须说,与之相反的是,DeviceInformationKind.Device没有提供这种功能,而且它甚至不代表设备,而是设备的组件,这是令人困惑的:
这些设备是表示设备功能的一部分的对象,并且可以选择在其上加载驱动程序。当物理设备与windows配对时,将为其创建多个设备对象。设备包含0或多个DeviceInterface对象,是一个DeviceContainer对象的子对象,并且与0或1个AssociationEndpoint对象相关。
关于这个主题的官方文档是。微软,这里有一个提示,如果你不想让人们在你的API上绊倒。我知道时间是宝贵的,有钱袋的人很难在他们冰冷的心灵中找到体面的东西,让开发者把他们的东西正确地记录下来,但出于对所有神圣的爱,如果你只提供如何使用你的东西的例子,那么就提供一些例子来解决初学者最常见的问题。
例如,对于初学者BLE开发人员来说,哪个目标更有可能实现?你会想要发现设备,即使它们无法连接,或者你只想发现那些可以连接到的设备。
谢什!
顺便说一句,在我搞清楚这一点之前,我走上了使用AdvertisementWatcher的道路。具体来说,我会检测广告,从广告中连接到设备以获得它的名称,然后将它处理掉。这是可怕的缓慢,可以占用大量的内存启动(间接,通过设备关联服务)。
在我的经验中,这种方法在各个方面都是优越的;它更快、更可靠,而且对系统资源的要求也更低。
发布于 2018-08-22 20:57:58
具体回答你的问题有点困难,因为你可以通过多种方式使用蓝牙连接到设备上。例如,有些设备需要配对才能使用。除非蓝牙堆栈发出查询,否则无法发现某些设备。
不过,要使这一目标朝着正确的方向发展,还有几件事要做。
就您可以用于AQS选择器的属性而言,我不确定是否存在是否有效,但以下是您在构建选择器/筛选器时可能考虑的其他一些属性。就像我说过的,这种情况会产生很大的不同;就像耳机必须配对一样,而有些LE设备不能配对,只是可以连接。
System.Devices.Aep.Bluetooth.IssueInquiry
System.Devices.Aep.Bluetooth.LastSeenTime
System.Devices.Aep.Bluetooth.Le.IsConnectable
System.Devices.Aep.IsPaired
System.Devices.Aep.CanPair
System.Devices.Aep.IsConnected
System.Devices.Aep.IsPresent
System.Devices.Aep.ProtocolId
选择器可以如下所示,以枚举配对的蓝牙BR设备:
System.Devices.Aep.ProtocolId:="{e0cbf06c-cd8b-4647-bb8a-263b43f0f974}" AND System.Devices.Aep.IsPaired:=System.StructuredQueryType.Boolean#True";
如果您有一个更具体的设备场景,我可以详细说明一个更具体的答案。
https://stackoverflow.com/questions/45568345
复制相似问题