private async void Connect() { int i = 0; if (!await ClearBluetoothLEDeviceAsync()) { this.NotifyUser("Error: Unable to reset state, try again.", NotifyType.ErrorMessage); return; } while (bluetoothLeDevice == null || bluetoothLeDevice != null) { try { bluetoothLeDevice = await BluetoothLEDevice.FromIdAsync(this.SelectedBleDeviceId); if (bluetoothLeDevice == null) { continue; } } catch (Exception ex) when(ex.HResult == E_DEVICE_NOT_AVAILABLE) { this.NotifyUser("Bluetooth radio is not on.", NotifyType.ErrorMessage); } if (bluetoothLeDevice != null) { GattDeviceServicesResult resultx = await bluetoothLeDevice.GetGattServicesAsync(BluetoothCacheMode.Uncached); if (resultx.Status == GattCommunicationStatus.Success) { var services = resultx.Services; foreach (var service in services) { //System.Diagnostics.Debug.WriteLine("service: " + service.Uuid.ToString()); if (service.Uuid.ToString() == "0000fff0-0000-1000-8000-00805f9b34fb") { selectedService = service; } } break; } else { this.NotifyUser($"Device unreachable, let's try it for {i} time, again...", NotifyType.ErrorMessage); } if (i < 3) { await Task.Delay(1000); i++; } else { this.NotifyUser("Ok, I give up. Maybe next time...", NotifyType.ErrorMessage); return; } } } var attributeInfoDisp = selectedService; CharacteristicCollection.Clear(); IReadOnlyList <GattCharacteristic> characteristics = null; try { var accessStatus = await attributeInfoDisp.RequestAccessAsync(); if (accessStatus == DeviceAccessStatus.Allowed) { var resulty = await attributeInfoDisp.GetCharacteristicsAsync(BluetoothCacheMode.Uncached); if (resulty.Status == GattCommunicationStatus.Success) { characteristics = resulty.Characteristics; } } else { this.NotifyUser("Error accessing service.", NotifyType.ErrorMessage); characteristics = new List <GattCharacteristic>(); } } catch (Exception ex) { this.NotifyUser("Restricted service. Can't read characteristics: " + ex.Message, NotifyType.ErrorMessage); characteristics = new List <GattCharacteristic>(); } foreach (GattCharacteristic c in characteristics) { if (c.Uuid.ToString() == "0000fff1-0000-1000-8000-00805f9b34fb") { selectedCharacteristic = c; } if (c.Uuid.ToString() == "0000fff2-0000-1000-8000-00805f9b34fb") { writeCharacteristic = c; } //System.Diagnostics.Debug.WriteLine("characteristic: " + c.Uuid.ToString()); } var result = await selectedCharacteristic.GetDescriptorsAsync(BluetoothCacheMode.Uncached); if (result.Status != GattCommunicationStatus.Success) { this.NotifyUser("Descriptor read failure: " + result.Status.ToString(), NotifyType.ErrorMessage); } presentationFormat = null; if (selectedCharacteristic.PresentationFormats.Count > 0) { if (selectedCharacteristic.PresentationFormats.Count.Equals(1)) { presentationFormat = selectedCharacteristic.PresentationFormats[0]; this.NotifyUser(presentationFormat.ToString(), NotifyType.StatusMessage); } } ValueChangedSubscribeToggle(); AddValueChangedHandler(); HoldButton.IsEnabled = true; TareButton.IsEnabled = true; UnitsButton.IsEnabled = true; loaded = 1; return; }