如何可靠地检测BLE设备超出范围以正确断开连接,然后重新连接?

时间:2019-04-12 21:19:51

标签: c# wpf bluetooth-lowenergy

我正在编写一个通过BLE与手指传感器通信的WPF应用。通常它可以正常工作:我可以扫描传感器,选择一个,连接,断开连接等。但是仍然存在一个问题。当传感器超出范围时,该应用将停止接收值更改通知,通常每10毫秒发送一次。如果我尝试在几秒钟后使用以下代码手动断开连接:

var result = await SelectedCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.None);
if (result == GattCommunicationStatus.Success)
{
    RemoveValueChangedHandler();
    res = true;
    NotifyUser("Successfully disconnected from the selected BerryMed sensor.", NotifyType.StatusMessage);
}
else
{
    NotifyUser("Error un-registering for value changed notifications.", NotifyType.ErrorMessage);
}

结果返回false。同样,只有当应用程序由于超出范围而停止接收通知并且我的响应延迟了几秒钟时,它才会发生。

那么,有什么方法可以以编程方式检测到连接丢失(通知停止发出时),然后调用此方法以按时断开连接吗?

我尝试使用一个特殊的500毫秒计时器来监视值更改通知,并检测它们何时停止发送。需要1秒钟来检测它并呼叫断开连接。但是问题在于,断开连接仅工作一次。如果我在不退出应用程序的情况下再次连接并再次超出范围,则此断开连接将不再起作用。如果我重新启动该应用程序,则会重复执行-在第一个超出范围后成功断开连接,而在随后的范围内失败。

1 个答案:

答案 0 :(得分:0)

那不是断开连接的正确方法。
方法的结果返回false,因为在无法访问设备时无法写入设备,因此可以预期此结果。
使用ConnectionStatusChanged事件处理程序查找连接是否丢失。 使用此事件的结果来断开连接。
在Windows上执行此操作的方法是,丢弃对设备的BluetoothLEDevice对象的所有引用(如果系统上没有其他应用程序具有对该设备的引用),则在短暂的超时时间后将触发自动断开连接。只需致电:     bluetoothLeDevice.Dispose();

如果要重新连接,请使用广告监视程序查看设备是否已准备好重新连接并可以再次连接。您的设备还具有断开连接的超时时间,该超时时间可能从几秒钟到40秒不等,此时间过后它将重新开始播发广告。