コード例 #1
0
ファイル: MainPage.xaml.cs プロジェクト: puresoul/BluetoothLE
        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;
        }