Linked Questions

Popular Questions

I am trying to add BLE functionality into a classic (WinForms?) C# desktop application, and have added references (Windows.winmd and System.Runtime.WindowsRuntime) to allow me to access the new BLE API recently introduced by Microsoft for Windows 10 UWP applications. I need to create a classic desktop application, as I need to use an older driver device wrapper (teVirtualMIDI) and want to create a .exe, not an app package.

I am referencing the aformentioned libraries from the following locations...

C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Facade\Windows.WinMD

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.Runtime.WindowsRuntime.dll

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.Runtime.WindowsRuntime.UI.Xaml.dll

At this point, I simply want to be able to view connected services and characteristics in the debug output window, as is done in this blog post...

https://blogs.msdn.microsoft.com/cdndevs/2017/04/28/uwp-working-with-bluetooth-devices-part-1/

It seems that I am getting errors because the BLE API needs to perform async operations, but I am honestly at a loss. The code I have written so far is included below. Essentially, I am receiving errors when trying to call the "GetGattServicesAsync()" method, as Visual Studio says that class "BluetoothLEDevice" does not contain such a definition. That method is included in the online documentation though, and I am wondering why I am not able to access it.

I hope I have given sufficient information, and any help in solving this problem will be more than appreciated. Thank you all for all the helpful advice you give!

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using Windows.Devices.Bluetooth;
using Windows.Devices.Midi;
using Windows.Devices.Bluetooth.Advertisement;
using Windows.Devices.Bluetooth.GenericAttributeProfile;
using Windows.Devices.Enumeration;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.Storage.Streams;
using Windows.UI.Core;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace BDBMidiClient
{
    public class BLEHandlingDiscovery : Page
    {
    //private ObservableCollection<BluetoothLEAttributeDisplay> ServiceCollection = new ObservableCollection<BluetoothLEAttributeDisplay>();
    //private ObservableCollection<BluetoothLEAttributeDisplay> CharacteristicCollection = new ObservableCollection<BluetoothLEAttributeDisplay>();
    public ObservableCollection<BluetoothLEDeviceDisplay> KnownDevices = new ObservableCollection<BluetoothLEDeviceDisplay>();
    //private List<DeviceInformation> UnknownDevices = new List<DeviceInformation>();
    //private DeviceWatcher deviceWatcher;
    //private BluetoothLEDevice bluetoothLeDevice = null;
    //private GattCharacteristic selectedCharacteristic;

    private void StartBLEDeviceWatcher()
    {
        string[] requestedProperties = { "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected" };

        DeviceWatcher deviceWatcher =
                    DeviceInformation.CreateWatcher(
                            BluetoothLEDevice.GetDeviceSelectorFromPairingState(false),
                            requestedProperties,
                            DeviceInformationKind.AssociationEndpoint);
        /*
        DeviceWatcher deviceWatcher =
        DeviceInformation.CreateWatcher(
                "System.ItemNameDisplay:~~\"BDB\"",
                requestedProperties,
                DeviceInformationKind.AssociationEndpoint);*/


        deviceWatcher.Added += DeviceWatcher_Added;
        deviceWatcher.Updated += DeviceWatcher_Updated;
        deviceWatcher.Removed += DeviceWatcher_Removed;

        deviceWatcher.Start();

        //Debug.WriteLine(requestedProperties);
    }


    private async void DeviceWatcher_Added(DeviceWatcher sender, DeviceInformation deviceInfo)
    {
        Guid gattService = new Guid();

        var device = await BluetoothLEDevice.FromIdAsync(deviceInfo.Id);
        var services=await device.GetGattServicesAsync();
        foreach (var service in services.Services)
        {
            Debug.WriteLine($"Service: {service.Uuid}");
            var characteristics = await service.GetCharacteristicsAsync();
            foreach (var character in characteristics.Characteristics)
            {
                Debug.WriteLine($"Characteristic: {character.Uuid}");
            }
        }
    }


    private void DeviceWatcher_Updated(DeviceWatcher sender, DeviceInformationUpdate deviceInfoUpdate)
    {

    }


    private void DeviceWatcher_Removed(DeviceWatcher sender, DeviceInformationUpdate deviceInfoUpdate)
    {

    }

    async void ConnectToBLEDevice(DeviceInformation deviceInformation)
    {
        BluetoothLEDevice bluetoothLeDevice = await BluetoothLEDevice.FromIdAsync("BDB");
    }


    private BluetoothLEDeviceDisplay FindBluetoothLEDeviceDisplay(string id)
    {
        foreach (BluetoothLEDeviceDisplay bleDeviceDisplay in KnownDevices)
        {
            if (bleDeviceDisplay.Id == id)
            {
                return bleDeviceDisplay;
            }
        }
        return null;
    }
}

Related Questions