QLowEnergyService Class
Die Klasse „QLowEnergyService“ repräsentiert einen einzelnen Dienst auf einem Bluetooth-Low-Energy-Gerät. Mehr...
| Header: | #include <QLowEnergyService> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Bluetooth) target_link_libraries(mytarget PRIVATE Qt6::Bluetooth) |
| qmake: | QT += bluetooth |
| Erbt von: | QObject |
Öffentliche Typen
(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 } |
Öffentliche Funktionen
| 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) |
Signale
| 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) |
Ausführliche Beschreibung
QLowEnergyService bietet Zugriff auf die Details von Bluetooth-Low-Energy-Diensten. Die Klasse erleichtert das Erkennen und Veröffentlichen von Dienstdetails, ermöglicht das Lesen und Schreiben der enthaltenen Daten und benachrichtigt bei Datenänderungen.
Dienststruktur
Ein Bluetooth-Low-Energy-Peripheriegerät kann mehrere Dienste enthalten. Jeder Dienst kann wiederum weitere Dienste umfassen. Diese Klasse repräsentiert einen einzelnen Dienst des Peripheriegeräts und wird über ` QLowEnergyController::createServiceObject()` erstellt. Die Methode ` type()` gibt an, ob es sich bei diesem Dienst um einen primären (Top-Level-)Dienst handelt oder ob der Dienst Teil eines anderen Dienstes ist. Jeder Dienst kann eine oder mehrere Eigenschaften enthalten, und jede Eigenschaft kann Deskriptoren enthalten. Die resultierende Struktur kann wie im folgenden Diagramm dargestellt aussehen:

Ein Merkmal ist der wichtigste Informationsträger. Es verfügt über einen „ value “ () und einen „ properties “ (), die die Zugriffsberechtigungen für den Wert beschreiben. Der allgemeine Zweck des enthaltenen Deskriptors besteht darin, die Beschaffenheit des Merkmals näher zu definieren. So kann er beispielsweise festlegen, wie der Wert interpretiert werden soll oder ob er den Wertverbraucher über Wertänderungen benachrichtigen kann.
Dienstinteraktion
Sobald ein Serviceobjekt zum ersten Mal erstellt wurde, müssen seine Details erst noch ermittelt werden. Dies wird dadurch angezeigt, dass sein aktueller state() den Wert DiscoveryRequired hat. Es ist nur möglich, die serviceUuid() und serviceName() abzurufen.
Die Ermittlung der enthaltenen Dienste, Merkmale und Deskriptoren wird durch den Aufruf von ` discoverDetails()` ausgelöst. Während der Ermittlung wechselt der Status ` state()` von ` DiscoveryRequired ` über ` DiscoveringService ` zu seinem endgültigen Status ` ServiceDiscovered `. Dieser Übergang wird über das Signal ` stateChanged()` bekannt gegeben. Sobald die Details bekannt sind, sind alle enthaltenen Merkmale, Deskriptoren und Dienste bekannt und können gelesen oder geschrieben werden.
Die Werte von Merkmalen und Deskriptoren können über „ QLowEnergyCharacteristic “ bzw. „ QLowEnergyDescriptor “ abgerufen werden. Das direkte Lesen oder Schreiben dieser Attribute erfordert jedoch das Serviceobjekt. Die Funktion „ readCharacteristic()“ versucht, den Wert eines Merkmals erneut zu lesen. Auch wenn bei der anfänglichen Serviceerkennung möglicherweise bereits ein Wert ermittelt wurde, kann dieser Aufruf in Fällen erforderlich sein, in denen sich der Merkmalswert ständig ändert, ohne dass Benachrichtigungen bereitgestellt werden. Ein Beispiel hierfür wäre eine Zeitkennzahl, die einen kontinuierlichen Wert liefert. Ist der Leseversuch erfolgreich, wird das Signal „ characteristicRead()“ ausgelöst. Schlägt das Lesen des Werts fehl, wird das Signal „ CharacteristicReadError “ ausgelöst. Die Funktion „ writeCharacteristic()“ versucht, einen neuen Wert in die angegebene Kennzahl zu schreiben. Ist der Schreibversuch erfolgreich, wird das Signal „ characteristicWritten()“ ausgelöst. Ein Fehler beim Schreiben löst das Signal „ CharacteristicWriteError “ aus. Das Lesen und Schreiben von Deskriptoren folgt dem gleichen Muster.
Jeder Versuch zielt darauf ab, den Wert eines Deskriptors oder einer Eigenschaft auf der Hardware zu lesen oder zu schreiben. Das bedeutet, dass Metainformationen wie ` QLowEnergyCharacteristic::properties()` beim Lesen und Schreiben im Allgemeinen ignoriert werden. So ist es beispielsweise möglich, ` writeCharacteristic()` aufzurufen, obwohl die Eigenschaft laut ihrer Metadatenbeschreibung schreibgeschützt ist. Die resultierende Schreibanforderung wird an das angeschlossene Gerät weitergeleitet, und es liegt im Ermessen des Geräts, auf die potenziell ungültige Anforderung zu reagieren. In diesem Fall wird als Reaktion auf den zurückgegebenen Gerätefehler der Fehler „ CharacteristicWriteError “ ausgegeben. Dieses Verhalten vereinfacht die Interaktion mit Geräten, die falsche Metainformationen melden. Konnte die Anforderung nicht an das Remote-Gerät weitergeleitet werden, wird der Fehler „ OperationError “ gesetzt. Ein möglicher Grund könnte sein, dass das zu schreibende Merkmalobjekt gar nicht zum aktuellen Dienst gehört. Zusammenfassend ermöglichen die beiden Fehlertypen eine schnelle Unterscheidung zwischen lokalen und entfernten Fehlerfällen.
Alle Anfragen werden nach dem First-In-First-Out-Prinzip serialisiert. Wird beispielsweise eine zweite Schreibanfrage gesendet, bevor die vorherige Schreibanfrage abgeschlossen ist, wird diese so lange verzögert, bis die erste Schreibanfrage abgeschlossen ist.
Hinweis: Derzeit ist es nicht möglich, signierte Schreib- oder zuverlässige Schreibanfragen zu senden.
In einigen Fällen generiert das Peripheriegerät Wertaktualisierungen, an deren Empfang die Zentrale interessiert ist. Damit eine Eigenschaft solche Benachrichtigungen unterstützt, muss sie über die Eigenschaft „ QLowEnergyCharacteristic::Notify “ oder „ QLowEnergyCharacteristic::Indicate “ sowie einen Deskriptor vom Typ „ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration “ verfügen. Sofern diese Bedingungen erfüllt sind, können Benachrichtigungen wie im folgenden Codeausschnitt gezeigt aktiviert werden:
//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 writeDas Beispiel zeigt eine Kennlinie für den Akkustand, die die Zentrale bei jeder Wertänderung aktualisiert. Die Benachrichtigungen erfolgen über das Signal „ characteristicChanged()“. Weitere Details zu diesem Mechanismus finden Sie in der Bluetooth-Spezifikation.
Gemeinsame Nutzung von Dienstdaten
Jede `QLowEnergyService`-Instanz teilt ihre internen Zustände und Informationen mit anderen `QLowEnergyService`-Instanzen desselben Dienstes. Wenn eine Instanz die Ermittlung der Dienstdetails initiiert, folgen alle übrigen Instanzen automatisch. Daher funktioniert der folgende Codeausschnitt immer:
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());Andere Operationen wie Aufrufe von ` readCharacteristic()`, ` readDescriptor()`, ` writeCharacteristic()`, ` writeDescriptor()` oder die Invalidierung des Dienstes aufgrund der Trennung des zugehörigen ` QLowEnergyController ` vom Gerät werden auf dieselbe Weise geteilt.
Siehe auch QLowEnergyController, QLowEnergyCharacteristic und QLowEnergyDescriptor.
Dokumentation zu Mitgliedstypen
[since 6.2] enum QLowEnergyService::DiscoveryMode
Diese Enumeration listet die Modi der Diensterkennung auf. Alle Modi ermitteln die Merkmale des Dienstes sowie die Deskriptoren dieser Merkmale. Die Modi unterscheiden sich darin, ob Merkmalswerte und Deskriptoren gelesen werden.
| Konstante | Wert | Beschreibung |
|---|---|---|
QLowEnergyService::FullDiscovery | 0 | Bei einer vollständigen Erkennung werden alle Merkmale erkannt. Alle Merkmalswerte und Deskriptoren werden gelesen. |
QLowEnergyService::SkipValueDiscovery | 1 | Bei einer minimalen Erkennung werden alle Merkmale erkannt. Merkmalswerte und Deskriptoren werden nicht gelesen. |
Diese Enumeration wurde in Qt 6.2 eingeführt.
Siehe auch „ discoverDetails()“.
enum QLowEnergyService::ServiceError
Diese Enumeration beschreibt alle möglichen Fehlerzustände während der Laufzeit des Dienstes. Die Funktion „ error()“ gibt den zuletzt aufgetretenen Fehler zurück.
| Konstante | Wert | Beschreibung |
|---|---|---|
QLowEnergyService::NoError | 0 | Es ist kein Fehler aufgetreten. |
QLowEnergyService::OperationError | 1 | Es wurde eine Operation versucht, während der Dienst noch nicht bereit war. Ein Beispiel hierfür wäre der Versuch, in den Dienst zu schreiben, während dieser sich noch nicht im Zustand „ ServiceDiscovered “ state() befand, oder der Dienst ist aufgrund eines Verbindungsverlusts zum Peripheriegerät ungültig. |
QLowEnergyService::CharacteristicReadError (since Qt 5.5) | 5 | Ein Versuch, einen Merkmalswert zu lesen, ist fehlgeschlagen. Dies kann beispielsweise als Reaktion auf einen Aufruf von ` readCharacteristic()` ausgelöst werden. |
QLowEnergyService::CharacteristicWriteError | 2 | Ein Versuch, einen neuen Wert in eine Eigenschaft zu schreiben, ist fehlgeschlagen. Dies kann beispielsweise beim Versuch ausgelöst werden, in eine schreibgeschützte Eigenschaft zu schreiben. |
QLowEnergyService::DescriptorReadError (since Qt 5.5) | 6 | Ein Versuch, einen Deskriptorwert zu lesen, ist fehlgeschlagen. Dies kann beispielsweise als Reaktion auf einen Aufruf von ` readDescriptor()` ausgelöst werden. |
QLowEnergyService::DescriptorWriteError | 3 | Ein Versuch, einen neuen Wert in einen Deskriptor zu schreiben, ist fehlgeschlagen. Dies kann beispielsweise ausgelöst werden, wenn versucht wird, in einen schreibgeschützten Deskriptor zu schreiben. |
QLowEnergyService::UnknownError (since Qt 5.5) | 4 | Bei der Interaktion mit dem Dienst ist ein unbekannter Fehler aufgetreten. |
enum QLowEnergyService::ServiceState
Diese Enumeration beschreibt die „ state()“ des Service-Objekts.
| Konstante | Wert | Beschreibung |
|---|---|---|
QLowEnergyService::InvalidService | 0 | Ein Dienst kann ungültig werden, wenn die Verbindung zum zugrunde liegenden Gerät unterbrochen wird. Auch wenn die Verbindung unterbrochen ist, behält er seine letzten Informationen bei. Ein ungültiger Dienst kann nicht mehr gültig werden, selbst wenn die Verbindung zum Gerät wiederhergestellt wird. |
QLowEnergyService::RemoteService | 1 | Die Dienstdetails müssen noch durch den Aufruf von ` discoverDetails()` ermittelt werden. Die einzigen verlässlichen Informationen sind die ` serviceUuid()` und die ` serviceName()`. |
QLowEnergyService::RemoteServiceDiscovering | 2 | Die Dienstdetails werden gerade ermittelt. |
QLowEnergyService::RemoteServiceDiscovered | 3 | Die Dienstdetails wurden ermittelt. |
QLowEnergyService::LocalService (since Qt 5.7) | 4 | Der Dienst ist mit einem Controller-Objekt im „ peripheral role “ verknüpft. Der Status solcher Dienstobjekte ändert sich nicht. |
QLowEnergyService::DiscoveryRequired | RemoteService | Veraltet. Wurde in „RemoteService“ umbenannt. |
QLowEnergyService::DiscoveringService | RemoteServiceDiscovering | Veraltet. Wurde in „RemoteServiceDiscovering“ umbenannt. |
QLowEnergyService::ServiceDiscovered | RemoteServiceDiscovered | Veraltet. Wurde in „RemoteServiceDiscovered“ umbenannt. |
enum QLowEnergyService::ServiceType
flags QLowEnergyService::ServiceTypes
Diese Enumeration beschreibt den Typ des Dienstes.
| Konstante | Wert | Beschreibung |
|---|---|---|
QLowEnergyService::PrimaryService | 0x0001 | Der Dienst ist ein Dienst der obersten Ebene/Primärdienst. Ist dieses Typ-Flag nicht gesetzt, wird der Dienst als Sekundärdienst betrachtet. Jeder Dienst kann von einem anderen Dienst eingebunden sein, was durch „IncludedService“ angegeben wird. |
QLowEnergyService::IncludedService | 0x0002 | Der Dienst wird von einem anderen Dienst eingebunden. Auf einigen Plattformen kann dieses Flag erst ermittelt werden, wenn der Dienst, der den aktuellen Dienst einbindet, erkannt wurde. |
Der Typ „ServiceTypes“ ist eine Typdefinition für „QFlags<ServiceType>“. Er speichert eine ODER-Kombination von „ServiceType“-Werten.
enum QLowEnergyService::WriteMode
Diese Enumeration beschreibt den Modus, der beim Schreiben eines Merkmalswerts verwendet werden soll. Das Merkmal gibt die unterstützten Schreibmodi über seine „ properties “ an.
| Konstante | Wert | Beschreibung |
|---|---|---|
QLowEnergyService::WriteWithResponse | 0 | Wird ein Merkmal in diesem Modus geschrieben, muss das Peripheriegerät eine Schreibbestätigung senden. Ist der Vorgang erfolgreich, wird die Bestätigung über das Signal „ characteristicWritten()“ ausgegeben. Andernfalls wird die „ CharacteristicWriteError “ ausgegeben. Ein Merkmal muss die Eigenschaft „ QLowEnergyCharacteristic::Write “ gesetzt haben, um diesen Schreibmodus zu unterstützen. |
QLowEnergyService::WriteWithoutResponse | 1 | Wird ein Merkmal in diesem Modus beschrieben, darf das entfernte Peripheriegerät keine Schreibbestätigung senden. Der Erfolg des Vorgangs kann nicht festgestellt werden, und die Nutzlast darf nicht länger als 20 Byte sein. Ein Merkmal muss die Eigenschaft „ QLowEnergyCharacteristic::WriteNoResponse “ gesetzt haben, um diesen Schreibmodus zu unterstützen. Der Vorteil besteht in einem schnelleren Schreibvorgang, da dieser zwischen anderen Geräteinteraktionen stattfinden kann. |
QLowEnergyService::WriteSigned (since Qt 5.7) | 2 | Wird ein Merkmal in diesem Modus geschrieben, darf das entfernte Peripheriegerät keine Schreibbestätigung senden. Der Erfolg des Vorgangs kann nicht festgestellt werden, und die Nutzdaten dürfen nicht länger als 8 Byte sein. Zwischen den beiden Geräten muss eine Verbindung bestehen, und die Verbindung darf nicht verschlüsselt sein. Eine Eigenschaft muss die Eigenschaft „ QLowEnergyCharacteristic::WriteSigned “ gesetzt haben, um diesen Schreibmodus zu unterstützen. Dieser Wert wird derzeit nur unter Android und unter Linux mit BlueZ 5 und einer Kernel-Version 3.7 oder neuer unterstützt. |
Dokumentation der Member-Funktionen
[virtual noexcept] QLowEnergyService::~QLowEnergyService()
Löscht die Instanz „ QLowEnergyService “.
QLowEnergyCharacteristic QLowEnergyService::characteristic(const QBluetoothUuid &uuid) const
Gibt das passende Merkmal für „ uuid “ zurück; andernfalls ein ungültiges Merkmal.
Das zurückgegebene Merkmal ist ungültig, wenn die Methode ` discoverDetails()` dieser Service-Instanz noch nicht aufgerufen wurde oder es keine Merkmale mit dem passenden ` uuid` gibt.
Siehe auch ` characteristics()`.
[signal] void QLowEnergyService::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
Befindet sich das zugehörige Controller-Objekt in der Rolle „ central “, wird dieses Signal ausgegeben, wenn der Wert von „ characteristic “ durch ein Ereignis auf der Peripherie-/Geräteseite geändert wird. In diesem Fall bedeutet die Signalausgabe, dass Änderungsbenachrichtigungen über den Deskriptor „ ClientCharacteristicConfiguration “ der Eigenschaft vor dem Änderungsereignis auf der Peripherie aktiviert worden sein müssen. Weitere Details dazu finden Sie unter above.
Befindet sich der Controller in der Rolle „ peripheral “, d. h., wurde das Serviceobjekt über „ QLowEnergyController::addService “ erstellt, wird das Signal ausgesendet, wenn ein GATT-Client den Wert des Merkmals mithilfe einer Schreibanforderung oder eines Befehls geschrieben hat.
Der Parameter „ newValue “ enthält den aktualisierten Wert von „ characteristic “.
[signal] void QLowEnergyService::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value)
Dieses Signal wird ausgelöst, wenn die Leseanforderung für „ characteristic “ erfolgreich die „ value “ zurückgegeben hat. Das Signal kann durch den Aufruf von „characteristicRead()“ ausgelöst werden. Ist der Lesevorgang nicht erfolgreich, wird das Signal „ errorOccurred()“ unter Verwendung des Flags „ CharacteristicReadError “ ausgelöst.
Hinweis: Dieses Signal wird nur für Anwendungsfälle im Zusammenhang mit der Central Role ausgegeben.
Siehe auch ` readCharacteristic()`.
[signal] void QLowEnergyService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
Dieses Signal wird ausgelöst, wenn der Wert von „ characteristic “ erfolgreich in „ newValue “ geändert wurde. Die Änderung muss durch den Aufruf von „ writeCharacteristic()“ ausgelöst worden sein. Wenn der Schreibvorgang nicht erfolgreich ist, wird das Signal „ errorOccurred()“ unter Verwendung des Flags „ CharacteristicWriteError “ ausgelöst.
Der Empfang des „written“-Signals kann als Zeichen dafür gewertet werden, dass das Zielgerät den zu schreibenden Wert empfangen hat und den Status der Schreibanforderung zurückmeldet.
Hinweis: Wird „ writeCharacteristic()“ im Modus „ WriteWithoutResponse “ aufgerufen, werden dieses Signal und das Signal „ errorOccurred()“ niemals ausgelöst.
Hinweis: Dieses Signal wird nur bei Anwendungsfällen im Zusammenhang mit der zentralen Rolle ausgegeben.
Siehe auch ` writeCharacteristic()`.
QList<QLowEnergyCharacteristic> QLowEnergyService::characteristics() const
Gibt alle Merkmale zurück, die dieser „ QLowEnergyService “-Instanz zugeordnet sind.
Die zurückgegebene Liste ist leer, wenn die Methode „ discoverDetails()“ dieser Service-Instanz noch nicht aufgerufen wurde oder keine Merkmale bekannt sind.
Siehe auch „ characteristic()“, „ state()“ und „ discoverDetails()“.
bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) const
Gibt „ true “ zurück, wenn „ characteristic “ zu diesem Dienst gehört; andernfalls „ false “.
Ein Merkmal gehört zu einem Service, wenn characteristics() die characteristic enthält.
bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const
Gibt „ true “ zurück, wenn „ descriptor “ zu diesem Dienst gehört; andernfalls „ false “.
[signal] void QLowEnergyService::descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value)
Dieses Signal wird ausgelöst, wenn die Leseanforderung für „ descriptor “ erfolgreich den Wert „ value “ zurückgegeben hat. Das Signal kann durch den Aufruf von „descriptorRead()“ ausgelöst werden. Wenn der Lesevorgang nicht erfolgreich ist, wird das Signal „ errorOccurred()“ unter Verwendung des Flags „ DescriptorReadError “ ausgelöst.
Hinweis: Dieses Signal wird nur für Anwendungsfälle im Zusammenhang mit der zentralen Rolle ausgegeben.
Siehe auch ` readDescriptor()`.
[signal] void QLowEnergyService::descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
Dieses Signal wird ausgelöst, wenn der Wert von „ descriptor “ erfolgreich in „ newValue “ geändert wurde. Befindet sich das zugehörige Controller-Objekt in der Rolle „ central “, muss die Änderung durch den Aufruf von „ writeDescriptor()“ verursacht worden sein. Andernfalls ist das Signal das Ergebnis einer Schreibanforderung oder eines Befehls eines GATT-Clients an den jeweiligen Deskriptor.
Siehe auch writeDescriptor().
void QLowEnergyService::discoverDetails(QLowEnergyService::DiscoveryMode mode = FullDiscovery)
Leitet die Erkennung der im Dienst enthaltenen Dienste, Eigenschaften und der zugehörigen Deskriptoren ein.
Der Erkennungsprozess wird über das Signal „ stateChanged()“ angezeigt. Nach der Erstellung befindet sich der Dienst im Zustand „ DiscoveryRequired “. Beim Aufruf von „discoverDetails()“ wechselt er in den Zustand „ DiscoveringService “. Nach Abschluss der Detailerkennung wechselt er in den Zustand „ ServiceDiscovered “. Bei jedem Übergang wird das Signal „ stateChanged()“ ausgegeben. Je nach dem Argument „ mode “ wird eine „ FullDiscovery “ oder eine „ SkipValueDiscovery “ durchgeführt. In jedem Fall werden alle Dienste und Merkmale erkannt. Ein „ FullDiscovery “ wird ausgeführt und liest alle Merkmalswerte und Deskriptoren ein. Ein „ SkipValueDiscovery “ liest keine Merkmalswerte und Deskriptoren ein. Ein „ SkipValueDiscovery “ hat zwei Vorteile. Erstens ist er schneller. Zweitens umgeht er Fehler bei einigen Geräten, die Eigenschaften oder Deskriptoren fälschlicherweise als lesbar kennzeichnen, das Lesen dieser Werte jedoch nicht zulassen. Dies kann zu unvorhersehbarem Verhalten führen. Nach einem „ SkipValueDiscovery “ ist es erforderlich, „ readCharacteristic()“ bzw. „ readDescriptor()“ aufzurufen und abzuwarten, bis diese erfolgreich abgeschlossen sind, bevor auf den Wert einer Eigenschaft oder eines Deskriptors zugegriffen wird.
Das Argument „ mode “ wurde in Qt 6.2 eingeführt.
Siehe auch ` state()`.
QLowEnergyService::ServiceError QLowEnergyService::error() const
Gibt den zuletzt aufgetretenen Fehler oder „ NoError “ zurück.
[signal, since 6.2] void QLowEnergyService::errorOccurred(QLowEnergyService::ServiceError newError)
Dieses Signal wird ausgelöst, wenn ein Fehler auftritt. Der Parameter „ newError “ beschreibt den aufgetretenen Fehler.
Diese Funktion wurde in Qt 6.2 eingeführt.
QList<QBluetoothUuid> QLowEnergyService::includedServices() const
Gibt die UUIDs aller Dienste zurück, die vom aktuellen Dienst einbezogen werden.
Die zurückgegebene Liste ist leer, wenn die Methode ` discoverDetails()` dieser Dienstinstanz noch nicht aufgerufen wurde oder keine Merkmale bekannt sind.
Es ist möglich, dass ein eingebundener Dienst einen weiteren Dienst enthält. Solche Einbindungen der zweiten Ebene müssen über die entsprechende ` QLowEnergyService `-Instanz der ersten Ebene abgerufen werden. Technisch gesehen könnte dies zu einer zirkulären Abhängigkeit führen.
QLowEnergyController::createServiceObject() sollte verwendet werden, um Dienstinstanzen für jede der UUIDs abzurufen.
Siehe auch ` createServiceObject()`.
void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &characteristic)
Liest den Wert von „ characteristic “. Bei erfolgreichem Abschluss des Vorgangs wird das Signal „ characteristicRead()“ ausgesendet; andernfalls wird das Signal „ CharacteristicReadError “ gesetzt. Im Allgemeinen ist ein „ characteristic “ lesbar, wenn seine Eigenschaft „ QLowEnergyCharacteristic::Read “ gesetzt ist.
Alle Deskriptor- und Merkmalsanfragen an dasselbe Remote-Gerät werden serialisiert. Bei der gleichzeitigen Ausgabe mehrerer Anfragen wird eine Warteschlange verwendet. Die Warteschlange verhindert keine doppelten Leseanfragen für dasselbe Merkmal.
Eine Eigenschaft kann nur gelesen werden, wenn sich der Dienst im Status „ ServiceDiscovered “ befindet und zu diesem Dienst gehört. Ist eine dieser Bedingungen nicht erfüllt, wird „ QLowEnergyService::OperationError “ gesetzt.
Hinweis: Wird diese Funktionaufgerufen , obwohl „ QLowEnergyCharacteristic::properties()“ eine nicht lesbare Eigenschaft meldet, wird immer versucht, den Wert der Eigenschaft auf der Hardware auszulesen. Gibt die Hardware einen Fehler zurück, wird der Status „ CharacteristicReadError “ gesetzt.
Siehe auch „ characteristicRead()“ und „ writeCharacteristic()“.
void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor)
Liest den Wert von „ descriptor “. Bei erfolgreichem Ablauf wird das Signal „ descriptorRead()“ ausgelöst; andernfalls wird „ DescriptorReadError “ gesetzt.
Alle Deskriptor- und Merkmalsanfragen an dasselbe Remote-Gerät werden serialisiert. Bei der gleichzeitigen Ausgabe mehrerer Anfragen kommt eine Warteschlange zum Einsatz. Die Warteschlange verhindert keine doppelten Leseanfragen für denselben Deskriptor.
Ein Deskriptor kann nur gelesen werden, wenn sich der Dienst im Zustand „ ServiceDiscovered “ befindet und der Deskriptor zu diesem Dienst gehört. Ist eine dieser Bedingungen nicht erfüllt, wird „ QLowEnergyService::OperationError “ gesetzt.
Siehe auch „ descriptorRead()“ und „ writeDescriptor()“.
QString QLowEnergyService::serviceName() const
Gibt den Namen des Dienstes zurück; andernfalls eine leere Zeichenkette.
Der zurückgegebene Name kann nur abgerufen werden, wenn „ serviceUuid()“ eine bekannte UUID ist.
QBluetoothUuid QLowEnergyService::serviceUuid() const
Gibt die UUID des Dienstes zurück; andernfalls eine Null-UUID.
QLowEnergyService::ServiceState QLowEnergyService::state() const
Gibt den aktuellen Zustand des Dienstes zurück.
Wurde der Dienst des Geräts zum ersten Mal instanziiert, lautet der Status des Objekts „ DiscoveryRequired “. Der Status aller Dienstobjekte, die auf denselben Dienst auf dem Peripheriegerät verweisen, ist stets identisch. Dies ist auf die gemeinsame Nutzung der internen Objektdaten zurückzuführen. Daher hat jede nach der ersten erstellte Dienstobjektinstanz denselben Status wie bereits vorhandene Instanzen.
Ein Dienst wird ungültig, wenn das „ QLowEnergyController “ die Verbindung zum Remote-Gerät trennt. Ein ungültiger Dienst behält seinen internen Zustand zum Zeitpunkt des Trennungsereignisses bei. Dies bedeutet, dass die Dienstdetails, sobald sie einmal ermittelt wurden, sogar von einem ungültigen Dienst abgerufen werden können. Dies ermöglicht Szenarien, in denen die Geräteverbindung hergestellt wird, die Dienstdetails abgerufen werden und das Gerät sofort getrennt wird, damit sich das nächste Gerät mit dem Peripheriegerät verbinden kann.
Unter normalen Umständen sollte die Verbindung jedoch bestehen bleiben, um eine wiederholte Erkennung von Diensten und deren Details zu vermeiden. Die Erkennung kann eine Weile dauern, und der Client kann Benachrichtigungen über laufende Änderungen abonnieren.
Siehe auch stateChanged().
[signal] void QLowEnergyService::stateChanged(QLowEnergyService::ServiceState newState)
Dieses Signal wird ausgelöst, wenn sich der Status des Dienstes ändert. Der Status des Dienstes („ newState “) kann auch über die Methode „ state()“ abgerufen werden.
Siehe auch state().
QLowEnergyService::ServiceTypes QLowEnergyService::type() const
Gibt den Typ des Dienstes zurück.
Hinweis: Aufdas Attribut „type“ kann erst vertraut werden, wenn der Dienst den Status „ ServiceDiscovered “ erreicht hat. Dieses Feld wird mit „ PrimaryService “ initialisiert.
Hinweis: Unter Android lässt sich nicht feststellen, ob es sich bei einem Dienst um einen primären oder sekundären Dienst handelt. Daher ist bei allen Diensten das Flag „ PrimaryService “ gesetzt.
void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse)
Schreibt „ newValue “ als Wert für „ characteristic “. Die genaue Semantik hängt von der Rolle ab, in der sich das zugehörige Controller-Objekt befindet.
Zentrale Rolle
Der Aufruf führt zu einer Schreibanforderung oder einem Schreibbefehl an ein entferntes Peripheriegerät. Ist der Vorgang erfolgreich, wird das Signal „ characteristicWritten()“ ausgelöst; andernfalls wird „ CharacteristicWriteError “ gesetzt. Der Aufruf dieser Funktion löst das Signal „ characteristicChanged()“ nicht aus, es sei denn, das Peripheriegerät selbst ändert den Wert nach der aktuellen Schreibanforderung erneut.
Der Parameter „ mode “ legt fest, ob das Remote-Gerät eine Schreibbestätigung senden soll. Das zu beschreibende Merkmal „ characteristic “ muss den entsprechenden Schreibmodus unterstützen. Die vom Merkmal unterstützten Schreibmodi werden durch die Eigenschaften „ QLowEnergyCharacteristic::Write “ und „ QLowEnergyCharacteristic::WriteNoResponse “ angegeben.
Alle Schreibanforderungen für Deskriptoren und Merkmale an dasselbe Remote-Gerät werden serialisiert. Bei der gleichzeitigen Ausgabe mehrerer Schreibanforderungen kommt eine Warteschlange zum Einsatz. Die Warteschlange verhindert keine doppelten Schreibanforderungen für dasselbe Merkmal. Wird beispielsweise derselbe Deskriptor zunächst auf den Wert A und unmittelbar danach auf den Wert B gesetzt, werden die beiden Schreibanforderungen in der angegebenen Reihenfolge ausgeführt.
Hinweis: Derzeit ist es nicht möglich, signierte oder zuverlässige Schreibvorgänge gemäß der Bluetooth-Spezifikation zu verwenden.
Ein Merkmal kann nur geschrieben werden, wenn sich dieser Dienst im Status „ ServiceDiscovered “ befindet und zu dem Dienst gehört. Ist eine dieser Bedingungen nicht erfüllt, wird der Status „ QLowEnergyService::OperationError “ gesetzt.
Hinweis: Der Aufruf dieser Funktion, obwohl „ QLowEnergyCharacteristic::properties()“ eine nicht beschreibbare Eigenschaft meldet, versucht immer, in die Hardware zu schreiben. Ebenso wird ein „ WriteWithoutResponse “ an die Hardware gesendet, obwohl das Merkmal möglicherweise nur „ WriteWithResponse “ unterstützt. Wenn die Hardware einen Fehler zurückgibt, wird der Status „ CharacteristicWriteError “ gesetzt.
Peripherie-Rolle
Der Aufruf führt dazu, dass der Wert des Merkmals in der lokalen Datenbank aktualisiert wird.
Ist derzeit ein Client verbunden und hat dieser Benachrichtigungen oder Anzeigen für das Merkmal aktiviert, werden die entsprechenden Informationen gesendet. Hat ein Gerät Benachrichtigungen oder Anzeigen für das Merkmal aktiviert und ist dieses Gerät derzeit nicht verbunden, besteht jedoch eine Verbindung zwischen ihm und dem lokalen Gerät, wird die Benachrichtigung oder Anzeige bei der nächsten Wiederverbindung gesendet.
Wenn eine Beschränkung hinsichtlich der Länge des Merkmalswerts besteht und „ newValue “ diese Beschränkung nicht einhält, ist das Verhalten nicht spezifiziert.
Hinweis: Das Argument „ mode “ wird im Peripheriemodus ignoriert.
Siehe auch „ QLowEnergyService::characteristicWritten()“ und „ QLowEnergyService::readCharacteristic()“.
void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
Schreibt „ newValue “ als Wert für „ descriptor “. Die genaue Semantik hängt von der Rolle ab, in der sich das zugehörige Controller-Objekt befindet.
Zentrale Rolle
Ein Aufruf dieser Funktion führt zu einer Schreibanforderung an das Remote-Gerät. Ist der Vorgang erfolgreich, wird das Signal „ descriptorWritten()“ ausgelöst; andernfalls wird das Signal „ DescriptorWriteError “ ausgelöst.
Alle Deskriptor- und Merkmalsanfragen an dasselbe Remote-Gerät werden serialisiert. Bei der gleichzeitigen Ausgabe mehrerer Schreibanfragen wird eine Warteschlange verwendet. Die Warteschlange verhindert keine doppelten Schreibanfragen für denselben Deskriptor. Wird beispielsweise derselbe Deskriptor zunächst auf den Wert A und unmittelbar danach auf B gesetzt, werden die beiden Schreibanfragen in der angegebenen Reihenfolge ausgeführt.
Ein Deskriptor kann nur beschrieben werden, wenn sich dieser Dienst im Status „ ServiceDiscovered “ befindet und zum Dienst gehört. Ist eine dieser Bedingungen nicht erfüllt, wird der Status „ QLowEnergyService::OperationError “ gesetzt.
Rolle der Peripherie
Der Wert wird in die lokale Dienstdatenbank geschrieben. Wenn der Inhalt von ` newValue ` für ` descriptor` nicht gültig ist, ist das Verhalten nicht spezifiziert.
Siehe auch descriptorWritten() und 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.