我正在尝试加速我编写的一些用于连接O6设备的UWP蓝牙代码。以下是一些典型的时序测量:
// 20ms
DiscoveredGattDeviceService = DiscoveredBluetoothLEDevice.GetGattService(gattServiceGuid);
// 4,284ms
result = await DiscoveredBluetoothLEDevice.GetGattServicesForUuidAsync(gattServiceGuid, BluetoothCacheMode.Uncached);
// 444ms
result = await DiscoveredBluetoothLEDevice.GetGattServicesForUuidAsync(gattServiceGuid, BluetoothCacheMode.Cached);
(N.B。最快的是过时的。)
从这些数字中可以看出,我应该选择最后一种方法,它比未缓存的呼叫快得多,并且没有标记为过时。但是,如果我选择两个更快的调用中的任何一个,我后来在我的代码中遇到了问题,我调用GattCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync
会抛出异常
System.ObjectDisposedException
显然,我已经尝试将所有东西都视为静止,但这是我无法控制的。
我使用此代码获取GattCharacteristic
var accessStatus = await DiscoveredGattDeviceService.RequestAccessAsync();
然后
var result = await DiscoveredGattDeviceService.GetCharacteristicsAsync(BluetoothCacheMode.Uncached);
并且在对BluetoothCacheMode.Uncached
BluetoothCacheMode.Cached
或GetCharacteristicsAsync
时,错误没有区别
我错过了什么?如何将GetGattServicesForUuidAsync
与BluetoothCacheMode.Cached
一起使用并最终处于我可以订阅GATT特征的状态?
答案 0 :(得分:-1)
System.ObjectDisposedException
对已处置对象执行操作时引发的异常。 ObjectDisposedException
你在调用这个方法的地方
public IAsyncOperation<GattCommunicationStatus> WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue clientCharacteristicConfigurationDescriptorValue)
其中的论点
的 GattClientCharacteristicConfigurationDescriptorValue 强>
为此特性对象的ClientCharacteristicConfigurationDescriptor指定一个新值。因为它的枚举有三个现有字段。
GattClientCharacteristicConfigurationDescriptorValue fields.
当您传递BluetoothCacheMode枚举(指示某些蓝牙API方法是否应对系统中缓存的值进行操作或从蓝牙设备检索这些值)时,只有两个字段。 BluetoothCacheMode fields
请证明你的代码是正确的,并为返回管理异步操作的对象的方法调试appopriate参数值,该方法在完成后返回操作完成的状态。
您可以使用此方法
public IAsyncOperation<GattDeviceServicesResult> GetGattServicesForUuidAsync(Guid serviceUuid, BluetoothCacheMode cacheMode)
返回具有指定UUID的Bluetooth LowEnergy设备的GattDeviceServices。