Windows BLE UWP断开连接

时间:2016-09-20 16:23:03

标签: bluetooth-lowenergy

如何强制Windows与UWP应用中使用的BLE设备断开连接?我收到某些特征的通知,但在某些时候我想停止接收它们并确保我与BLE设备断开连接以保存BLE设备的电池?

6 个答案:

答案 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 完成了工作。