如何重新连接到 BLE 设备? - UWP

How can I reconnect to BLE device? - UWP

设备 ID 和地址都是随机的,我不能将它们重新用于 bleDevice = await BluetoothLEDevice.FromIdAsyncbleDevice = await BluetoothLEDevice.FromBluetoothAddressAsync

我提出了 2 种可能的解决方案:(1)ConnectionStatusChange & (2)Pairing,

但这两种情况我都有问题。


(1) 主要问题

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

然后我退订,处理特征&服务&蓝牙设备,并设置为空

在重新连接的情况下,我尝试使用

而不是 bleDevice = await BluetoothLEDevice.FromIdAsync(bleDeviceReconnect.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或地址不变?

我首先需要使用我上面说的任何一种方法来获取蓝牙 LE 对象,我可以用它来找到自定义服务 (sList = bleDevice.GetGattServicesForUuidAsync) 和特征 (cList = sList.Services[0].GetCharacteristicsForUuidAsync), 和 subscribe/write 到特征等等。

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


如何才能正确重新连接到 BLE 设备???

非常感谢任何帮助。


编辑

Richard Zhang - MSFT 要求我添加一个最小的可运行演示:

Microsoft BluetoothLE Code

(1) Scenario2_Client.xaml

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

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

(2) Scenario2_Client.xaml.cs

声明private BluetoothLEDevice bluetoothLeDeviceReconnect

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 帐户,上传我的项目,然后复制 link 并粘贴到此处。

NVM 有效!

移动应用是配对过程中的问题。

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

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

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