QLowEnergyService Class
La clase QLowEnergyService representa un servicio individual en un dispositivo Bluetooth de baja energía. Más...
| Cabecera: | #include <QLowEnergyService> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Bluetooth)target_link_libraries(mytarget PRIVATE Qt6::Bluetooth) |
| qmake: | QT += bluetooth |
| Hereda: | QObject |
Tipos Públicos
(since 6.2) enum | DiscoveryMode { FullDiscovery, SkipValueDiscovery } |
| enum | ServiceError { NoError, OperationError, CharacteristicReadError, CharacteristicWriteError, DescriptorReadError, …, UnknownError } |
| enum | ServiceState { InvalidService, RemoteService, RemoteServiceDiscovering, RemoteServiceDiscovered, LocalService, …, ServiceDiscovered } |
| enum | ServiceType { PrimaryService, IncludedService } |
| flags | ServiceTypes |
| enum | WriteMode { WriteWithResponse, WriteWithoutResponse, WriteSigned } |
Funciones Públicas
| virtual | ~QLowEnergyService() |
| QLowEnergyCharacteristic | characteristic(const QBluetoothUuid &uuid) const |
| QList<QLowEnergyCharacteristic> | characteristics() const |
| bool | contains(const QLowEnergyCharacteristic &characteristic) const |
| bool | contains(const QLowEnergyDescriptor &descriptor) const |
| void | discoverDetails(QLowEnergyService::DiscoveryMode mode = FullDiscovery) |
| QLowEnergyService::ServiceError | error() const |
| QList<QBluetoothUuid> | includedServices() const |
| void | readCharacteristic(const QLowEnergyCharacteristic &characteristic) |
| void | readDescriptor(const QLowEnergyDescriptor &descriptor) |
| QString | serviceName() const |
| QBluetoothUuid | serviceUuid() const |
| QLowEnergyService::ServiceState | state() const |
| QLowEnergyService::ServiceTypes | type() const |
| void | writeCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse) |
| void | writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) |
Señales
| void | characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue) |
| void | characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) |
| void | characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue) |
| void | descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value) |
| void | descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) |
(since 6.2) void | errorOccurred(QLowEnergyService::ServiceError newError) |
| void | stateChanged(QLowEnergyService::ServiceState newState) |
Descripción detallada
QLowEnergyService proporciona acceso a los detalles de los servicios Bluetooth Low Energy. La clase facilita el descubrimiento y la publicación de los detalles del servicio, permite la lectura y escritura de los datos contenidos y notifica los cambios en los datos.
Estructura del servicio
Un dispositivo periférico Bluetooth Low Energy puede contener varios servicios. A su vez, cada servicio puede incluir otros servicios. Esta clase representa un único servicio del dispositivo periférico y se crea a través de QLowEnergyController::createServiceObject(). type () indica si este servicio es un servicio primario (de nivel superior) o si el servicio forma parte de otro servicio. Cada servicio puede contener una o más características y cada característica puede contener descriptores. La estructura resultante puede parecerse al diagrama siguiente:

Una característica es el principal soporte de información. Tiene un value() y un properties() que describen los permisos de acceso para el valor. El objetivo general del descriptor contenido es definir con más detalle la naturaleza de la característica. Por ejemplo, puede especificar cómo debe interpretarse el valor o si puede notificar al consumidor de valores sobre cambios en el valor.
Interacción con el servicio
Una vez que se ha creado un objeto de servicio por primera vez, aún no se han descubierto sus detalles. Esto se indica mediante su actual state() siendo DiscoveryRequired. Sólo es posible recuperar los serviceUuid() y serviceName().
El descubrimiento de sus servicios, características y descriptores incluidos se activa al llamar a discoverDetails(). Durante el descubrimiento, state() realiza una transición desde DiscoveryRequired a través de DiscoveringService hasta su estado final ServiceDiscovered. Esta transición se anuncia a través de la señal stateChanged(). Una vez conocidos los detalles, todas las características contenidas, descriptores y servicios incluidos son conocidos y pueden ser leídos o escritos.
Los valores de las características y los descriptores pueden recuperarse a través de QLowEnergyCharacteristic y QLowEnergyDescriptor, respectivamente. Sin embargo, la lectura o escritura directa de estos atributos requiere el objeto de servicio. La función readCharacteristic() intenta releer el valor de una característica. Aunque el descubrimiento inicial del servicio puede haber obtenido ya un valor, esta llamada puede ser necesaria en casos en los que el valor de la característica cambie constantemente sin que se proporcione ninguna notificación. Un ejemplo podría ser una característica de tiempo que proporciona un valor continuo. Si el intento de lectura tiene éxito, se emite la señal characteristicRead(). Un fallo en la lectura del valor activa la función CharacteristicReadError. La función writeCharacteristic() intenta escribir un nuevo valor en la característica dada. Si el intento de escritura tiene éxito, se emite la señal characteristicWritten(). Si no se consigue escribir, se emite la señal CharacteristicWriteError. La lectura y escritura de descriptores sigue el mismo patrón.
Cada intento se realiza para leer o escribir el valor de un descriptor o característica en el hardware. Esto significa que la metainformación como QLowEnergyCharacteristic::properties() se ignora generalmente al leer y escribir. Como ejemplo, es posible llamar a writeCharacteristic() a pesar de que la característica sea de sólo lectura basándose en su descripción de metadatos. La solicitud de escritura resultante se reenvía al dispositivo conectado y depende del dispositivo responder a la solicitud potencialmente no válida. En este caso el resultado es la emisión del CharacteristicWriteError en respuesta al error de dispositivo devuelto. Este comportamiento simplifica la interacción con dispositivos que comunican metadatos erróneos. Si no fue posible reenviar la solicitud al dispositivo remoto, se establece OperationError. Una posible razón podría ser que el objeto característico a escribir ni siquiera pertenece al servicio actual. En resumen, los dos tipos de error permiten distinguir rápidamente los casos de error local y remoto.
Todas las solicitudes se serializan según el principio de "primero en entrar, primero en salir". Por ejemplo, la emisión de una segunda solicitud de escritura, antes de que la solicitud de escritura anterior haya finalizado, se retrasa hasta que la primera solicitud de escritura haya finalizado.
Nota: Actualmente, no es posible enviar peticiones de escritura firmadas o de escritura fiable.
En algunos casos, el periférico genera actualizaciones de valores que la central está interesada en recibir. Para que una característica admita este tipo de notificaciones debe tener la propiedad QLowEnergyCharacteristic::Notify o QLowEnergyCharacteristic::Indicate y un descriptor de tipo QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration. Siempre que se cumplan esas condiciones se pueden habilitar las notificaciones como se muestra en el siguiente segmento de código:
//PreCondition: service details already discovered QLowEnergyCharacteristic batteryLevel = service->characteristic( QBluetoothUuid::CharacteristicType::BatteryLevel); if (!batteryLevel.isValid()) return; QLowEnergyDescriptor notification = batteryLevel.descriptor( QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration); if (!notification.isValid()) return; // establish hook into notifications connect(service, SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray)), this, SLOT(characteristicChanged(QLowEnergyCharacteristic,QByteArray))); // enable notification service->writeDescriptor(notification, QByteArray::fromHex("0100")); // disable notification //service->writeDescriptor(notification, QByteArray::fromHex("0000")); // wait until descriptorWritten() signal is emitted // to confirm successful write
El ejemplo muestra una característica de nivel de batería que actualiza la central en cada cambio de valor. Las notificaciones se realizan a través de la señal characteristicChanged(). La especificación Bluetooth proporciona más detalles sobre este mecanismo.
Compartir datos de servicio
Cada instancia de QLowEnergyService comparte sus estados internos e información con otras instancias de QLowEnergyService del mismo servicio. Si una instancia inicia el descubrimiento de los detalles del servicio, todas las instancias restantes le siguen automáticamente. Por lo tanto, el siguiente fragmento siempre funciona:
QLowEnergyService *first, *second; QLowEnergyController control(remoteDevice); control.connectToDevice(); // waiting for connection first = control.createServiceObject(QBluetoothUuid::ServiceClassUuid::BatteryService); second = control.createServiceObject(QBluetoothUuid::ServiceClassUuid::BatteryService); Q_ASSERT(first->state() == QLowEnergyService::RemoteService); Q_ASSERT(first->state() == second->state()); first->discoverDetails(); Q_ASSERT(first->state() == QLowEnergyService::RemoteServiceDiscovering); Q_ASSERT(first->state() == second->state());
Otras operaciones como las llamadas a readCharacteristic(), readDescriptor(), writeCharacteristic(), writeDescriptor() o la invalidación del servicio debido a que el QLowEnergyController relacionado se desconecta del dispositivo se comparten del mismo modo.
Véase también QLowEnergyController, QLowEnergyCharacteristic, y QLowEnergyDescriptor.
Documentación de tipos de miembros
[since 6.2] enum QLowEnergyService::DiscoveryMode
Este enum enumera los modos de descubrimiento de servicios. Todos los modos descubren las características del servicio y los descriptores de las características. Los modos difieren en si se leen los valores de las características y los descriptores.
| Constante | Valor | Descripción |
|---|---|---|
QLowEnergyService::FullDiscovery | 0 | Durante un descubrimiento completo, se descubren todas las características. Se leen todos los valores de característica y descriptores. |
QLowEnergyService::SkipValueDiscovery | 1 | Durante una detección mínima, se descubren todas las características. No se leen los valores de las características ni los descriptores. |
Este enum se introdujo en Qt 6.2.
Véase también discoverDetails().
enum QLowEnergyService::ServiceError
Este enum describe todas las posibles condiciones de error durante la existencia del servicio. La función error() devuelve el último error ocurrido.
| Constante | Valor | Descripción |
|---|---|---|
QLowEnergyService::NoError | 0 | No se ha producido ningún error. |
QLowEnergyService::OperationError | 1 | Se ha intentado realizar una operación mientras el servicio no estaba preparado. Un ejemplo podría ser el intento de escribir en el servicio cuando aún no estaba en ServiceDiscovered state () o el servicio no es válido debido a una pérdida de conexión con el dispositivo periférico. |
QLowEnergyService::CharacteristicReadError (since Qt 5.5) | 5 | Ha fallado un intento de leer un valor característico. Por ejemplo, podría producirse en respuesta a una llamada a readCharacteristic(). |
QLowEnergyService::CharacteristicWriteError | 2 | Ha fallado un intento de escribir un nuevo valor en una característica. Por ejemplo, puede producirse al intentar escribir en una característica de sólo lectura. |
QLowEnergyService::DescriptorReadError (since Qt 5.5) | 6 | Ha fallado un intento de leer un valor del descriptor. Por ejemplo, podría activarse en respuesta a una llamada a readDescriptor(). |
QLowEnergyService::DescriptorWriteError | 3 | Ha fallado un intento de escribir un nuevo valor en un descriptor. Por ejemplo, puede producirse al intentar escribir en un descriptor de sólo lectura. |
QLowEnergyService::UnknownError (since Qt 5.5) | 4 | Se ha producido un error desconocido al interactuar con el servicio. |
enum QLowEnergyService::ServiceState
Este enum describe la state() del objeto de servicio.
| Constante | Valor | Descripción |
|---|---|---|
QLowEnergyService::InvalidService | 0 | Un servicio puede dejar de ser válido cuando pierde la conexión con el dispositivo subyacente. Aunque se pierda la conexión, conserva su última información. Un servicio inválido no puede volver a ser válido aunque se restablezca la conexión con el dispositivo. |
QLowEnergyService::RemoteService | 1 | Los detalles del servicio aún no se han descubierto llamando a discoverDetails(). Las únicas informaciones fiables son sus serviceUuid() y serviceName(). |
QLowEnergyService::RemoteServiceDiscovering | 2 | Se están descubriendo los detalles del servicio. |
QLowEnergyService::RemoteServiceDiscovered | 3 | Se han descubierto los detalles del servicio. |
QLowEnergyService::LocalService (since Qt 5.7) | 4 | El servicio está asociado a un objeto controlador en peripheral role. Estos objetos de servicio no cambian de estado. |
QLowEnergyService::DiscoveryRequired | RemoteService | Obsoleto. Fue renombrado a RemoteService. |
QLowEnergyService::DiscoveringService | RemoteServiceDiscovering | Obsoleto. Fue renombrado a RemoteServiceDiscovering. |
QLowEnergyService::ServiceDiscovered | RemoteServiceDiscovered | Obsoleto. Fue renombrado a RemoteServiceDiscovered. |
enum QLowEnergyService::ServiceType
flags QLowEnergyService::ServiceTypes
Este enum describe el tipo de servicio.
| Constante | Valor | Descripción |
|---|---|---|
QLowEnergyService::PrimaryService | 0x0001 | El servicio es de nivel superior/primario. Si este indicador de tipo no está activado, el servicio se considera secundario. Cada servicio puede estar incluido por otro servicio que se indica mediante IncludedService. |
QLowEnergyService::IncludedService | 0x0002 | El servicio está incluido por otro servicio. En algunas plataformas, este indicador no puede determinarse hasta que se descubre el servicio que incluye el servicio actual. |
El tipo ServiceTypes es un tippedef para QFlags<ServiceType>. Almacena una combinación OR de valores ServiceType.
enum QLowEnergyService::WriteMode
Este enum describe el modo que debe utilizarse al escribir el valor de una característica. La característica anuncia sus modos de escritura admitidos a través de su properties.
| Constante | Valor | Descripción |
|---|---|---|
QLowEnergyService::WriteWithResponse | 0 | Si se escribe una característica utilizando este modo, el periférico enviará una confirmación de escritura. Si la operación se realiza correctamente, la confirmación se emite a través de la señal characteristicWritten(). En caso contrario, se emite la señal CharacteristicWriteError. Una característica debe tener establecida la propiedad QLowEnergyCharacteristic::Write para soportar este modo de escritura. |
QLowEnergyService::WriteWithoutResponse | 1 | Si una característica se escribe utilizando este modo, el periférico remoto no enviará una confirmación de escritura. No se puede determinar el éxito de la operación y la carga útil no debe superar los 20 bytes. Una característica debe tener establecida la propiedad QLowEnergyCharacteristic::WriteNoResponse para soportar este modo de escritura. Su ventaja es una operación de escritura más rápida, ya que puede producirse entre otras interacciones del dispositivo. |
QLowEnergyService::WriteSigned (since Qt 5.7) | 2 | Si se escribe una característica utilizando este modo, el periférico remoto no enviará una confirmación de escritura. El éxito de la operación no puede determinarse y la carga útil no debe ser superior a 8 bytes. Debe existir un enlace entre los dos dispositivos y el enlace no debe estar codificado. Una característica debe tener configurada la propiedad QLowEnergyCharacteristic::WriteSigned para soportar este modo de escritura. Este valor sólo se admite actualmente en Android y en Linux con BlueZ 5 y un kernel de versión 3.7 o posterior. |
Documentación de las funciones miembro
[virtual noexcept] QLowEnergyService::~QLowEnergyService()
Destruye la instancia QLowEnergyService.
QLowEnergyCharacteristic QLowEnergyService::characteristic(const QBluetoothUuid &uuid) const
Devuelve la característica coincidente para uuid; en caso contrario, una característica inválida.
La característica devuelta no es válida si todavía no se ha llamado a discoverDetails() de esta instancia de servicio o si no hay características que coincidan con uuid.
Véase también characteristics().
[signal] void QLowEnergyService::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
Si el objeto controlador asociado tiene el rol central, esta señal se emite cuando el valor de characteristic es cambiado por un evento en el lado del periférico/dispositivo. En ese caso, la emisión de la señal implica que las notificaciones de cambio deben haberse activado a través del descriptor ClientCharacteristicConfiguration de la característica antes del evento de cambio en el periférico. Encontrará más detalles sobre cómo hacerlo en above.
Si el controlador desempeña el papel peripheral, es decir, el objeto de servicio se creó a través de QLowEnergyController::addService, la señal se emite cuando un cliente GATT ha escrito el valor de la característica mediante una solicitud o comando de escritura.
El parámetro newValue contiene el valor actualizado de la característica characteristic.
[signal] void QLowEnergyService::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value)
Esta señal se emite cuando la petición de lectura de characteristic devuelve con éxito su value. La señal puede activarse llamando a characteristicRead(). Si la operación de lectura no tiene éxito, se emite la señal errorOccurred() utilizando la bandera CharacteristicReadError.
Nota: Esta señal sólo se emite para casos de uso relacionados con la función central.
Véase también readCharacteristic().
[signal] void QLowEnergyService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
Esta señal se emite cuando el valor de characteristic se cambia con éxito a newValue. El cambio debe haberse desencadenado llamando a writeCharacteristic(). Si la operación de escritura no tiene éxito, se emite la señal errorOccurred() utilizando la bandera CharacteristicWriteError.
La recepción de la señal de escritura puede considerarse como una señal de que el dispositivo de destino ha recibido el valor a escribir e informa del estado de la solicitud de escritura.
Nota: Si se llama a writeCharacteristic() utilizando el modo WriteWithoutResponse, esta señal y la errorOccurred() nunca se emiten.
Nota: Esta señal sólo se emite para casos de uso relacionados con el Rol Central.
Véase también writeCharacteristic().
QList<QLowEnergyCharacteristic> QLowEnergyService::characteristics() const
Devuelve todas las características asociadas a esta instancia QLowEnergyService.
La lista devuelta está vacía si aún no se ha llamado a discoverDetails() de esta instancia de servicio o si no hay características conocidas.
Véase también characteristic(), state() y discoverDetails().
bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) const
Devuelve true si characteristic pertenece a este servicio; en caso contrario false.
Una característica pertenece a un servicio si characteristics() contiene el characteristic.
bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const
Devuelve true si descriptor pertenece a este servicio; en caso contrario false.
[signal] void QLowEnergyService::descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value)
Esta señal se emite cuando la petición de lectura de descriptor devuelve con éxito su value. La señal puede activarse llamando a descriptorRead(). Si la operación de lectura no tiene éxito, se emite la señal errorOccurred() utilizando la bandera DescriptorReadError.
Nota: Esta señal sólo se emite para casos de uso relacionados con la función central.
Véase también readDescriptor().
[signal] void QLowEnergyService::descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
Esta señal se emite cuando el valor de descriptor se cambia con éxito a newValue. Si el objeto controlador asociado está en el rol central, el cambio debe haber sido causado llamando a writeDescriptor(). En caso contrario, la señal es el resultado de una solicitud o comando de escritura de un cliente GATT en el descriptor correspondiente.
Véase también writeDescriptor().
void QLowEnergyService::discoverDetails(QLowEnergyService::DiscoveryMode mode = FullDiscovery)
Inicia el descubrimiento de los servicios incluidos en el servicio, las características y sus descriptores asociados.
El proceso de descubrimiento se indica mediante la señal stateChanged(). Tras su creación, el servicio se encuentra en el estado DiscoveryRequired. Al llamar a discoverDetails() transita a DiscoveringService. Una vez finalizado el descubrimiento de detalles, pasa al estado ServiceDiscovered. En cada transición, se emite la señal stateChanged(). En función del argumento mode, se realiza una FullDiscovery o una SkipValueDiscovery. En cualquier caso, se descubren todos los servicios y características. Un FullDiscovery procede y lee todos los valores y descriptores de características. Un SkipValueDiscovery no lee valores de característica y descriptores. Un SkipValueDiscovery tiene dos ventajas. En primer lugar, es más rápido. En segundo lugar, evita los errores de algunos dispositivos que anuncian erróneamente características o descriptores como legibles pero que, sin embargo, no permiten leerlos. Esto puede provocar un comportamiento impredecible. Después de un SkipValueDiscovery, es necesario llamar a readCharacteristic() / readDescriptor() y esperar a que finalicen con éxito antes de acceder al valor de una característica o descriptor.
El argumento mode se introdujo en Qt 6.2.
Véase también state().
QLowEnergyService::ServiceError QLowEnergyService::error() const
Devuelve el último error ocurrido o NoError.
[signal, since 6.2] void QLowEnergyService::errorOccurred(QLowEnergyService::ServiceError newError)
Esta señal se emite cuando se produce un error. El parámetro newError describe el error que se ha producido.
Esta función se introdujo en Qt 6.2.
QList<QBluetoothUuid> QLowEnergyService::includedServices() const
Devuelve los UUID de todos los servicios incluidos en el servicio actual.
La lista devuelta está vacía si aún no se ha llamado a discoverDetails() de esta instancia de servicio o no hay características conocidas.
Es posible que un servicio incluido contenga otro servicio. Estos servicios incluidos de segundo nivel deben obtenerse a través de su instancia de primer nivel QLowEnergyService. Técnicamente, esto podría crear una dependencia circular.
QLowEnergyController::createServiceObject() debe utilizarse para obtener instancias de servicio para cada uno de los UUID.
Véase también createServiceObject().
void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &characteristic)
Lee el valor de characteristic. Si la operación tiene éxito, se emite la señal characteristicRead(); en caso contrario, se establece CharacteristicReadError. En general, un characteristic es legible, si su propiedad QLowEnergyCharacteristic::Read está establecida.
Todas las solicitudes de descriptor y de característica dirigidas al mismo dispositivo remoto se serializan. Se emplea una cola cuando se emiten varias solicitudes al mismo tiempo. La cola no elimina las solicitudes de lectura duplicadas para la misma característica.
Una característica sólo puede leerse si el servicio se encuentra en el estado ServiceDiscovered y pertenece al servicio. Si una de estas condiciones no es cierta, se activa QLowEnergyService::OperationError.
Nota: Llamar a esta función a pesar de que QLowEnergyCharacteristic::properties() informe de una propiedad no legible siempre intenta leer el valor de la característica en el hardware. Si el hardware devuelve un error, se activa CharacteristicReadError.
Véase también characteristicRead() y writeCharacteristic().
void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor)
Lee el valor de descriptor. Si la operación tiene éxito, se emite la señal descriptorRead(); en caso contrario, se establece DescriptorReadError.
Se serializan todas las solicitudes de descriptor y característica dirigidas al mismo dispositivo remoto. Se emplea una cola cuando se emiten varias solicitudes al mismo tiempo. La cola no elimina las solicitudes de lectura duplicadas para el mismo descriptor.
Un descriptor sólo puede leerse si el servicio se encuentra en el estado ServiceDiscovered y el descriptor pertenece al servicio. Si una de estas condiciones no es cierta, se activa QLowEnergyService::OperationError.
Véase también descriptorRead() y writeDescriptor().
QString QLowEnergyService::serviceName() const
Devuelve el nombre del servicio; en caso contrario, una cadena vacía.
El nombre devuelto sólo se puede recuperar si serviceUuid() es un UUID conocido.
QBluetoothUuid QLowEnergyService::serviceUuid() const
Devuelve el UUID del servicio; en caso contrario, un UUID nulo.
QLowEnergyService::ServiceState QLowEnergyService::state() const
Devuelve el estado actual del servicio.
Si el servicio del dispositivo se ha instanciado por primera vez, el estado del objeto es DiscoveryRequired. El estado de todos los objetos de servicio que apuntan al mismo servicio en el dispositivo periférico son siempre iguales. Esto se debe a la naturaleza compartida de los datos internos del objeto. Por lo tanto, cualquier instancia de objeto de servicio creada después de la primera tiene un estado igual a las instancias ya existentes.
Un servicio deja de ser válido si QLowEnergyController se desconecta del dispositivo remoto. Un servicio inválido conserva su estado interno en el momento del evento de desconexión. Esto implica que, una vez descubiertos los detalles del servicio, pueden recuperarse incluso de un servicio no válido. Esto permite escenarios en los que se establece la conexión del dispositivo, se recuperan los detalles del servicio y el dispositivo se desconecta inmediatamente para permitir que el siguiente dispositivo se conecte al dispositivo periférico.
Sin embargo, en circunstancias normales la conexión debe permanecer para evitar el descubrimiento repetido de servicios y sus detalles. El descubrimiento puede llevar un tiempo y el cliente puede suscribirse a notificaciones de cambios en curso.
Véase también stateChanged().
[signal] void QLowEnergyService::stateChanged(QLowEnergyService::ServiceState newState)
Esta señal se emite cuando cambia el estado del servicio. newState también puede recuperarse a través de state().
Véase también state().
QLowEnergyService::ServiceTypes QLowEnergyService::type() const
Devuelve el tipo del servicio.
Nota: No se puede confiar en el atributo type hasta que el servicio haya alcanzado el estado ServiceDiscovered. Este campo se inicializa con PrimaryService.
Nota: En Android, no es posible determinar si un servicio es primario o secundario. Por lo tanto, todos los servicios tienen el indicador PrimaryService activado.
void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse)
Escribe newValue como valor para characteristic. La semántica exacta depende del rol en el que se encuentre el objeto controlador asociado.
Rol central
La llamada da lugar a una solicitud o comando de escritura en un periférico remoto. Si la operación tiene éxito, se emite la señal characteristicWritten(); en caso contrario, se establece CharacteristicWriteError. La llamada a esta función no emite la señal characteristicChanged() a menos que el propio periférico vuelva a cambiar el valor después de la solicitud de escritura en curso.
El parámetro mode determina si el dispositivo remoto debe enviar una confirmación de escritura. El characteristic a escribir debe soportar el modo de escritura correspondiente. Los modos de escritura admitidos por la característica se indican mediante sus propiedades QLowEnergyCharacteristic::Write y QLowEnergyCharacteristic::WriteNoResponse.
Todas las solicitudes de escritura de descriptores y características dirigidas al mismo dispositivo remoto se serializan. Se emplea una cola cuando se emiten varias solicitudes de escritura al mismo tiempo. La cola no elimina las solicitudes de escritura duplicadas para la misma característica. Por ejemplo, si el mismo descriptor se establece en el valor A e inmediatamente después en B, las dos solicitudes de escritura se ejecutan en el orden dado.
Nota: Actualmente, no es posible utilizar escrituras firmadas o fiables tal y como se definen en la especificación Bluetooth.
Una característica sólo puede escribirse si este servicio se encuentra en el estado ServiceDiscovered y pertenece al servicio. Si una de estas condiciones no es cierta, se establece QLowEnergyService::OperationError.
Nota: Llamar a esta función a pesar de que QLowEnergyCharacteristic::properties() informe de una característica no escribible siempre intenta escribir en el hardware. Del mismo modo, también se envía un WriteWithoutResponse al hardware aunque la característica sólo admita WriteWithResponse. Si el hardware devuelve un error, se establece CharacteristicWriteError.
Función periférica
La llamada tiene como resultado la actualización del valor de la característica en la base de datos local.
Si un cliente está conectado en ese momento y ha habilitado notificaciones o indicaciones para la característica, se enviará la información correspondiente. Si un dispositivo ha habilitado notificaciones o indicaciones para la característica y ese dispositivo no está conectado en ese momento, pero existe un vínculo entre él y el dispositivo local, la notificación o indicación se enviará en la próxima reconexión.
Si existe una restricción sobre la longitud del valor de la característica y newValue no respeta dicha restricción, el comportamiento es indeterminado.
Nota: El argumento mode se ignora en modo periférico.
Véase también QLowEnergyService::characteristicWritten() y QLowEnergyService::readCharacteristic().
void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
Escribe newValue como valor para descriptor. La semántica exacta depende del rol en el que se encuentre el objeto controlador asociado.
Función central
Una llamada a esta función resulta en una petición de escritura al dispositivo remoto. Si la operación tiene éxito, se emite la señal descriptorWritten(); en caso contrario, se emite la señal DescriptorWriteError.
Se serializan todas las peticiones de descriptor y característica hacia el mismo dispositivo remoto. Se emplea una cola cuando se emiten varias solicitudes de escritura al mismo tiempo. La cola no elimina las solicitudes de escritura duplicadas para el mismo descriptor. Por ejemplo, si el mismo descriptor se establece en el valor A e inmediatamente después en B, las dos solicitudes de escritura se ejecutan en el orden dado.
Un descriptor sólo puede escribirse si este servicio está en el estado ServiceDiscovered, pertenece al servicio. Si una de estas condiciones no es cierta, se establece QLowEnergyService::OperationError.
Función periférica
El valor se escribe en la base de datos del servicio local. Si el contenido de newValue no es válido para descriptor, el comportamiento es indeterminado.
Véase también descriptorWritten() y readDescriptor().
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.