如何强制Windows与UWP应用中使用的BLE设备断开连接?我收到某些特征的通知,但在某些时候我想停止接收它们并确保我与BLE设备断开连接以保存BLE设备的电池?
答案 0 :(得分:2)
假设您的应用程序作为gatt客户端运行,并且您在代码中使用了以下实例:
GattCharacteristic myGattchar; // The gatt characteristic you are reading or writing on your BLE peripheral
GattDeviceService myGattServ; // The BLE peripheral' gatt service on which you are connecting from your application
BluetoothLEDevice myBleDev; // The BLE peripheral device your are connecting to from your application
当您已经连接到BLE外围设备时,如果您调用Dispose()
这样的方法:
myBleDev.Dispose();
和/或myGattServ.Dispose()
;和/或myGattchar.Service.Dispose()
您肯定会释放应用中的资源,但不会干净地关闭BLE连接:应用程序无法访问连接的控制资源。尽管如此,仍然会在堆栈的较低层建立连接(在我的外围设备上,在调用任何Dispose()
方法后,蓝牙连接活动 LED仍保持开启状态。)
强制断开连接是通过首先禁用有关特征的通知和指示(例如上面示例中的 myGattchar ),将0(零)写入 Client Characteristic Configuration descriptor < / em>通过使用参数 GattClientCharacteristicConfigurationDescriptorValue.None 调用方法WriteClientCharacteristicConfigurationDescriptorAsync
获取该特征:
GattCommunicationStatus status =
await myGattchar.WriteClientCharacteristicConfigurationDescriptorAsync(
GattClientCharacteristicConfigurationDescriptorValue.None);
答案 1 :(得分:1)
对于我的UWP应用程序,即使我使用了Dispose()方法,我仍然收到通知。帮助我的是将我的设备和特性设置为null。例如:
device.Dispose();
device = null;
并非所有人都能确定这种编程是如何“正确”的,但到目前为止它一直对我有用。
答案 2 :(得分:1)
来自 Microsoft 的 UWP 蓝牙 BLE 示例代码(处置 BLE 设备)对我不起作用。我必须添加代码(处理服务)才能断开设备连接。
private async Task<bool> ClearBluetoothLEDeviceAsync()
{
if (subscribedForNotifications)
{
// Need to clear the CCCD from the remote device so we stop receiving notifications
var result = await registeredCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.None);
if (result != GattCommunicationStatus.Success)
{
return false;
}
else
{
selectedCharacteristic.ValueChanged -= Characteristic_ValueChanged;
subscribedForNotifications = false;
}
}
selectedService?.Dispose(); //added code
selectedService = null; //added code
bluetoothLeDevice?.Dispose();
bluetoothLeDevice = null;
return true;
}
答案 3 :(得分:0)
只需处置与设备相关的所有对象。这将断开设备,除非有其他应用程序连接到它。
答案 4 :(得分:0)
请记住,对于您调用过-=
或+=
的事件,您必须调用Dispose()
,否则将永远无法真正正确地进行垃圾回收。我知道,还有更多代码。但这就是事实。
不仅仅是蓝牙,我还会提醒您-包括所有内容。您不能硬引用事件处理程序,也不能使垃圾回收按预期工作。
答案 5 :(得分:0)
执行所有建议的处理和空引用并没有实现我正在寻找的 Windows(Windows 设置)断开连接。
但是通过 DeviceIoControl 处理 IOCTL 完成了工作。