如何重新连接到 BLE 设备? - UWP
How can I reconnect to BLE device? - UWP
设备 ID 和地址都是随机的,我不能将它们重新用于 bleDevice = await BluetoothLEDevice.FromIdAsync
或 bleDevice = 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 要求我添加一个最小的可运行演示:
(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 提出一个新问题。
设备 ID 和地址都是随机的,我不能将它们重新用于 bleDevice = await BluetoothLEDevice.FromIdAsync
或 bleDevice = 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 要求我添加一个最小的可运行演示:
(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 提出一个新问题。