Función BluetoothGATTGetCharacteristicValue (bluetoothleapis.h)
La función BluetoothGATTGetCharacteristicValue obtiene el valor de la característica especificada.
Sintaxis
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
);
Parámetros
[in] hDevice
Identificador del servicio.
[in] Characteristic
Puntero a la característica primaria del valor de característica que se va a recuperar.
[in] CharacteristicValueDataSize
Número de bytes asignados para el parámetro CharacteristicValue .
[out, optional] CharacteristicValue
Puntero al búfer en el que se va a devolver el valor de característica.
[out, optional] CharacteristicValueSizeRequired
Puntero al búfer en el que almacenar el número de bytes necesarios para devolver datos en el búfer al que apunta CharacteristicValue.
[in] Flags
Marcas para modificar el comportamiento de BluetoothGATTGetCharacteristicValue:
Marca | Descripción |
---|---|
BLUETOOTH_GATT_FLAG_NONE | El cliente no tiene requisitos GATT específicos (valor predeterminado). |
BLUETOOTH_GATT_FLAG_CONNECTION_ENCRYPTED | El cliente solicita que los datos se transmitan a través de un canal cifrado. |
BLUETOOTH_GATT_FLAG_CONNECTION_AUTHENTICATED | El cliente solicita que los datos se transmitan a través de un canal autenticado. |
BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE | El valor de característica es leer directamente desde el dispositivo. Esto sobrescribe el que se encuentra en la memoria caché si ya está presente. |
BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE | El valor de característica debe leerse desde la memoria caché (independientemente de si está presente en la memoria caché o no). |
Valor devuelto
La función BluetoothGATTGetCharacteristicValue devuelve los siguientes valores:
Código devuelto | Descripción |
---|---|
|
La operación se ha completado correctamente. |
|
El parámetro de búfer es NULL y el número de elementos disponibles se devuelve en su lugar. |
|
Se devuelve si se proporciona un servicio primario y un identificador de servicio y la jerarquía de servicios no se acumula en el identificador de servicio primario proporcionado. |
|
CharacteristicValue y CharacteristicValueSizeRequired son 0. |
|
Se especifica un búfer, pero el tamaño del recuento de búferes es menor que el necesario, en bytes. |
|
Los datos actuales de la memoria caché parecen ser incoherentes y conducen a errores internos. |
|
El servidor de destino no proporcionó una respuesta de red adecuada. |
|
Se agota el tiempo de espera de la solicitud. |
|
El valor de característica no se puede leer según lo dictado por las propiedades de características. |
|
La operación se quedó sin memoria. |
|
El identificador de atributo especificado no era válido en este servidor. |
|
El atributo no se puede leer. |
|
El atributo no se puede escribir. |
|
El atributo PDU no era válido. |
|
El atributo requiere autenticación antes de que se pueda leer o escribir. |
|
El servidor de atributos no admite la solicitud recibida del cliente. |
|
Offset especificado fue pasado el final del atributo. |
|
El atributo requiere autorización antes de que se pueda leer o escribir. |
|
Se han puesto en cola demasiadas escrituras de preparación. |
|
No se encontró ningún atributo dentro del intervalo de identificadores de atributo especificado. |
|
El atributo no se puede leer ni escribir mediante la solicitud de lectura de blobs. |
|
El tamaño de la clave de cifrado usado para cifrar este vínculo no es suficiente. |
|
La longitud del valor del atributo no es válida para la operación. |
|
La solicitud de atributo solicitada ha encontrado un error poco probable y, por lo tanto, no se pudo completar como se solicitó. |
|
El atributo requiere cifrado antes de que se pueda leer o escribir. |
|
El tipo de atributo no es un atributo de agrupación admitido según lo definido por una especificación de capa superior. |
|
Recursos insuficientes para completar la solicitud. |
|
Se ha recibido un error que se encuentra en el intervalo reservado. |
Comentarios
El valor de característica se devuelve de la memoria caché si ya hay uno presente. Este sería el caso la mayor parte del tiempo, ya que todos los atributos de dispositivo se almacenan en caché en el momento del emparejamiento o asociación. Sin embargo, si no está presente, el valor de característica se lee directamente desde el dispositivo y se almacenará en caché al leerlo correctamente desde el dispositivo. Si BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_CACHE o BLUETOOTH_GATT_FLAG_FORCE_READ_FROM_DEVICE está presente, el valor de característica se lee mediante el método especificado.
Las características devueltas se almacenan en caché tras la recuperación correcta de características del dispositivo directamente. A menos que se reciba un evento de cambio de servicio, no se espera que cambie la lista de características devueltas.
Los controladores de perfil deben asignar previamente un búfer suficientemente grande para que se devuelva la matriz de características. Los autores de llamadas pueden determinar el tamaño de búfer necesario pasando un valor distinto de NULL en CharacteristicValueSizeRequired y NULL en CharacteristicValue.
El servicio primario debe estar presente en la memoria caché; de lo contrario, se producirá un error en la función. El servicio primario debe ser un servicio devuelto por BluetoothGATTGetServices o BluetoothGATTGetIncludedServices.
Ejemplo
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;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Compatible con Windows 8 y versiones posteriores de Windows. |
Plataforma de destino | Universal |
Encabezado | bluetoothleapis.h |
Library | BluetoothAPIs.lib |
Archivo DLL | BluetoothAPIs.dll |