Функция BluetoothGATTGetCharacteristicValue (bluetoothleapis.h)
Функция BluetoothGATTGetCharacteristicValue получает значение указанной характеристики.
Синтаксис
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
);
Параметры
[in] hDevice
Дескриптор для службы.
[in] Characteristic
Указатель на родительскую характеристику извлекаемого значения характеристики.
[in] CharacteristicValueDataSize
Количество байтов, выделенных для параметра CharacteristicValue .
[out, optional] CharacteristicValue
Указатель на буфер, в который возвращается значение характеристики.
[out, optional] CharacteristicValueSizeRequired
Указатель на буфер, в котором хранится количество байтов, необходимых для возврата данных в буфере, на который указывает Значение характеристики.
[in] Flags
Флаги для изменения поведения BluetoothGATTGetCharacteristicValue:
Flag | Описание |
---|---|
BLUETOOTH_GATT_FLAG_NONE | У клиента нет конкретных требований GATT (по умолчанию). |
BLUETOOTH_GATT_FLAG_CONNECTION_ENCRYPTED | Клиент запрашивает передачу данных по зашифрованным каналам. |
BLUETOOTH_GATT_FLAG_CONNECTION_AUTHENTICATED | Клиент запрашивает передачу данных по каналу, прошедшему проверку подлинности. |
BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE | Значение характеристики должно считываться непосредственно с устройства. Это перезаписывает объект в кэше, если он уже присутствует. |
BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE | Значение характеристики должно считываться из кэша (независимо от того, присутствует ли оно в кэше). |
Возвращаемое значение
Функция BluetoothGATTGetCharacteristicValue возвращает следующие значения:
Код возврата | Описание |
---|---|
|
Операция выполнена успешно. |
|
Параметр buffer имеет значение NULL, и вместо этого возвращается количество доступных элементов. |
|
Возвращается, если предоставляются как родительская служба, так и дескриптор службы, а иерархия служб не выполняет свертку до предоставленного дескриптора родительской службы. |
|
Значения ПараметровЗначение и Значение ХарактеристикиЗначениеSizeRequired имеют значение 0. |
|
Указан буфер, но размер количества буферов меньше, чем требуется, в байтах. |
|
Текущие данные в кэше выглядят несогласованными и приводят к внутренним ошибкам. |
|
Целевой сервер не предоставил соответствующий ответ сети. |
|
Истекло время ожидания запроса. |
|
Значение характеристики не является удобочитаемым, как это определяется свойствами характеристики. |
|
Для операции не хватает памяти. |
|
Указанный дескриптор атрибута был недопустимым на этом сервере. |
|
Атрибут не может быть прочитан. |
|
Атрибут не может быть записан. |
|
Недопустимый атрибут PDU. |
|
Атрибут требует проверки подлинности, прежде чем его можно будет прочитать или записать. |
|
Сервер атрибутов не поддерживает запрос, полученный от клиента. |
|
Указанное смещение прошло после конца атрибута. |
|
Для чтения или записи атрибута требуется авторизация. |
|
Слишком много операций подготовки записей поставлено в очередь. |
|
Атрибут не найден в заданном диапазоне дескрипторов атрибута. |
|
Атрибут не может быть прочитан или записан с помощью запроса на чтение BLOB-объекта. |
|
Размер ключа шифрования, используемый для шифрования этой ссылки, недостаточен. |
|
Длина значения атрибута недопустима для операции. |
|
Запрошенный запрос атрибута обнаружил ошибку, которая была маловероятна и поэтому не может быть выполнена в соответствии с запросом. |
|
Атрибут требует шифрования, прежде чем его можно будет прочитать или записать. |
|
Тип атрибута не является поддерживаемым атрибутом группирования, как определено в спецификации более высокого уровня. |
|
Недостаточно ресурсов для выполнения запроса. |
|
Получено сообщение об ошибке, которая находится в зарезервированном диапазоне. |
Комментарии
Значение характеристики возвращается из кэша, если оно уже имеется. Это происходит в большинстве случаев, так как все атрибуты устройства кэшируются во время связывания или связи. Однако если его нет, значение характеристики считывается непосредственно с устройства и будет кэшировано после успешного считывания с устройства. При наличии BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE или BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE значение характеристики считывается с помощью указанного метода.
Возвращаемые характеристики кэшируются при успешном извлечении характеристик непосредственно с устройства. Если событие изменения службы не получено, список возвращаемых характеристик не изменится.
Драйверы профилей должны предварительно выделить достаточно большой буфер для возвращаемого массива характеристик. Вызывающие методы могут определить необходимый размер буфера, передавая значение, отличное от NULL , в Значение ХарактеристикиЗначениеSizeRequired и ЗНАЧЕНИЕ NULL в СвойствеЗначение.
Родительская служба должна присутствовать в кэше, в противном случае функция завершится ошибкой. Родительская служба должна быть службой, возвращаемой bluetoothGATTGetServices или BluetoothGATTGetIncludedServices.
Пример
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;
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Поддерживается в Windows 8 и более поздних версиях Windows. |
Целевая платформа | Универсальное |
Верхняя часть | bluetoothleapis.h |
Библиотека | BluetoothAPIs.lib |
DLL | BluetoothAPIs.dll |