Uwp 如何重新连接到BLE设备?-超宽带

Uwp 如何重新连接到BLE设备?-超宽带,uwp,bluetooth-lowenergy,win-universal-app,windows-10-universal,gatt,Uwp,Bluetooth Lowenergy,Win Universal App,Windows 10 Universal,Gatt,设备id和地址都是随机的,我无法将它们用于bleDevice=await BluetoothLEDevice.FromIdAsync或bleDevice=await BluetoothLEDevice.FromBluetoothAddressAsync 我提出了两种可能的解决方案:(1)连接状态更改和(2)配对 但这两种情况我都有问题 (1)主要问题 在断开连接之前,我首先将bleDevice保存为bleDeviceConnect 然后我取消订阅,处理特征、服务和蓝牙设备,并将它们设置为空 在

设备id和地址都是随机的,我无法将它们用于
bleDevice=await BluetoothLEDevice.FromIdAsync
bleDevice=await BluetoothLEDevice.FromBluetoothAddressAsync

我提出了两种可能的解决方案:(1)连接状态更改和(2)配对

但这两种情况我都有问题


(1)主要问题

在断开连接之前,我首先将
bleDevice
保存为
bleDeviceConnect

然后我取消订阅,处理特征、服务和蓝牙设备,并将它们设置为空

在重新连接的情况下,我尝试使用以下方法代替
bleDevice=Wait BluetoothLEDevice.FromIdAsync(bleDeviceConnect.DeviceId)

var newSession = GattSession.FromIdAsyn(bleDeviceReconnect.BluetoothDeviceId);
newSession.MaintainConnection = true;
bleDeviceReconnect.ConnectionStatusChanged += ConnectionStatusChangedHandler;
但在这种情况下,永远不会调用事件处理程序。

处理程序如下所示:

private async void ConnectionStatusChangedHandler(BluetoothLEDevice bluetoothLeDevice, object o)
{
   Debug.WriteLine(bluetoothLeDevice.ConnectionStatus.ToString()) //To check if event comes or not
   if(bluetoothLeDevice.ConnectionStatus.ToString() == "Conncected")
   {
      sList = bluetoothLeDevice.GetGattServicesForUuidAsync(custom service GUID)
      .
      .
      .
   }
}
(2)如果你也能回答这个问题,那就太好了,但如果你不知道或不想回答,就不必回答

配对是否会使设备id或地址保持不变?

我首先需要使用上面提到的任何一种方法来获取Bluetooth LE对象,我可以使用它来查找自定义服务(
sList=bleDevice.GetGattServicesForuidAsync
)和特征(
cList=sList.Services[0].GetCharacteristicsForuidAsync
),以及订阅/写入特征等等

因此,如果id或地址发生变化,配对就没有意义


如何正确地重新连接到BLE设备

我真的很感激任何帮助


编辑

Richard Zhang-MSFT要求提供一个最低限度的可运行演示,我正在添加以下内容:

(1) Scenario2_Client.xaml

添加2个按钮:[断开]和[重新连接]

*断开连接不会立即发生。请至少等待5秒钟,然后再按[Reconcect]

(2) 场景2_Client.xaml.cs

声明
专用蓝牙设备蓝牙设备连接

private void Disconnect_btn_Click(object sender, RoutedEventArgs e)
{
   bluetoothLeDeviceReconnect = bluetoothLeDevice;

   RemoveValueChangedHandler();
   selectedCharacteristic?.Service?.Dispose();
   selectedCharacteristic = null;
   service.Dispose();
   service = null;
   bluetoothLeDevice?.Dispose();
   bluetoothLeDevice = null;
   GC.Collect();
}

private void Reconnect_btn_Click(object sender, RoutedEventArgs e)
{
   var newSession = GattSession.FromIdAsyn(bluetoothLeDeviceReconnect.BluetoothDeviceId);
   newSession.MaintainConnection = true;
   bluetoothLeDeviceReconnect.ConnectionStatusChanged += ConnectionStatusChangedHandler;
}

private async void ConnectionStatusChangedHandler(BluetoothLEDevice bluetoothLeDevice, object o)
{
   SEE ABOVE
}
目前我没有时间了,我还不能测试这个


让我知道这是否和我说的不一样!我将创建一个GitHub帐户,上传我的项目,复制链接并粘贴到这里。

NVM它可以工作

配对过程中,手机应用程序出现问题

此外,我还必须配对并添加处理程序才能使其正常工作

我可以通过处理程序获取BluetoothLEDevice对象, 但搜索服务现在是一个问题


由于这与我在本文中提出的问题不同,我将发布一个新问题。

您好,我希望您能提供一个最小的可运行演示,以便我们可以帮助您找到问题所在。或者你可以参考,我测试过了,它可以正常从Id获取设备,这至少表明配对后设备的
uuid
没有变化。您好,谢谢您的评论。我已经阅读了该示例,我遵循与设备搜索完全相同的流程。我的代码就像在Scenario2中添加了两个按钮,[Disconnect]&[Reconnect]。请稍候,我将编辑我的问题。您好,
Scenario2\u Client.xaml.cs
包含
ClearBluetoothLEDeviceAsync
方法。在Disconnect中,您可以直接调用此方法,但由于已释放
bluetoothLeDevice
,因此需要重新使用
等待bluetoothLeDevice.FromIdAsync(selectedBleDeviceId)在建立GATT会话之前建立设备连接。您好,您的意思是我需要添加
var newSession。。。。处理程序
bleDevice=Wait…
行之后的行,而不是替换该行,对吗?我试试看!不幸的是,我试过了,但效果不太好。处理程序从未像以前那样被调用。新错误发生是因为我忘记删除处理程序dah!现在效果很好!