Using: Windows 10, C# .NET 2015 Community, UWP
Im trying to build a windows-universal-app that pairs my PC with a BLE device.
Whats already working is enumerating nearby devices, pair with a selected one and getting information like battery-level and firmware-revision.
The problem now is that when I try to get a custom service, my task ends because of an "System.Exception" at .GetGattService
System.Exception.Message: "Element not found. (Exception from HRESULT: 0x80070490)"
System.Exception.Stack : "at Windows.Devices.Bluetooth.BluetoothLEDevice.GetGattService(Guid serviceUuid)\r\n at SettingsCs.Settings.d__23.MoveNext()"
This is the code that's not working:
private async Task<SettingsReturn> writeSettingTransition(BluetoothLEDevice device, byte[] byteSettings)
    {
        //Check if device is available
        if (device != null)
        {
            Guid SERVICE_CUSTOM = new Guid("7e0bc6be-8271-4f5a-a126-c24220e6250c");
            GattDeviceService service = device.GetGattService(SERVICE_CUSTOM);
            //Check if service is available
            if (service == null)
            {
                return SettingsReturn.INIT_ERROR;
            }
            GattCharacteristic characteristic = service.GetCharacteristics(BLETestApp.CHAR_SETTINGS)[0];
            //Check if characteristic is available
            if (characteristic == null)
            {
                return SettingsReturn.INIT_ERROR;
            }
            var writer = new DataWriter();
            writer.WriteBytes(byteSettings);
            var buffer = writer.DetachBuffer();
            await characteristic.WriteValueAsync(buffer);//********
            bool success = characteristic.CharacteristicProperties.HasFlag(GattCharacteristicProperties.Write);
            if (success == true)
            {
                // Take care of the 8 bit byte for the counter (max = 255 (unsigned))
                if (TRANSACTION_ID > 250)
                {
                    TRANSACTION_ID = 0;
                }
                else
                {
                    // Count TANSACTION_ID one up
                    TRANSACTION_ID++;
                }
                return SettingsReturn.OK;
            }
            else
            {
                return SettingsReturn.WRITE_ERROR;
            }
        }
        else
        {
            return SettingsReturn.INIT_ERROR;
        }            
    }
I hope somenone can help me or tell me what I'm doing wrong.
I can't pinpoint the error you get, use the debugger to check if your characteristic has write permission.
I have changed your code in a way I write to my device successfully. Also added a try catch block. Here it is:
 private async Task<SettingsReturn> writeSettingTransition(BluetoothLEDevice device, byte[] byteSettings)
        {
            bool success = false;
            //Check if device is available
            if (device != null)
            {
                Guid SERVICE_CUSTOM = new Guid("7e0bc6be-8271-4f5a-a126-c24220e6250c");
                GattDeviceService service = device.GetGattService(SERVICE_CUSTOM);
                //Check if service is available
                if (service == null)
                {
                    return SettingsReturn.INIT_ERROR;
                }
                GattCharacteristic characteristic = service.GetCharacteristics(BLETestApp.CHAR_SETTINGS)[0];
                //Check if characteristic is available
                if (characteristic == null)
                {
                    return SettingsReturn.INIT_ERROR;
                }
                IBuffer writeBuffer = byteSettings.AsBuffer();// using Windows.Storage.Streams
                try
                {
                    // BT_Code: Writes the value from the buffer to the characteristic.
                    var result = await characteristic.WriteValueAsync(writeBuffer);
                    if (result == GattCommunicationStatus.Success)
                    {
                        // NotifyUser("Successfully wrote value to device" );
                        success = true;
                    }
                    else
                    {
                        // NotifyUser($"Write failed: {result}");
                        success = false;
                    }
                }
                catch (Exception ex) when ((uint)ex.HResult == 0x80650003 || (uint)ex.HResult == 0x80070005)
                {
                    // E_BLUETOOTH_ATT_WRITE_NOT_PERMITTED or E_ACCESSDENIED
                    // This usually happens when a device reports that it support writing, but it actually doesn't.
                    // NotifyUser(ex.Message, NotifyType.ErrorMessage);
                }
                if (success)
                {
                    // Take care of the 8 bit byte for the counter (max = 255 (unsigned))
                    if (TRANSACTION_ID > 250)
                    {
                        TRANSACTION_ID = 0;
                    }
                    else
                    {
                        // Count TANSACTION_ID one up
                        TRANSACTION_ID++;
                    }
                    return SettingsReturn.OK;
                }
                else
                {
                    return SettingsReturn.WRITE_ERROR;
                }
            }
            else
            {
                return SettingsReturn.INIT_ERROR;
            }
        }
There can be typos and other mishaps, hope it helps.
User contributions licensed under CC BY-SA 3.0