In my device configuration, gatt.xml, I added a custom GATT characteristic with a custom UUID and enabled the read and write properties. Using windows Bluetooth API after pairing, when I try to read from the GATT characteristic, it's working fine, but writing to the GATT characteristic is not working. I am getting access denied with an exception all the time. Below I added sample gatt.xml, bgs, and C# code. I am using Bluegiga v1.3.1_API. The current setup works fine with the USB dongle, but I am trying to replace it with the Windows Bluetooth API.
gatt.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<service uuid="180A">
<description>Device Information</description>
<characteristic uuid="2a29">
<properties read="true" const="true" />
<value>company name</value>
<description>Manufacturer Name String</description>
</characteristic>
<characteristic uuid="2a24">
<properties read="true" const="true" />
<value>device name</value>
<description>Model Number String</description>
</characteristic>
<characteristic uuid="2a27">
<properties read="true" const="true"/>
<value>2.0</value>
<description>Hardware Revision String</description>
</characteristic>
<characteristic uuid="95551f84-7562-4c30-9455-be0750914ac2" id="xgatt_Params">
<properties read="true" write="true"/>
<value type="user" length="5"/>
<description>Params</description>
</characteristic>
</service>
</configuration>
attributes_value event from bgs script
event attributes_value(connection, reason, handle, offset, value_len, value_data)
if handle = xgatt_Params then
if value_len = 2 then
if value_data(0:2) = $0115 then
memcpy(addrPaired(0), addrConnected(0),6)
updatePairing=1
call attributes_user_write_response(connection, 0)
else
call attributes_user_write_response(connection, $80)
end if
else
if value_len >= numParams then
memcpy(params(0), value_data(0), numParams)
call updateParams()
call attributes_user_write_response(connection, 0)
else
call attributes_user_write_response(connection, $80)
end if
end if
end if
end
C# code
if (properties.HasFlag(GattCharacteristicProperties.Write))
{
try
{
var writer = new DataWriter();
writer.WriteByte(01);
writer.WriteByte(15);
var result = await characteristic.WriteValueAsync(writer.DetachBuffer(),
GattWriteOption.WriteWithResponse);
if (result == GattCommunicationStatus.Success)
{
Console.Write("\n Success");
}
else if (result == GattCommunicationStatus.AccessDenied)
{
Console.Write("\n Access Denied");
}
else if (result == GattCommunicationStatus.Unreachable)
{
Console.Write("\n Unreachable");
}
else if (result == GattCommunicationStatus.ProtocolError)
{
Console.Write("\n ProtocolError");
}
}
catch (Exception ex) when ((uint)ex.HResult == 0x80650003 || (uint)ex.HResult ==
0x80070005)
{
Console.Write("\n " + ex.Message);
}
}