QLowEnergyService Class
La classe `QLowEnergyService` représente un service individuel sur un périphérique Bluetooth Low Energy. En savoir plus...
| En-tête : | #include <QLowEnergyService> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Bluetooth) target_link_libraries(mytarget PRIVATE Qt6::Bluetooth) |
| qmake : | QT += bluetooth |
| Hérite de : | QObject |
Types publics
(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 } |
Fonctions publiques
| 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) |
Signaux
| 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) |
Description détaillée
QLowEnergyService permet d'accéder aux détails des services Bluetooth Low Energy. Cette classe facilite la découverte et la publication des détails des services, permet la lecture et l'écriture des données qu'ils contiennent et signale les modifications apportées à ces données.
Structure du service
Un périphérique Bluetooth Low Energy peut contenir plusieurs services. À son tour, chaque service peut inclure d’autres services. Cette classe représente un service unique du périphérique et est créée via la méthode ` QLowEnergyController::createServiceObject()`. Le paramètre ` type()` indique si ce service est un service primaire (de niveau supérieur) ou s’il fait partie d’un autre service. Chaque service peut contenir une ou plusieurs caractéristiques, et chaque caractéristique peut contenir des descripteurs. La structure qui en résulte peut ressembler au schéma suivant :

Une caractéristique est le principal vecteur d’informations. Elle dispose d’une méthode ` value()` et d’une méthode ` properties()` décrivant les autorisations d’accès à la valeur. L’objectif général du descripteur qu’elle contient est de définir plus précisément la nature de la caractéristique. Par exemple, il peut préciser comment la valeur doit être interprétée ou s’il est possible d’avertir l’utilisateur de la valeur en cas de modification de celle-ci.
Interaction entre services
Lorsqu’un objet de service est créé pour la première fois, ses détails ne sont pas encore connus. Cela est indiqué par le fait que son attribut « state » () a actuellement la valeur « DiscoveryRequired ». Seuls les attributs « serviceUuid » () et « serviceName » () peuvent être récupérés.
La découverte de ses services inclus, de ses caractéristiques et de ses descripteurs est déclenchée lors de l’appel de la méthode discoverDetails(). Au cours de cette découverte, l’état state() passe de DiscoveryRequired à DiscoveringService, puis à son état final ServiceDiscovered. Cette transition est signalée via le signal stateChanged(). Une fois les détails connus, toutes les caractéristiques, tous les descripteurs et tous les services inclus sont identifiés et peuvent être lus ou écrits.
Les valeurs des caractéristiques et des descripteurs peuvent être récupérées respectivement via les fonctions QLowEnergyCharacteristic et QLowEnergyDescriptor. Cependant, la lecture ou l’écriture directe de ces attributs nécessite l’objet de service. La fonction readCharacteristic() tente de relire la valeur d’une caractéristique. Bien que la découverte initiale du service ait pu déjà fournir une valeur, cet appel peut s’avérer nécessaire dans les cas où la valeur de la caractéristique change constamment sans qu’aucune notification ne soit fournie. On peut citer comme exemple une caractéristique temporelle fournissant une valeur continue. Si la tentative de lecture aboutit, le signal characteristicRead() est émis. Un échec de la lecture de la valeur déclenche le signal CharacteristicReadError. La fonction writeCharacteristic() tente d’écrire une nouvelle valeur dans la caractéristique donnée. Si la tentative d’écriture aboutit, le signal characteristicWritten() est émis. Un échec d’écriture déclenche l’ CharacteristicWriteError. La lecture et l’écriture des descripteurs suivent le même schéma.
Chaque tentative vise à lire ou à écrire la valeur d’un descripteur ou d’une caractéristique au niveau matériel. Cela signifie que les méta-informations telles que ` QLowEnergyCharacteristic::properties()` sont généralement ignorées lors de la lecture et de l’écriture. À titre d’exemple, il est possible d’appeler ` writeCharacteristic()` même si la caractéristique est en lecture seule selon la description de ses métadonnées. La requête d’écriture qui en résulte est transmise au périphérique connecté et c’est à ce dernier qu’il revient de répondre à cette requête potentiellement non valide. Dans ce cas, l’erreur de périphérique renvoyée entraîne l’émission de l’ CharacteristicWriteError. Ce comportement simplifie l’interaction avec les périphériques qui fournissent des méta-informations erronées. S’il n’a pas été possible de transmettre la requête au périphérique distant, l’ OperationError est activée. Une raison possible pourrait être que l’objet de caractéristique à écrire n’appartient même pas au service actuel. En résumé, ces deux types d’erreurs permettent de distinguer rapidement les cas d’erreurs locales des cas d’erreurs distantes.
Toutes les requêtes sont traitées selon le principe « premier entré, premier sorti » (FIFO). Par exemple, l'envoi d'une deuxième requête d'écriture avant la fin de la requête précédente est reporté jusqu'à ce que cette dernière soit terminée.
Remarque : à l’heure actuelle , il n’est pas possible d’envoyer des requêtes d’écriture signées ou fiables.
Dans certains cas, le périphérique génère des mises à jour de valeurs que le contrôleur central souhaite recevoir. Pour qu’une caractéristique prenne en charge ces notifications, elle doit disposer de la propriété « QLowEnergyCharacteristic::Notify » ou « QLowEnergyCharacteristic::Indicate » et d’un descripteur de type « QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration ». Si ces conditions sont remplies, les notifications peuvent être activées comme indiqué dans l’extrait de code suivant :
//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 writeL’exemple présente une caractéristique de niveau de batterie qui informe le central à chaque changement de valeur. Les notifications sont transmises via le signal characteristicChanged(). De plus amples détails sur ce mécanisme sont fournis par la spécification Bluetooth.
Partage des données de service
Chaque instance de `QLowEnergyService` partage ses états internes et ses informations avec les autres instances de `QLowEnergyService` appartenant au même service. Si une instance lance la découverte des détails du service, toutes les autres instances la suivent automatiquement. Par conséquent, l’extrait de code suivant fonctionne toujours :
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());D'autres opérations, telles que les appels à ` readCharacteristic()`, ` readDescriptor()`, ` writeCharacteristic()`, ` writeDescriptor()` ou l'invalidation du service due à la déconnexion de l'QLowEnergyController associé de l'appareil, sont partagées de la même manière.
Voir également QLowEnergyController, QLowEnergyCharacteristic et QLowEnergyDescriptor.
Documentation sur les types de membres
[since 6.2] enum QLowEnergyService::DiscoveryMode
Cette énumération répertorie les modes de découverte de services. Tous les modes permettent de découvrir les caractéristiques du service ainsi que les descripteurs de ces caractéristiques. Les modes se distinguent par le fait que les valeurs des caractéristiques et les descripteurs sont lus ou non.
| Constante | Valeur | Description |
|---|---|---|
QLowEnergyService::FullDiscovery | 0 | Lors d’une découverte complète, toutes les caractéristiques sont identifiées. Toutes les valeurs de caractéristiques et tous les descripteurs sont lus. |
QLowEnergyService::SkipValueDiscovery | 1 | Lors d'une découverte minimale, toutes les caractéristiques sont détectées. Les valeurs des caractéristiques et les descripteurs ne sont pas lus. |
Cette énumération a été introduite dans Qt 6.2.
Voir aussi discoverDetails().
enum QLowEnergyService::ServiceError
Cette énumération décrit toutes les conditions d'erreur possibles pendant la durée de vie du service. La fonction error() renvoie la dernière erreur survenue.
| Constante | Valeur | Description |
|---|---|---|
QLowEnergyService::NoError | 0 | Aucune erreur ne s'est produite. |
QLowEnergyService::OperationError | 1 | Une opération a été tentée alors que le service n’était pas prêt. Par exemple, une tentative d’écriture sur le service alors qu’il n’était pas encore en mode « ServiceDiscovered » ( state()), ou lorsque le service est invalide en raison d’une perte de connexion avec le périphérique. |
QLowEnergyService::CharacteristicReadError (since Qt 5.5) | 5 | Une tentative de lecture d’une valeur de caractéristique a échoué. Cela peut par exemple se produire en réponse à un appel à la fonction readCharacteristic(). |
QLowEnergyService::CharacteristicWriteError | 2 | Une tentative d’écriture d’une nouvelle valeur dans une caractéristique a échoué. Par exemple, cela peut se produire lors d’une tentative d’écriture dans une caractéristique en lecture seule. |
QLowEnergyService::DescriptorReadError (since Qt 5.5) | 6 | Une tentative de lecture d’une valeur de descripteur a échoué. Par exemple, cela peut être déclenché en réponse à un appel à la fonction ` readDescriptor()`. |
QLowEnergyService::DescriptorWriteError | 3 | Une tentative d’écriture d’une nouvelle valeur dans un descripteur a échoué. Par exemple, cette erreur peut être déclenchée lors d’une tentative d’écriture dans un descripteur en lecture seule. |
QLowEnergyService::UnknownError (since Qt 5.5) | 4 | Une erreur inconnue s’est produite lors de l’interaction avec le service. |
enum QLowEnergyService::ServiceState
Cette énumération décrit l'state() de l'objet de service.
| Constante | Valeur | Description |
|---|---|---|
QLowEnergyService::InvalidService | 0 | Un service peut devenir invalide lorsqu'il perd la connexion avec le périphérique sous-jacent. Même si la connexion est perdue, il conserve ses dernières informations. Un service invalide ne peut plus redevenir valide, même si la connexion avec le périphérique est rétablie. |
QLowEnergyService::RemoteService | 1 | Les détails du service restent à découvrir en appelant la méthode discoverDetails(). Les seules informations fiables sont ses propriétés serviceUuid() et serviceName(). |
QLowEnergyService::RemoteServiceDiscovering | 2 | Les détails du service sont en cours de découverte. |
QLowEnergyService::RemoteServiceDiscovered | 3 | Les détails du service ont été découverts. |
QLowEnergyService::LocalService (since Qt 5.7) | 4 | Le service est associé à un objet contrôleur dans l'peripheral role. Les objets de service de ce type ne changent pas d'état. |
QLowEnergyService::DiscoveryRequired | RemoteService | Obsolète. A été renommé RemoteService. |
QLowEnergyService::DiscoveringService | RemoteServiceDiscovering | Obsolète. A été renommé RemoteServiceDiscovering. |
QLowEnergyService::ServiceDiscovered | RemoteServiceDiscovered | Obsolète. A été renommé RemoteServiceDiscovered. |
enum QLowEnergyService::ServiceType
flags QLowEnergyService::ServiceTypes
Cette énumération décrit le type du service.
| Constante | Valeur | Description |
|---|---|---|
QLowEnergyService::PrimaryService | 0x0001 | Le service est un service de niveau supérieur/principal. Si cet indicateur de type n'est pas défini, le service est considéré comme un service secondaire. Chaque service peut être inclus dans un autre service, ce qui est indiqué par IncludedService. |
QLowEnergyService::IncludedService | 0x0002 | Le service est inclus dans un autre service. Sur certaines plateformes, cet indicateur ne peut être déterminé tant que le service qui inclut le service actuel n'a pas été découvert. |
Le type ServiceTypes est un typedef pour QFlags<ServiceType>. Il stocke une combinaison « OU » de valeurs ServiceType.
enum QLowEnergyService::WriteMode
Cette énumération décrit le mode à utiliser lors de l'écriture d'une valeur de caractéristique. La caractéristique indique les modes d'écriture pris en charge via son attribut « properties ».
| Constante | Valeur | Description |
|---|---|---|
QLowEnergyService::WriteWithResponse | 0 | Si une caractéristique est écrite à l’aide de ce mode, le périphérique doit envoyer une confirmation d’écriture. Si l’opération aboutit, la confirmation est émise via le signal characteristicWritten(). Dans le cas contraire, le signal CharacteristicWriteError est émis. Une caractéristique doit avoir la propriété QLowEnergyCharacteristic::Write définie sur « set » pour prendre en charge ce mode d’écriture. |
QLowEnergyService::WriteWithoutResponse | 1 | Si une caractéristique est écrite à l’aide de ce mode, le périphérique distant ne doit pas envoyer de confirmation d’écriture. Il n’est pas possible de déterminer si l’opération a abouti et la charge utile ne doit pas dépasser 20 octets. Une caractéristique doit avoir la propriété QLowEnergyCharacteristic::WriteNoResponse définie pour prendre en charge ce mode d’écriture. Son avantage réside dans une opération d’écriture plus rapide, car elle peut s’effectuer entre deux interactions avec l’appareil. |
QLowEnergyService::WriteSigned (since Qt 5.7) | 2 | Si une caractéristique est écrite à l’aide de ce mode, le périphérique distant ne doit pas envoyer de confirmation d’écriture. Il n’est pas possible de déterminer si l’opération a abouti et la charge utile ne doit pas dépasser 8 octets. Une liaison doit exister entre les deux appareils et la connexion ne doit pas être chiffrée. Une caractéristique doit avoir la propriété « QLowEnergyCharacteristic::WriteSigned » activée pour prendre en charge ce mode d’écriture. Cette valeur n’est actuellement prise en charge que sur Android et sous Linux avec BlueZ 5 et un noyau de version 3.7 ou plus récente. |
Documentation des fonctions membres
[virtual noexcept] QLowEnergyService::~QLowEnergyService()
Supprime l'instance de ` QLowEnergyService `.
QLowEnergyCharacteristic QLowEnergyService::characteristic(const QBluetoothUuid &uuid) const
Renvoie la caractéristique correspondante pour uuid; sinon, une caractéristique non valide.
La caractéristique renvoyée n'est pas valide si la méthode discoverDetails() de cette instance de service n'a pas encore été appelée ou s'il n'existe aucune caractéristique correspondant à uuid.
Voir également characteristics().
[signal] void QLowEnergyService::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
Si l'objet contrôleur associé occupe le rôle « central », ce signal est émis lorsque la valeur de « characteristic » est modifiée par un événement du côté du périphérique. Dans ce cas, l'émission du signal implique que les notifications de modification doivent avoir été activées via le descripteur « ClientCharacteristicConfiguration » de la caractéristique avant l'événement de modification sur le périphérique. Vous trouverez plus de détails sur la manière de procéder à l’ above.
Si le contrôleur occupe le rôle d’ peripheral, c’est-à-dire si l’objet de service a été créé via QLowEnergyController::addService, le signal est émis lorsqu’un client GATT a écrit la valeur de la caractéristique à l’aide d’une requête d’écriture ou d’une commande.
Le paramètre « newValue » contient la valeur mise à jour de la caractéristique characteristic.
[signal] void QLowEnergyService::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value)
Ce signal est émis lorsque la requête de lecture concernant characteristic a renvoyé avec succès son value. Le signal peut être déclenché par l'appel de la fonction characteristicRead(). Si l'opération de lecture échoue, le signal errorOccurred() est émis à l'aide du drapeau CharacteristicReadError.
Remarque : ce signal n’est émis que pour les cas d’utilisation liés au rôle central.
Voir également readCharacteristic().
[signal] void QLowEnergyService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
Ce signal est émis lorsque la valeur de ` characteristic ` a été modifiée avec succès pour passer à ` newValue`. La modification doit avoir été déclenchée par l'appel de la fonction ` writeCharacteristic()`. Si l'opération d'écriture échoue, le signal ` errorOccurred()` est émis à l'aide du drapeau ` CharacteristicWriteError `.
La réception du signal « written » peut être considérée comme un signe indiquant que le périphérique cible a bien reçu la valeur à écrire et renvoie l’état de la requête d’écriture.
Remarque : si la fonction ` writeCharacteristic()` est appelée en mode ` WriteWithoutResponse `, ce signal et le signal ` errorOccurred()` ne sont jamais émis.
Remarque : ce signal n’est émis que pour les cas d’utilisation liés au rôle central.
Voir également writeCharacteristic().
QList<QLowEnergyCharacteristic> QLowEnergyService::characteristics() const
Renvoie toutes les caractéristiques associées à cette instance de service « QLowEnergyService ».
La liste renvoyée est vide si la méthode ` discoverDetails()` de cette instance de service n'a pas encore été appelée ou s'il n'existe aucune caractéristique connue.
Voir également characteristic(), state() et discoverDetails().
bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) const
Renvoie ` true ` si ` characteristic ` appartient à ce service ; sinon, renvoie ` false`.
Une caractéristique appartient à un service si characteristics() contient characteristic.
bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const
Renvoie ` true ` si ` descriptor ` appartient à ce service ; sinon, renvoie ` false`.
[signal] void QLowEnergyService::descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value)
Ce signal est émis lorsque la requête de lecture concernant descriptor a renvoyé avec succès son value. Le signal peut être déclenché par l'appel à la fonction descriptorRead(). Si l'opération de lecture échoue, le signal errorOccurred() est émis à l'aide du drapeau DescriptorReadError.
Remarque : ce signal n’est émis que pour les cas d’utilisation liés au rôle central.
Voir également readDescriptor().
[signal] void QLowEnergyService::descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
Ce signal est émis lorsque la valeur de ` descriptor ` a été modifiée avec succès et remplace désormais ` newValue`. Si l'objet contrôleur associé occupe le rôle « central », cette modification doit avoir été provoquée par l'appel de la fonction ` writeDescriptor()`. Dans le cas contraire, le signal résulte d'une requête d'écriture ou d'une commande émise par un client GATT vers le descripteur correspondant.
Voir également writeDescriptor().
void QLowEnergyService::discoverDetails(QLowEnergyService::DiscoveryMode mode = FullDiscovery)
Lance la découverte des services inclus dans le service, de leurs caractéristiques et des descripteurs qui leur sont associés.
Le processus de découverte est signalé par le signal « stateChanged » (). Une fois créé, le service se trouve dans l’état « DiscoveryRequired ». Lors de l’appel de la méthode discoverDetails(), il passe à l’état « DiscoveringService ». Une fois la découverte des détails terminée, il passe à l’état « ServiceDiscovered ». À chaque transition, le signal « stateChanged » () est émis. En fonction de l’argument « mode », une « FullDiscovery » ou une « SkipValueDiscovery » est effectuée. Dans tous les cas, l’ensemble des services et des caractéristiques est découvert. Une « FullDiscovery » procède à la lecture de toutes les valeurs de caractéristiques et de tous les descripteurs. Une « SkipValueDiscovery » ne lit ni les valeurs de caractéristiques ni les descripteurs. Une « SkipValueDiscovery » présente deux avantages. Premièrement, elle est plus rapide. Deuxièmement, elle contourne les bogues présents sur certains appareils qui signalent à tort que des caractéristiques ou des descripteurs sont lisibles, mais qui n’autorisent pourtant pas leur lecture. Cela peut entraîner un comportement imprévisible. Après une opération « SkipValueDiscovery », il est nécessaire d’appeler « readCharacteristic() » / « readDescriptor() » et d’attendre qu’elles se terminent avec succès avant d’accéder à la valeur d’une caractéristique ou d’un descripteur.
L’argument mode a été introduit dans Qt 6.2.
Voir également state().
QLowEnergyService::ServiceError QLowEnergyService::error() const
Renvoie la dernière erreur survenue ou l'NoError.
[signal, since 6.2] void QLowEnergyService::errorOccurred(QLowEnergyService::ServiceError newError)
Ce signal est émis lorsqu'une erreur se produit. Le paramètre « newError » décrit l'erreur qui s'est produite.
Cette fonction a été introduite dans Qt 6.2.
QList<QBluetoothUuid> QLowEnergyService::includedServices() const
Renvoie les UUID de tous les services inclus par le service actuel.
La liste renvoyée est vide si la méthode discoverDetails() de cette instance de service n'a pas encore été appelée ou s'il n'existe aucune caractéristique connue.
Il est possible qu’un service inclus contienne lui-même un autre service. Ces inclusions de deuxième niveau doivent être obtenues via l’instance correspondante de la méthode ` QLowEnergyService ` de premier niveau. Techniquement, cela pourrait créer une dépendance circulaire.
QLowEnergyController::createServiceObjectLa méthode () doit être utilisée pour obtenir les instances de service correspondant à chacun des UUID.
Voir également createServiceObject().
void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &characteristic)
Lit la valeur de l’ characteristic. Si l’opération aboutit, le signal characteristicRead() est émis ; dans le cas contraire, le signal CharacteristicReadError est activé. En général, un characteristic est accessible en lecture si sa propriété QLowEnergyCharacteristic::Read est activée.
Toutes les requêtes de descripteurs et de caractéristiques adressées au même périphérique distant sont sérialisées. Une file d’attente est utilisée lors de l’émission de plusieurs requêtes simultanées. La file d’attente n’élimine pas les requêtes de lecture en double pour une même caractéristique.
Une caractéristique ne peut être lue que si le service est à l’état « ServiceDiscovered » et si elle appartient à ce service. Si l’une de ces conditions n’est pas remplie, la valeur « QLowEnergyService::OperationError » est définie.
Remarque : l'appel de cette fonction, même si QLowEnergyCharacteristic::properties() signale une propriété non lisible, tente toujours de lire la valeur de la caractéristique sur le matériel. Si le matériel renvoie une erreur, l'CharacteristicReadError est défini.
Voir également characteristicRead() et writeCharacteristic().
void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor)
Lit la valeur d'descriptor. Si l'opération aboutit, le signal descriptorRead() est émis ; dans le cas contraire, l'DescriptorReadError est activée.
Toutes les requêtes de descripteurs et de caractéristiques adressées au même périphérique distant sont sérialisées. Une file d’attente est utilisée lorsque plusieurs requêtes sont émises simultanément. La file d’attente n’élimine pas les requêtes de lecture en double pour un même descripteur.
Un descripteur ne peut être lu que si le service est dans l’état « ServiceDiscovered » et si le descripteur appartient à ce service. Si l’une de ces conditions n’est pas remplie, l’ QLowEnergyService::OperationError est activé.
Voir également descriptorRead() et writeDescriptor().
QString QLowEnergyService::serviceName() const
Renvoie le nom du service ; sinon, une chaîne vide.
Le nom renvoyé ne peut être récupéré que si serviceUuid() est un UUID bien connu.
QBluetoothUuid QLowEnergyService::serviceUuid() const
Renvoie l'UUID du service ; sinon, un UUID nul.
QLowEnergyService::ServiceState QLowEnergyService::state() const
Renvoie l'état actuel du service.
Si le service de l'appareil a été instancié pour la première fois, l'état de l'objet est « DiscoveryRequired ». L'état de tous les objets de service qui pointent vers le même service sur le périphérique est toujours identique. Cela est dû à la nature partagée des données internes de l'objet. Par conséquent, toute instance d'objet de service créée après la première a un état identique à celui des instances déjà existantes.
Un service devient invalide si l’ QLowEnergyController se déconnecte du périphérique distant. Un service invalide conserve son état interne au moment de la déconnexion. Cela implique qu’une fois les détails du service découverts, ceux-ci peuvent même être récupérés à partir d’un service invalide. Cela permet des scénarios dans lesquels la connexion au périphérique est établie, les détails du service sont récupérés, puis le périphérique est immédiatement déconnecté pour permettre au périphérique suivant de se connecter.
Toutefois, dans des circonstances normales, la connexion doit rester active afin d’éviter une découverte répétée des services et de leurs détails. La découverte peut prendre un certain temps et le client peut s’abonner à des notifications de modification en continu.
Voir également stateChanged().
[signal] void QLowEnergyService::stateChanged(QLowEnergyService::ServiceState newState)
Ce signal est émis lorsque l'état du service change. L'newState e peut également être récupérée via la fonction state().
Voir également state().
QLowEnergyService::ServiceTypes QLowEnergyService::type() const
Renvoie le type du service.
Remarque : l'attribut « type » n'est fiable qu'une fois que le service a atteint l'état « ServiceDiscovered ». Ce champ est initialisé avec la valeur « PrimaryService ».
Remarque : sous Android, il n'est pas possible de déterminer si un service est un service principal ou secondaire. Par conséquent, tous les services ont l'indicateur « PrimaryService » activé.
void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse)
Écrit « newValue » comme valeur de l'characteristic. La sémantique exacte dépend du rôle dans lequel se trouve l'objet contrôleur associé.
Rôle central
L'appel entraîne une requête d'écriture ou une commande vers un périphérique distant. Si l'opération aboutit, le signal « characteristicWritten » () est émis ; dans le cas contraire, le paramètre « CharacteristicWriteError » est défini. L'appel de cette fonction ne déclenche pas le signal « characteristicChanged » () à moins que le périphérique lui-même ne modifie à nouveau la valeur après la requête d'écriture en cours.
Le paramètre ` mode ` détermine si le périphérique distant doit envoyer une confirmation d’écriture. La caractéristique ` characteristic ` à écrire doit prendre en charge le mode d’écriture concerné. Les modes d’écriture pris en charge par la caractéristique sont indiqués par ses propriétés ` QLowEnergyCharacteristic::Write ` et ` QLowEnergyCharacteristic::WriteNoResponse `.
Toutes les requêtes d’écriture de descripteurs et de caractéristiques destinées au même périphérique distant sont sérialisées. Une file d’attente est utilisée lorsque plusieurs requêtes d’écriture sont émises simultanément. La file d’attente n’élimine pas les requêtes d’écriture en double pour une même caractéristique. Par exemple, si un même descripteur est défini sur la valeur A puis immédiatement après sur la valeur B, les deux requêtes d’écriture sont exécutées dans l’ordre indiqué.
Remarque : à l’heure actuelle , il n’est pas possible d’utiliser des écritures signées ou fiables telles que définies par la spécification Bluetooth.
Une caractéristique ne peut être écrite que si ce service est à l’état « ServiceDiscovered » et appartient au service. Si l’une de ces conditions n’est pas remplie, l’ QLowEnergyService::OperationError est défini.
Remarque : l’appel de cette fonction, même si QLowEnergyCharacteristic::properties() signale une propriété non inscriptible, tente toujours d’écrire dans le matériel. De même, un WriteWithoutResponse est également envoyé au matériel, bien que la caractéristique ne prenne en charge que l’ WriteWithResponse. Si le matériel renvoie une erreur, l’ CharacteristicWriteError est défini.
Rôle du périphérique
L’appel entraîne la mise à jour de la valeur de la caractéristique dans la base de données locale.
Si un client est actuellement connecté et qu’il a activé les notifications ou les indications pour cette caractéristique, les informations correspondantes seront envoyées. Si un appareil a activé les notifications ou les indications pour cette caractéristique et que cet appareil n’est actuellement pas connecté, mais qu’une liaison existe entre lui et l’appareil local, alors la notification ou l’indication sera envoyée lors de la prochaine reconnexion.
S’il existe une contrainte sur la longueur de la valeur de la caractéristique et que l’ newValue e ne respecte pas cette contrainte, le comportement n’est pas spécifié.
Remarque : L’argument ` mode ` est ignoré en mode périphérique.
Voir également ` QLowEnergyService::characteristicWritten()` et ` QLowEnergyService::readCharacteristic()`.
void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
Écrit « newValue » comme valeur de « descriptor ». La sémantique exacte dépend du rôle dans lequel se trouve l'objet contrôleur associé.
Rôle central
Un appel à cette fonction entraîne une requête d’écriture vers le périphérique distant. Si l’opération aboutit, le signal descriptorWritten() est émis ; dans le cas contraire, le signal DescriptorWriteError est émis.
Toutes les requêtes de descripteurs et de caractéristiques adressées au même périphérique distant sont sérialisées. Une file d’attente est utilisée lors de l’émission simultanée de plusieurs requêtes d’écriture. La file d’attente n’élimine pas les requêtes d’écriture en double pour un même descripteur. Par exemple, si un même descripteur est défini sur la valeur A puis immédiatement après sur la valeur B, les deux requêtes d’écriture sont exécutées dans l’ordre indiqué.
Un descripteur ne peut être modifié que si ce service est à l’état « ServiceDiscovered » et appartient au service. Si l’une de ces conditions n’est pas remplie, l’ QLowEnergyService::OperationError est activé.
Rôle du périphérique
La valeur est écrite dans la base de données locale du service. Si le contenu de ` newValue ` n’est pas valide pour ` descriptor`, le comportement n’est pas spécifié.
Voir également descriptorWritten() et 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.