BluetoothGATTGetCharacteristicValue function (bluetoothleapis.h)
The BluetoothGATTGetCharacteristicValue function gets the value of the specified characteristic.
Syntax
HRESULT BluetoothGATTGetCharacteristicValue(
[in] HANDLE hDevice,
[in] PBTH_LE_GATT_CHARACTERISTIC Characteristic,
[in] ULONG CharacteristicValueDataSize,
[out, optional] PBTH_LE_GATT_CHARACTERISTIC_VALUE CharacteristicValue,
[out, optional] USHORT *CharacteristicValueSizeRequired,
[in] ULONG Flags
);
Parameters
[in] hDevice
Handle to the service.
[in] Characteristic
Pointer to the parent characteristic of the characteristic value to be retrieved.
[in] CharacteristicValueDataSize
The number of bytes allocated for the CharacteristicValue parameter.
[out, optional] CharacteristicValue
Pointer to buffer into which to return the characteristic value.
[out, optional] CharacteristicValueSizeRequired
Pointer to buffer into which to store the number of bytes needed to return data in the buffer pointed to by CharacteristicValue.
[in] Flags
Flags to modify the behavior of BluetoothGATTGetCharacteristicValue:
Flag | Description |
---|---|
BLUETOOTH_GATT_FLAG_NONE | The client does not have specific GATT requirements (default). |
BLUETOOTH_GATT_FLAG_CONNECTION_ENCRYPTED | The client requests the data to be transmitted over an encrypted channel. |
BLUETOOTH_GATT_FLAG_CONNECTION_AUTHENTICATED | The client requests the data to be transmitted over an authenticated channel. |
BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE | The characteristic value is to be read directly from the device. This overwrites the one in the cache if one is already present. |
BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE | The characteristic value is to be read from the cache (regardless of whether it is present in the cache or not). |
Return value
The BluetoothGATTGetCharacteristicValue function returns the following values:
Return code | Description |
---|---|
|
The operation completed successfully. |
|
The buffer parameter is NULL and the number of items available is being returned instead. |
|
Returned if both a parent service and a service handle are provided and the service hierarchy does not roll up to the provided parent service handle. |
|
Both CharacteristicValue and CharacteristicValueSizeRequired are 0. |
|
A buffer is specified, but the buffer count size is smaller than what is required, in bytes. |
|
The current data in the cache appears to be inconsistent, and is leading to internal errors. |
|
The target server did not provide an appropriate network response. |
|
The request timed-out. |
|
The characteristic value is not readable as dictated by the characteristic properties. |
|
The operation ran out of memory. |
|
The attribute handle given was not valid on this server. |
|
The attribute cannot be read. |
|
The attribute cannot be written. |
|
The attribute PDU was invalid. |
|
The attribute requires authentication before it can be read or written. |
|
Attribute server does not support the request received from the client. |
|
Offset specified was past the end of the attribute. |
|
The attribute requires authorization before it can be read or written. |
|
Too many prepare writes have been queued. |
|
No attribute found within the given attribute handle range. |
|
The attribute cannot be read or written using the Read Blob Request. |
|
The Encryption Key Size used for encrypting this link is insufficient. |
|
The attribute value length is invalid for the operation. |
|
The attribute request that was requested has encountered an error that was unlikely, and therefore could not be completed as requested. |
|
The attribute requires encryption before it can be read or written. |
|
The attribute type is not a supported grouping attribute as defined by a higher layer specification. |
|
Insufficient Resources to complete the request. |
|
An error that lies in the reserved range has been received. |
Remarks
The characteristic value is returned from the cache if one is already present. This would be the case most of the time, as all the device attributes are cached at the time of pairing or association. However, if it is not present, the characteristic value is read directly from the device, and will be cached upon successfully reading it from the device. If BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE or BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE is present, the characteristic value is read using the specified method.
Returned characteristics are cached upon successful retrieval of characteristics from the device directly. Unless a service-change event is received, the list of returned characteristics is not expected to change.
Profile drivers should pre-allocate a sufficiently large buffer for the array of characteristics to be returned in. Callers can determine the necessary buffer size by passing a non-NULL value in CharacteristicValueSizeRequired and NULL in CharacteristicValue.
The parent service must be present in the cache, otherwise the function will fail. The parent service must be a service returned by either BluetoothGATTGetServices or BluetoothGATTGetIncludedServices.
Example
if (currGattChar->IsReadable) {
////////////////////////////////////////////////////////////////////////////
// Determine Characteristic Value Buffer Size
////////////////////////////////////////////////////////////////////////////
hr = BluetoothGATTGetCharacteristicValue(
hCurrService,
currGattChar,
0,
NULL,
&charValueDataSize,
BLUETOOTH_GATT_FLAG_NONE);
if (HRESULT_FROM_WIN32(ERROR_MORE_DATA) != hr) {
PrintHr("BluetoothGATTGetCharacteristicValue - Buffer Size", hr);
goto GetDescriptors; // Proceed to retrieving descriptors
}
pCharValueBuffer = (PBTH_LE_GATT_CHARACTERISTIC_VALUE)malloc(charValueDataSize);
if (NULL == pCharValueBuffer) {
printf("pCharValueBuffer out of memory\r\n");
goto Done;
} else {
RtlZeroMemory(pCharValueBuffer, charValueDataSize);
}
////////////////////////////////////////////////////////////////////////////
// Retrieve the Characteristic Value
////////////////////////////////////////////////////////////////////////////
hr = BluetoothGATTGetCharacteristicValue(
hCurrService,
currGattChar,
(ULONG)charValueDataSize,
pCharValueBuffer,
NULL,
BLUETOOTH_GATT_FLAG_NONE);
if (S_OK != hr) {
PrintHr("BluetoothGATTGetCharacteristicValue - Actual Data", hr);
goto GetDescriptors; // Proceed to retrieving descriptors
}
PrintCharacteristicValue(pCharValueBuffer, 2, currGattChar->CharacteristicUuid);
// Free before going to next iteration, or memory leak.
free(pCharValueBuffer);
pCharValueBuffer = NULL;
}
Requirements
Requirement | Value |
---|---|
Minimum supported client | Supported in Windows 8 and later versions of Windows. |
Target Platform | Universal |
Header | bluetoothleapis.h |
Library | BluetoothAPIs.lib |
DLL | BluetoothAPIs.dll |