Sur cette page

QLowEnergyService Class

La classe QLowEnergyService représente un service individuel sur un dispositif Bluetooth Low Energy. Plus d'informations...

En-tête : #include <QLowEnergyService>
CMake : find_package(Qt6 REQUIRED COMPONENTS Bluetooth)
target_link_libraries(mytarget PRIVATE Qt6::Bluetooth)
qmake : QT += bluetooth
Héritages : 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. La classe facilite la découverte et la publication des détails du service, permet la lecture et l'écriture des données contenues et notifie les changements de données.

Structure du service

Un périphérique Bluetooth Low Energy peut contenir plusieurs services. Chaque service peut à son tour inclure d'autres services. Cette classe représente un seul service du périphérique et est créée via QLowEnergyController::createServiceObject(). Le type() indique si ce service est un service primaire (de premier niveau) 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 résultante peut ressembler au diagramme suivant :

Structure d'un périphérique générique

Une caractéristique est le principal support d'information. Elle possède un value() et un properties() décrivant les autorisations d'accès à la valeur. L'objectif général du descripteur contenu est de définir plus précisément la nature de la caractéristique. Par exemple, il peut préciser comment la valeur est censée être interprétée ou s'il peut informer le consommateur de la valeur des changements de celle-ci.

Interaction de service

Lorsqu'un objet de service a été créé pour la première fois, ses détails doivent encore être découverts. Cela est indiqué par le fait que son adresse actuelle state() est DiscoveryRequired. Il n'est possible de récupérer que les serviceUuid() et serviceName().

La découverte des services, caractéristiques et descripteurs inclus est déclenchée par l'appel à discoverDetails(). Au cours de la découverte, state() passe de DiscoveryRequired à DiscoveringService, puis à son état final ServiceDiscovered. Cette transition est annoncée par le signal stateChanged(). Une fois que les détails sont connus, toutes les caractéristiques, tous les descripteurs et tous les services inclus sont connus et peuvent être lus ou écrits.

Les valeurs des caractéristiques et des descripteurs peuvent être récupérées via QLowEnergyCharacteristic et QLowEnergyDescriptor, respectivement. Toutefois, 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 puisse avoir déjà obtenu une valeur, cet appel peut être nécessaire dans les cas où la valeur de la caractéristique change constamment sans qu'aucune notification ne soit fournie. Il peut s'agir, par exemple, d'une caractéristique temporelle qui fournit une valeur continue. Si la tentative de lecture réussit, 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 réussit, le signal characteristicWritten() est émis. Un échec de l'écriture déclenche le signal CharacteristicWriteError. La lecture et l'écriture des descripteurs suivent le même schéma.

Chaque tentative de lecture ou d'écriture de la valeur d'un descripteur ou d'une caractéristique sur le matériel est effectuée. 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. Par exemple, il est possible d'appeler writeCharacteristic() bien que la caractéristique soit en lecture seule sur la base de la description de ses métadonnées. La demande d'écriture qui en résulte est transmise au dispositif connecté et c'est à ce dernier de répondre à la demande potentiellement invalide. Dans ce cas, le résultat est l'émission de CharacteristicWriteError en réponse à l'erreur renvoyée par le dispositif. Ce comportement simplifie l'interaction avec les dispositifs qui signalent des méta-informations erronées. S'il n'a pas été possible de transmettre la demande au dispositif distant, l'adresse OperationError est définie. Une raison potentielle pourrait être que l'objet caractéristique à écrire n'appartient même pas au service actuel. En résumé, les deux types d'erreurs permettent de distinguer rapidement les cas d'erreurs locales et distantes.

Toutes les demandes sont sérialisées selon le principe du premier entré, premier sorti. Par exemple, l'émission d'une deuxième demande d'écriture, avant que la demande d'écriture précédente ne soit terminée, est retardée jusqu'à ce que la première demande d'écriture soit terminée.

Remarque : actuellement, il n'est pas possible d'envoyer des demandes d'écriture signées ou des demandes d'écriture fiables.

Dans certains cas, le périphérique génère des mises à jour de valeurs que le central souhaite recevoir. Pour qu'une caractéristique prenne en charge ces notifications, elle doit avoir la propriété QLowEnergyCharacteristic::Notify ou QLowEnergyCharacteristic::Indicate et un descripteur de type QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration. Si ces conditions sont remplies, les notifications peuvent être activées comme le montre le segment 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 write

L'exemple montre une caractéristique de niveau de batterie qui met à jour le central à chaque changement de valeur. Les notifications sont fournies via le signal characteristicChanged(). La spécification Bluetooth fournit plus de détails sur ce mécanisme.

Partage des données de service

Chaque instance de QLowEnergyService partage ses états internes et ses informations avec les autres instances de QLowEnergyService du même service. Si une instance initie la découverte des détails du service, toutes les autres instances suivent automatiquement. Par conséquent, l'extrait 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 en raison de la déconnexion de l'appareil QLowEnergyController 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 liste énumère les modes de découverte des services. Tous les modes découvrent les caractéristiques du service et les descripteurs des caractéristiques. Les modes diffèrent selon que les valeurs de caractéristiques et les descripteurs sont lus ou non.

ConstanteValeurDescription
QLowEnergyService::FullDiscovery0Lors d'une découverte complète, toutes les caractéristiques sont découvertes. Toutes les valeurs de caractéristiques et tous les descripteurs sont lus.
QLowEnergyService::SkipValueDiscovery1Lors d'une découverte minimale, toutes les caractéristiques sont découvertes. Les valeurs des caractéristiques et les descripteurs ne sont pas lus.

Cette énumération a été introduite dans Qt 6.2.

Voir également discoverDetails().

enum QLowEnergyService::ServiceError

Cette énumération décrit toutes les conditions d'erreur possibles au cours de l'existence du service. La fonction error() renvoie la dernière erreur survenue.

ConstanteValeurDescription de l'erreur
QLowEnergyService::NoError0Aucune erreur ne s'est produite.
QLowEnergyService::OperationError1Une opération a été tentée alors que le service n'était pas prêt. Il peut s'agir, par exemple, d'une tentative d'écriture sur le service alors qu'il ne se trouve pas encore sur le site ServiceDiscovered state () ou que le service n'est pas valide en raison d'une perte de connexion avec le périphérique.
QLowEnergyService::CharacteristicReadError (since Qt 5.5)5Une tentative de lecture d'une valeur caractéristique a échoué. Par exemple, elle peut être déclenchée en réponse à un appel à readCharacteristic().
QLowEnergyService::CharacteristicWriteError2Une tentative d'écriture d'une nouvelle valeur dans une caractéristique a échoué. Par exemple, elle peut être déclenchée lors d'une tentative d'écriture dans une caractéristique en lecture seule.
QLowEnergyService::DescriptorReadError (since Qt 5.5)6Une tentative de lecture d'une valeur de descripteur a échoué. Par exemple, elle peut être déclenchée en réponse à un appel à readDescriptor().
QLowEnergyService::DescriptorWriteError3Une tentative d'écriture d'une nouvelle valeur dans un descripteur a échoué. Par exemple, elle peut être déclenchée lors d'une tentative d'écriture dans un descripteur en lecture seule.
QLowEnergyService::UnknownError (since Qt 5.5)4Une erreur inconnue s'est produite lors de l'interaction avec le service.

enum QLowEnergyService::ServiceState

Cette énumération décrit l'adresse state() de l'objet de service.

ConstanteValeurDescription
QLowEnergyService::InvalidService0Un service peut devenir invalide lorsqu'il perd la connexion avec l'appareil sous-jacent. Même si la connexion est perdue, il conserve ses dernières informations. Un service invalide ne peut plus devenir valide même si la connexion avec l'appareil est rétablie.
QLowEnergyService::RemoteService1Les détails du service doivent encore être découverts en appelant discoverDetails(). Les seuls éléments d'information fiables sont serviceUuid() et serviceName().
QLowEnergyService::RemoteServiceDiscovering2Les détails du service sont en cours de découverte.
QLowEnergyService::RemoteServiceDiscovered3Les détails du service ont été découverts.
QLowEnergyService::LocalService (since Qt 5.7)4Le service est associé à un objet contrôleur dans la base de données peripheral role. Ces objets de service ne changent pas d'état.
QLowEnergyService::DiscoveryRequiredRemoteServiceDéclassé. A été renommé en RemoteService.
QLowEnergyService::DiscoveringServiceRemoteServiceDiscoveringDéclassé. A été renommé en RemoteServiceDiscovering.
QLowEnergyService::ServiceDiscoveredRemoteServiceDiscoveredDéclassé. A été renommé en RemoteServiceDiscovered.

enum QLowEnergyService::ServiceType
flags QLowEnergyService::ServiceTypes

Cette énumération décrit le type de service.

ConstanteValeurDescription du type de service
QLowEnergyService::PrimaryService0x0001Le service est un service de premier niveau/primaire. Si cet indicateur de type n'est pas activé, le service est considéré comme un service secondaire. Chaque service peut être inclus par un autre service indiqué par IncludedService.
QLowEnergyService::IncludedService0x0002Le service est inclus dans un autre service. Sur certaines plates-formes, cet indicateur ne peut pas ê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 OR 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 annonce les modes d'écriture pris en charge via son site properties.

ConstanteValeurDescription du mode d'écriture
QLowEnergyService::WriteWithResponse0Si une caractéristique est écrite à l'aide de ce mode, le périphérique envoie une confirmation d'écriture. Si l'opération est réussie, la confirmation est émise via le signal characteristicWritten(). Dans le cas contraire, le signal CharacteristicWriteError est émis. Une caractéristique doit avoir défini la propriété QLowEnergyCharacteristic::Write pour prendre en charge ce mode d'écriture.
QLowEnergyService::WriteWithoutResponse1Si une caractéristique est écrite en utilisant ce mode, le périphérique distant n'envoie pas de confirmation d'écriture. Le succès de l'opération ne peut pas être déterminé et la charge utile ne doit pas dépasser 20 octets. Une caractéristique doit avoir défini la propriété QLowEnergyCharacteristic::WriteNoResponse pour prendre en charge ce mode d'écriture. L'avantage est que l'opération d'écriture est plus rapide car elle peut se produire entre d'autres interactions avec le dispositif.
QLowEnergyService::WriteSigned (since Qt 5.7)2Si une caractéristique est écrite en utilisant ce mode, le périphérique distant n'envoie pas de confirmation d'écriture. Le succès de l'opération ne peut pas être déterminé et la charge utile ne doit pas dépasser 8 octets. Un lien doit exister entre les deux périphériques et la liaison ne doit pas être cryptée. Une caractéristique doit avoir défini la propriété QLowEnergyCharacteristic::WriteSigned pour prendre en charge ce mode d'écriture. Cette valeur n'est actuellement prise en charge que sur Android et sur Linux avec BlueZ 5 et une version du noyau 3.7 ou plus récente.

Documentation des fonctions membres

[virtual noexcept] QLowEnergyService::~QLowEnergyService()

Détruit l'instance 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 fonction 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é joue le rôle de 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 changement doivent avoir été activées via le descripteur ClientCharacteristicConfiguration de la caractéristique avant l'événement de changement sur le périphérique. Pour plus de détails sur la manière de procéder, voir above.

Si le contrôleur joue le rôle de peripheral, c'est-à-dire que 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 demande ou d'une commande d'écriture.

Le paramètre newValue contient la valeur actualisée de la caractéristique characteristic.

[signal] void QLowEnergyService::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value)

Ce signal est émis lorsque la demande de lecture de characteristic a renvoyé avec succès son value. Le signal peut être déclenché par l'appel de characteristicRead(). Si l'opération de lecture n'aboutit pas, le signal errorOccurred() est émis en utilisant l'indicateur CharacteristicReadError.

Remarque : ce signal n'est émis que dans 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 est modifiée avec succès en newValue. La modification doit avoir été déclenchée par l'appel à writeCharacteristic(). Si l'opération d'écriture n'aboutit pas, le signal errorOccurred() est émis en utilisant l'indicateur CharacteristicWriteError.

La réception du signal d'écriture peut être considérée comme un signe que le dispositif cible a reçu la valeur à écrire et renvoie l'état de la demande d'écriture.

Remarque : si writeCharacteristic() est appelé en mode WriteWithoutResponse, ce signal et errorOccurred() ne sont jamais émis.

Remarque : ce signal n'est émis que dans les cas d'utilisation liés au rôle central.

Voir aussi writeCharacteristic().

QList<QLowEnergyCharacteristic> QLowEnergyService::characteristics() const

Renvoie toutes les caractéristiques associées à cette instance QLowEnergyService.

La liste renvoyée est vide si la fonction discoverDetails() de cette instance de service n'a pas encore été appelée ou s'il n'y a pas de caractéristiques connues.

Voir aussi characteristic(), state() et discoverDetails().

bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) const

Renvoie true si characteristic appartient à ce service, sinon false.

Une caractéristique appartient à un service si characteristics() contient le characteristic.

bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const

Renvoie true si descriptor appartient à ce service, sinon false.

[signal] void QLowEnergyService::descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value)

Ce signal est émis lorsque la demande de lecture de descriptor a renvoyé avec succès son value. Le signal peut être déclenché en appelant le descripteurRead(). Si l'opération de lecture n'aboutit pas, le signal errorOccurred() est émis en utilisant l'indicateur DescriptorReadError.

Remarque : ce signal n'est émis que dans 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 est modifiée avec succès en newValue. Si l'objet contrôleur associé joue le rôle de central, la modification doit avoir été provoquée par l'appel à writeDescriptor(). Sinon, le signal est le résultat d'une demande ou d'une commande d'écriture d'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, des caractéristiques et des descripteurs associés.

Le processus de découverte est indiqué par le signal stateChanged(). Après sa création, le service est dans l'état DiscoveryRequired. Lorsqu'il appelle 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, un FullDiscovery ou un SkipValueDiscovery est exécuté. Dans tous les cas, tous les services et caractéristiques sont découverts. Un FullDiscovery procède à la lecture de toutes les valeurs de caractéristique et de tous les descripteurs. Un SkipValueDiscovery ne lit pas les valeurs de caractéristiques et les descripteurs. Un SkipValueDiscovery présente deux avantages. Premièrement, il est plus rapide. Deuxièmement, il contourne les bogues de certains appareils qui annoncent à tort que les caractéristiques ou les descripteurs sont lisibles, mais qui n'autorisent pas la lecture sur ces derniers. Cela peut entraîner un comportement imprévisible. Après un SkipValueDiscovery, il est nécessaire d'appeler readCharacteristic() / readDescriptor() et d'attendre qu'ils 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 aussi state().

QLowEnergyService::ServiceError QLowEnergyService::error() const

Renvoie la dernière erreur survenue ou 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 qui sont inclus dans le service actuel.

La liste renvoyée est vide si la fonction discoverDetails() de cette instance de service n'a pas encore été appelée ou s'il n'y a pas de caractéristiques connues.

Il est possible qu'un service inclus contienne encore un autre service. Ces inclusions de second niveau doivent être obtenues via l'instance de premier niveau correspondante QLowEnergyService. Techniquement, cela pourrait créer une dépendance circulaire.

QLowEnergyController::createServiceObject() doit être utilisé pour obtenir des instances de service pour chacun des UUID.

Voir également createServiceObject().

void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &characteristic)

Lit la valeur de characteristic. Si l'opération est réussie, le signal characteristicRead() est émis ; sinon, le signal CharacteristicReadError est activé. En général, un characteristic est lisible si sa propriété QLowEnergyCharacteristic::Read est activée.

Toutes les demandes de descripteurs et de caractéristiques vers le même dispositif distant sont sérialisées. Une file d'attente est utilisée lorsque plusieurs demandes sont émises simultanément. La file d'attente n'élimine pas les demandes de lecture en double pour la même caractéristique.

Une caractéristique ne peut être lue que si le service est dans l'état ServiceDiscovered et appartient au service. Si l'une de ces conditions n'est pas vraie, QLowEnergyService::OperationError est activé.

Remarque : L'appel à cette fonction alors que 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, CharacteristicReadError est activé.

Voir également characteristicRead() et writeCharacteristic().

void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor)

Lit la valeur de descriptor. Si l'opération est réussie, le signal descriptorRead() est émis ; dans le cas contraire, le signal DescriptorReadError est activé.

Toutes les demandes de descripteurs et de caractéristiques vers le même dispositif distant sont sérialisées. Une file d'attente est utilisée lorsque plusieurs demandes sont émises en même temps. La file d'attente n'élimine pas les demandes de lecture en double pour le même descripteur.

Un descripteur ne peut être lu que si le service est dans l'état ServiceDiscovered et que le descripteur appartient au service. Si l'une de ces conditions n'est pas remplie, l'état QLowEnergyService::OperationError est activé.

Voir aussi descriptorRead() et writeDescriptor().

QString QLowEnergyService::serviceName() const

Renvoie le nom du service, sinon une chaîne vide.

Le nom retourné ne peut être récupéré que si serviceUuid() est un UUID 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 du périphérique 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 égal à celui des instances déjà existantes.

Un service devient invalide si le site QLowEnergyController se déconnecte de l'appareil distant. Un service non valide conserve son état interne au moment de l'événement de déconnexion. Cela signifie qu'une fois que les détails du service sont découverts, ils peuvent même être récupérés à partir d'un service non valide. Cela permet des scénarios dans lesquels la connexion du dispositif est établie, les détails du service sont récupérés et le dispositif est immédiatement déconnecté pour permettre au dispositif suivant de se connecter au dispositif périphérique.

Toutefois, dans des circonstances normales, la connexion doit être maintenue pour éviter la 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 aux notifications de changement en cours.

Voir aussi stateChanged().

[signal] void QLowEnergyService::stateChanged(QLowEnergyService::ServiceState newState)

Ce signal est émis lorsque l'état du service change. L'adresse newState peut également être récupérée via state().

Voir aussi state().

QLowEnergyService::ServiceTypes QLowEnergyService::type() const

Renvoie le type du service.

Note : L'attribut type ne peut pas être utilisé tant que le service n'a pas atteint l'état ServiceDiscovered. Ce champ est initialisé avec PrimaryService.

Note : Sur Android, il n'est pas possible de déterminer si un service est un service primaire 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 pour le champ characteristic. La sémantique exacte dépend du rôle de l'objet contrôleur associé.

Rôle central

L'appel se traduit par une demande ou une commande d'écriture à un périphérique distant. Si l'opération réussit, le signal characteristicWritten() est émis ; sinon, le signal CharacteristicWriteError est activé. L'appel de cette fonction ne déclenche pas le signal characteristicChanged(), sauf si le périphérique lui-même modifie à nouveau la valeur après la demande d'écriture en cours.

Le paramètre mode détermine si le périphérique doit envoyer une confirmation d'écriture. Le périphérique à écrire characteristic doit prendre en charge le mode d'écriture correspondant. 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 demandes d'écriture de descripteurs et de caractéristiques vers le même dispositif distant sont sérialisées. Une file d'attente est utilisée lorsque plusieurs demandes d'écriture sont émises simultanément. La file d'attente n'élimine pas les demandes d'écriture en double pour la même caractéristique. Par exemple, si le même descripteur est défini sur la valeur A et immédiatement après sur B, les deux demandes d'écriture sont exécutées dans l'ordre donné.

Note : Actuellement, 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 dans l'état ServiceDiscovered et appartient au service. Si l'une de ces conditions n'est pas vraie, l'adresse QLowEnergyService::OperationError est définie.

Remarque : l'appel à cette fonction malgré le fait que 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 WriteWithResponse. Si le matériel renvoie une erreur, l'adresse CharacteristicWriteError est activée.

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é des notifications ou des indications pour la caractéristique, les informations correspondantes seront envoyées. Si un dispositif a activé les notifications ou les indications pour la caractéristique et que ce dispositif n'est pas actuellement connecté, mais qu'un lien existe entre lui et le dispositif local, 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 newValue 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 pour descriptor. La sémantique exacte dépend du rôle de l'objet contrôleur associé.

Rôle central

Un appel à cette fonction entraîne une demande d'écriture au dispositif distant. Si l'opération réussit, le signal descriptorWritten() est émis ; sinon, le signal DescriptorWriteError est émis.

Toutes les demandes de descripteurs et de caractéristiques vers le même dispositif distant sont sérialisées. Une file d'attente est utilisée lorsque plusieurs demandes d'écriture sont émises simultanément. La file d'attente n'élimine pas les demandes d'écriture en double pour le même descripteur. Par exemple, si le même descripteur est mis à la valeur A et immédiatement après à la valeur B, les deux demandes d'écriture sont exécutées dans l'ordre donné.

Un descripteur ne peut être écrit que si ce service est dans l'état ServiceDiscovered, appartient au service. Si l'une de ces conditions n'est pas remplie, l'adresse QLowEnergyService::OperationError est définie.

Rôle périphérique

La valeur est écrite dans la base de données du service local. 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.