И идентификатор устройства, и адрес случайные, поэтому я НЕ МОГУ использовать их повторно для bleDevice = await BluetoothLEDevice.FromIdAsync
или bleDevice = await BluetoothLEDevice.FromBluetoothAddressAsync
.
Я предложил 2 возможных решения: (1) ConnectionStatusChange & (2) Pairing,
, но в обоих случаях у меня проблемы.
(1) ГЛАВНЫЙ ВОПРОС
Перед тем как отключиться, я сначала сохраняю bleDevice
как bleDeviceReconnect
.
Затем я отписываюсь, распоряжаюсь характеристиками и обслуживанием устройства Bluetooth, и устанавливаю их на нуль.
В случае повторного подключения вместо 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) Было бы здорово, если бы вы могли ответить и на этот вопрос, но вам не нужно, если вы не знаете илиВы не хотите
Делает ли спаривание идентификатор устройства или адрес неизменным?
Сначала мне нужно использовать один из методов, которые ясказано выше в орддля получения объекта Bluetooth LE, который я могу использовать для поиска пользовательского сервиса (sList = bleDevice.GetGattServicesForUuidAsync
) и характеристик (cList = sList.Services[0].GetCharacteristicsForUuidAsync
), а также подписки / записи на характеристики и т. д.
Следовательно,если идентификатор или адрес изменяются, спаривание не имеет смысла.
Как правильно подключиться к устройству BLE ???
Буду очень признателен за любую помощь.
РЕДАКТИРОВАТЬ
Ричард Чжан - MSFT попросил минимальную работоспособную демонстрацию, которую я добавляю:
Код Microsoft BluetoothLE
(1) Scenario2_Client.xaml
Добавить 2 кнопки: [Отключить] и [Повторно подключить]
* Отключение не происходит сразу. Пожалуйста, подождите не менее 5 секунд, прежде чем нажать [Reconncect]
(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, загрузю свой проект, скопирую ссылку и вставлю ее сюда.