Función BluetoothGATTGetDescriptorValue (bluetoothleapis.h)
La función BluetoothGATTGetDescriptorValue obtiene el valor del descriptor especificado.
Sintaxis
HRESULT BluetoothGATTGetDescriptorValue(
[in] HANDLE hDevice,
[in] PBTH_LE_GATT_DESCRIPTOR Descriptor,
[in] ULONG DescriptorValueDataSize,
[out, optional] PBTH_LE_GATT_DESCRIPTOR_VALUE DescriptorValue,
[out, optional] USHORT *DescriptorValueSizeRequired,
[in] ULONG Flags
);
Parámetros
[in] hDevice
Identificador del servicio.
[in] Descriptor
Puntero a BTH_LE_GATT_DESCRIPTOR estructura que contiene el descriptor primario del valor del descriptor que se va a recuperar.
[in] DescriptorValueDataSize
Número de bytes asignados para el parámetro DescriptorValue .
[out, optional] DescriptorValue
Puntero a BTH_LE_GATT_DESCRIPTOR_VALUE estructura en la que se va a devolver el valor del descriptor.
[out, optional] DescriptorValueSizeRequired
Puntero al búfer en el que se almacenará el número de bytes adicionales necesarios para devolver datos en el búfer al que apunta DescriptorValue.
[in] Flags
Marcas para modificar el comportamiento de BluetoothGATTGetDescriptorValue:
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 del descriptor se va a 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 del descriptor es leer desde la memoria caché (independientemente de si está presente en la memoria caché o no). |
Valor devuelto
La función BluetoothGATTGetDescriptorValue 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. |
|
DescriptorValue y DescriptorValueSizeRequired son 0. |
|
Se especifica un búfer, pero el tamaño del recuento de búferes es menor que el necesario, en bytes. |
|
Se especificó un valor descriptor para recuperarse de la memoria caché, pero el valor del descriptor no está presente en la memoria caché. |
|
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. |
|
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 para 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 blob de lectura. |
|
El tamaño de clave de cifrado que se usa 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. |
|
Error que se encuentra en el intervalo reservado. |
Comentarios
El valor del descriptor se devuelve de la memoria caché si ya existe uno. Este sería el caso la mayor parte del tiempo, ya que todos los atributos del dispositivo se almacenan en caché en el momento del emparejamiento o la asociación. Sin embargo, si no está presente, el valor del descriptor se lee directamente desde el dispositivo y se almacenará en caché después de 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 del descriptor se lee mediante el método especificado.
Los valores de descriptor devueltos se almacenan en caché tras la recuperación correcta de los valores de descriptor desde el dispositivo directamente. A menos que se reciba un evento de cambio de servicio, no se espera que cambien los valores del descriptor.
Los controladores de perfil deben asignar previamente un búfer suficientemente grande para la matriz de valores de descriptor en los que se va a devolver. Los autores de llamadas pueden determinar el tamaño de búfer necesario pasando un valor distinto de NULL en DescriptorValueSizeRequired y NULL en DescriptorValue.
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
////////////////////////////////////////////////////////////////////////////
// Determine Descriptor Value Buffer Size
////////////////////////////////////////////////////////////////////////////
hr = BluetoothGATTGetDescriptorValue(
hCurrService,
currGattDescriptor,
0,
NULL,
&descValueDataSize,
BLUETOOTH_GATT_FLAG_NONE);
if (HRESULT_FROM_WIN32(ERROR_MORE_DATA) != hr) {
PrintHr("BluetoothGATTGetDescriptorValue - Buffer Size", hr);
goto Done; // allow continuation
}
pDescValueBuffer = (PBTH_LE_GATT_DESCRIPTOR_VALUE)malloc(descValueDataSize);
if (NULL == pDescValueBuffer) {
printf("pDescValueBuffer out of memory\r\n");
goto Done;
} else {
RtlZeroMemory(pDescValueBuffer, descValueDataSize);
}
////////////////////////////////////////////////////////////////////////////
// Retrieve the Descriptor Value
////////////////////////////////////////////////////////////////////////////
hr = BluetoothGATTGetDescriptorValue(
hCurrService,
currGattDescriptor,
(ULONG)descValueDataSize,
pDescValueBuffer,
NULL,
BLUETOOTH_GATT_FLAG_NONE);
if (S_OK != hr) {
PrintHr("BluetoothGATTGetDescriptorValue - Actual Data", hr);
goto Done; // allow continuation
}
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 |