private async void ServiceList_SelectionChanged() { var service = (GattDeviceService)((ComboBoxItem)ServiceList.SelectedItem)?.Tag; CharacteristicList.Items.Clear(); RemoveValueChangedHandler(); IReadOnlyList <GattCharacteristic> characteristics = null; try { // Ensure we have access to the device. var accessStatus = await service.RequestAccessAsync(); if (accessStatus == DeviceAccessStatus.Allowed) { // BT_Code: Get all the child characteristics of a service. Use the cache mode to specify uncached characterstics only // and the new Async functions to get the characteristics of unpaired devices as well. var result = await service.GetCharacteristicsAsync(BluetoothCacheMode.Uncached); if (result.Status == GattCommunicationStatus.Success) { characteristics = result.Characteristics; } else { rootPage.NotifyUser("Error accessing service.", NotifyType.ErrorMessage); // On error, act as if there are no characteristics. characteristics = new List <GattCharacteristic>(); } } else { // Not granted access rootPage.NotifyUser("Error accessing service.", NotifyType.ErrorMessage); // On error, act as if there are no characteristics. characteristics = new List <GattCharacteristic>(); } } catch (Exception ex) { rootPage.NotifyUser("Restricted service. Can't read characteristics: " + ex.Message, NotifyType.ErrorMessage); // On error, act as if there are no characteristics. characteristics = new List <GattCharacteristic>(); } foreach (GattCharacteristic c in characteristics) { CharacteristicList.Items.Add(new ComboBoxItem { Content = DisplayHelpers.GetCharacteristicName(c), Tag = c }); } CharacteristicList.Visibility = Visibility.Visible; }
private async void ConnectButton_Click() { ConnectButton.IsEnabled = false; if (!await ClearBluetoothLEDeviceAsync()) { rootPage.NotifyUser("Error: Unable to reset state, try again.", NotifyType.ErrorMessage); ConnectButton.IsEnabled = true; return; } try { // BT_Code: BluetoothLEDevice.FromIdAsync must be called from a UI thread because it may prompt for consent. bluetoothLeDevice = await BluetoothLEDevice.FromIdAsync(rootPage.SelectedBleDeviceId); if (bluetoothLeDevice == null) { rootPage.NotifyUser("Failed to connect to device.", NotifyType.ErrorMessage); } } catch (Exception ex) when(ex.HResult == E_DEVICE_NOT_AVAILABLE) { rootPage.NotifyUser("Bluetooth radio is not on.", NotifyType.ErrorMessage); } if (bluetoothLeDevice != null) { // Note: BluetoothLEDevice.GattServices property will return an empty list for unpaired devices. For all uses we recommend using the GetGattServicesAsync method. // BT_Code: GetGattServicesAsync returns a list of all the supported services of the device (even if it's not paired to the system). // If the services supported by the device are expected to change during BT usage, subscribe to the GattServicesChanged event. GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesAsync(BluetoothCacheMode.Uncached); if (result.Status == GattCommunicationStatus.Success) { var services = result.Services; rootPage.NotifyUser(String.Format("Found {0} services", services.Count), NotifyType.StatusMessage); foreach (var service in services) { ServiceList.Items.Add(new ComboBoxItem { Content = DisplayHelpers.GetServiceName(service), Tag = service }); } ConnectButton.Visibility = Visibility.Collapsed; ServiceList.Visibility = Visibility.Visible; } else { rootPage.NotifyUser("Device unreachable", NotifyType.ErrorMessage); } } ConnectButton.IsEnabled = true; }
private async void ConnectButton_Click() { ConnectButton.IsEnabled = false; if (!await ClearBluetoothLEDeviceAsync()) { rootPage.NotifyUser("Error: Unable to reset state, try again.", NotifyType.ErrorMessage); ConnectButton.IsEnabled = true; return; } try { // BT_Code: BluetoothLEDevice.FromIdAsync must be called from a UI thread because it may prompt for consent. //bluetoothLeDevice = await BluetoothLEDevice.FromIdAsync(rootPage.SelectedBleDeviceId); "BluetoothLE#BluetoothLE74:40:bb:fe:e8:16-c1:81:6b:98:16:1f" bluetoothLeDevice = await BluetoothLEDevice.FromIdAsync("BluetoothLE#BluetoothLE74:40:bb:fe:e8:16-c1:81:6b:98:16:1f"); if (bluetoothLeDevice == null) { rootPage.NotifyUser("Failed to connect to device.", NotifyType.ErrorMessage); } } catch (Exception ex) when(ex.HResult == E_DEVICE_NOT_AVAILABLE) { rootPage.NotifyUser("Bluetooth radio is not on.", NotifyType.ErrorMessage); } if (bluetoothLeDevice != null) { // Note: BluetoothLEDevice.GattServices property will return an empty list for unpaired devices. For all uses we recommend using the GetGattServicesAsync method. // BT_Code: GetGattServicesAsync returns a list of all the supported services of the device (even if it's not paired to the system). // If the services supported by the device are expected to change during BT usage, subscribe to the GattServicesChanged event. GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesAsync(BluetoothCacheMode.Uncached); if (result.Status == GattCommunicationStatus.Success) { var services = result.Services; rootPage.NotifyUser("Successfully connected", NotifyType.StatusMessage); foreach (var service in services) { ServiceList.Items.Add(new ComboBoxItem { Content = DisplayHelpers.GetServiceName(service), Tag = service }); var zzz = service.Uuid; if (service.Uuid == Constants.RightFootSensorServiceUuid) { rightFootService = service; break; } } ConnectButton.Visibility = Visibility.Collapsed; ServiceList.Visibility = Visibility.Collapsed; // From characteristics listing: IReadOnlyList <GattCharacteristic> characteristics = null; var accessStatus = await rightFootService.RequestAccessAsync(); if (accessStatus == DeviceAccessStatus.Allowed) { // BT_Code: Get all the child characteristics of a service. Use the cache mode to specify uncached characterstics only // and the new Async functions to get the characteristics of unpaired devices as well. var result2 = await rightFootService.GetCharacteristicsAsync(BluetoothCacheMode.Uncached); if (result2.Status == GattCommunicationStatus.Success) { characteristics = result2.Characteristics; foreach (GattCharacteristic c in characteristics) { CharacteristicList.Items.Add(new ComboBoxItem { Content = DisplayHelpers.GetCharacteristicName(c), Tag = c }); if (c.Uuid == Constants.RightFootSensorCharacteristicUuid) { rightFootCharacteristic = c; break; } } ValueChangedSubscribeToggle.IsEnabled = true; ValueChangedSubscribeToggle.Visibility = Visibility.Visible; ValueChangedSubscribeToggle.Content = "Start"; selectedCharacteristic = rightFootCharacteristic; SelectedDeviceRun.Text = "Connected"; } else { rootPage.NotifyUser("Error accessing service.", NotifyType.ErrorMessage); } } } else { rootPage.NotifyUser("Device unreachable", NotifyType.ErrorMessage); } } ConnectButton.IsEnabled = true; }