Why is BluetoothLEDevice.GattServices Empty

Viewed 5649

I am trying to communicate with a peripheral device without pairing it to Windows and I am using BluetoothLEAdvertisementWatcher to scan for devices in range. This is my WatcherOnReceived method:

 async private void WatcherOnReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
    {
        BluetoothLEDevice device = null;
        BluetoothDevice basicDevice = null;
        GattDeviceService services = null;

        if (args.Advertisement.LocalName != "Nexus 6")
            return;

        _watcher.Stop();

        device = await BluetoothLEDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
        device.GattServicesChanged += Device_GattServicesChanged;
        //basicDevice = await BluetoothDevice.FromBluetoothAddressAsync(args.BluetoothAddress);
        //services = await GattDeviceService.FromIdAsync(device.DeviceId);

        lock (m_syncObj)
        {
            Debug.WriteLine("");
            Debug.WriteLine("----------- DEVICE --------------");

            Debug.WriteLine(args.ToString());

            Debug.WriteLine(args.Advertisement.DataSections.Count);

            foreach (var item in args.Advertisement.DataSections)
            {
                var data = new byte[item.Data.Length];
                using (var reader = DataReader.FromBuffer(item.Data))
                {
                    reader.ReadBytes(data);
                }

                Debug.WriteLine("Manufacturer data: " + BitConverter.ToString(data));

                //Debug.WriteLine("Data : " + item.Data.ToString());
                //Debug.WriteLine("Data capacity: " + item.Data.Capacity);
                Debug.WriteLine("Data Type: " + item.DataType);
            }

            foreach (var md in args.Advertisement.ManufacturerData)
            {
                var data = new byte[md.Data.Length];
                using (var reader = DataReader.FromBuffer(md.Data))
                {
                    reader.ReadBytes(data);
                }
                Debug.WriteLine("Manufacturer data: " + BitConverter.ToString(data));
            }

            foreach (Guid id in args.Advertisement.ServiceUuids)
            {
                Debug.WriteLine("UUIDs: " + id.ToString() + " Count: " + args.Advertisement.ServiceUuids.Count);
                //services = device.GetGattService(id);
            }

            Debug.WriteLine("Receive event...");
            Debug.WriteLine("BluetoothAddress: " + args.BluetoothAddress.ToString("X"));
            Debug.WriteLine("Advertisement.LocalName: " + args.Advertisement.LocalName);
            Debug.WriteLine("AdvertisementType: " + args.AdvertisementType);
            Debug.WriteLine("RawSignalStrengthInDBm: " + args.RawSignalStrengthInDBm);

            if (device != null)
            {
                Debug.WriteLine("Bluetooth Device: " + device.Name);
                Debug.WriteLine("Bluetooth Device conn status: " + device.ConnectionStatus);
                Debug.WriteLine("Bluetooth DeviceId: " + device.DeviceId);
                Debug.WriteLine("Bluetooth GettServices Count: " + device.GattServices.Count);
            }
        }   
    }

When a device is received I successfully create the BluetoothLEDevice from the args.BlutoothAddress but the device.GattServices are always empty and thus I can not use them to communicate with the device. Is the problem in the device or in the Windows API and what else can I try?

1 Answers
Related