QLowEnergyService Class
Die Klasse QLowEnergyService repräsentiert einen individuellen Dienst auf einem Bluetooth Low Energy Gerät. Mehr...
Header: | #include <QLowEnergyService> |
qmake: | QT += bluetooth |
Inherits: | 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) |
Detaillierte Beschreibung
QLowEnergyService ermöglicht den Zugriff auf die Details von Bluetooth Low Energy Diensten. Die Klasse erleichtert das Auffinden und Veröffentlichen von Dienstdetails, erlaubt das Lesen und Schreiben der enthaltenen Daten und benachrichtigt über Datenänderungen.
Struktur des Dienstes
Ein Bluetooth Low Energy Peripheriegerät kann mehrere Dienste enthalten. Jeder Dienst kann seinerseits weitere Dienste enthalten. Diese Klasse repräsentiert einen einzelnen Dienst des Peripheriegeräts und wird über QLowEnergyController::createServiceObject() erstellt. Das type() zeigt an, ob dieser Dienst ein primärer (Top-Level) Dienst ist oder ob der Dienst Teil eines anderen Dienstes ist. Jeder Dienst kann ein oder mehrere Merkmale enthalten, und jedes Merkmal kann Deskriptoren enthalten. Die resultierende Struktur kann wie das folgende Diagramm aussehen:
Ein Merkmal ist der Hauptinformationsträger. Es hat eine value() und properties(), die die Zugriffsrechte für den Wert beschreiben. Der allgemeine Zweck des enthaltenen Deskriptors besteht darin, die Art des Merkmals näher zu definieren. Er kann zum Beispiel angeben, wie der Wert zu interpretieren ist oder ob er den Wertkonsumenten über Wertänderungen informieren kann.
Dienst Interaktion
Sobald ein Dienstobjekt zum ersten Mal erstellt wurde, müssen seine Details noch entdeckt werden. Dies wird dadurch angezeigt, dass seine aktuelle state() DiscoveryRequired ist. 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 geht state() von DiscoveryRequired über DiscoveringService in seinen endgültigen Zustand ServiceDiscovered über. Dieser Übergang wird über das Signal stateChanged() bekannt gegeben. Sobald die Details bekannt sind, sind alle enthaltenen Merkmale, Deskriptoren und enthaltenen Dienste bekannt und können gelesen oder geschrieben werden.
Die Werte von Merkmalen und Deskriptoren können über QLowEnergyCharacteristic bzw. QLowEnergyDescriptor abgefragt werden. Das direkte Lesen oder Schreiben dieser Attribute erfordert jedoch das Dienstobjekt. Die Funktion readCharacteristic() versucht, den Wert eines Merkmals erneut zu lesen. Obwohl die anfängliche Ermittlung des Dienstes möglicherweise bereits einen Wert erhalten hat, kann dieser Aufruf in Fällen erforderlich sein, in denen sich der Merkmalswert ständig ändert, ohne dass eine Benachrichtigung erfolgt. Ein Beispiel könnte ein Zeitmerkmal sein, das einen kontinuierlichen Wert liefert. Wenn der Leseversuch erfolgreich ist, wird das Signal characteristicRead() ausgegeben. Gelingt es nicht, den Wert zu lesen, wird das Signal CharacteristicReadError ausgelöst. Die Funktion writeCharacteristic() versucht, einen neuen Wert in das angegebene Merkmal zu schreiben. Wenn der Schreibversuch erfolgreich ist, wird das Signal characteristicWritten() ausgegeben. Wenn das Schreiben fehlschlägt, wird das Signal CharacteristicWriteError ausgelöst. Das Lesen und Schreiben von Deskriptoren erfolgt nach demselben Muster.
Jeder Versuch, den Wert eines Deskriptors oder Merkmals auf der Hardware zu lesen oder zu schreiben, wird unternommen. Dies bedeutet, dass Metainformationen wie QLowEnergyCharacteristic::properties() beim Lesen und Schreiben im Allgemeinen ignoriert werden. So ist es zum Beispiel möglich, writeCharacteristic() aufzurufen, obwohl das Merkmal aufgrund seiner Metadatenbeschreibung schreibgeschützt ist. Die daraus resultierende Schreibanforderung wird an das angeschlossene Gerät weitergeleitet, und es ist Sache des Geräts, auf die möglicherweise ungültige Anforderung zu antworten. In diesem Fall ist das Ergebnis das Senden der CharacteristicWriteError als Antwort auf den zurückgegebenen Gerätefehler. Dieses Verhalten vereinfacht die Interaktion mit Geräten, die falsche Metadaten melden. Wenn es nicht möglich war, die Anfrage an das entfernte Gerät weiterzuleiten, wird die OperationError gesetzt. Ein möglicher Grund könnte sein, dass das zu schreibende Merkmalsobjekt gar nicht zum aktuellen Dienst gehört. Zusammengefasst erlauben die beiden Fehlertypen eine schnelle Unterscheidung von lokalen und entfernten Fehlerfällen.
Alle Anfragen werden nach dem First-In-First-Out-Prinzip serialisiert. So wird z.B. die Ausgabe einer zweiten Schreibanforderung, bevor die vorherige Schreibanforderung beendet ist, so lange verzögert, bis die erste Schreibanforderung beendet ist.
Hinweis: Zurzeit ist es nicht möglich, signierte Schreibaufträge oder zuverlässige Schreibaufträge zu senden.
In einigen Fällen erzeugt das Peripheriegerät Wertaktualisierungen, an deren Empfang die Zentrale interessiert ist. Damit ein Merkmal solche Meldungen unterstützen kann, muss es die Eigenschaft QLowEnergyCharacteristic::Notify oder QLowEnergyCharacteristic::Indicate und einen Deskriptor vom Typ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration haben. Wenn diese Bedingungen erfüllt sind, können Benachrichtigungen wie im folgenden Codesegment 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 write
Das Beispiel zeigt ein Batteriestandsmerkmal, das die Zentrale bei jeder Wertänderung aktualisiert. Die Benachrichtigungen werden über das Signal characteristicChanged() bereitgestellt. Weitere Einzelheiten zu diesem Mechanismus sind in der Bluetooth-Spezifikation enthalten.
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 einleitet, folgen alle anderen Instanzen automatisch. Daher funktioniert das folgende Snippet 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 Vorgänge wie Aufrufe von readCharacteristic(), readDescriptor(), writeCharacteristic(), writeDescriptor() oder die Invalidierung des Dienstes aufgrund der Trennung des zugehörigen QLowEnergyController vom Gerät werden auf die gleiche Weise geteilt.
Siehe auch QLowEnergyController, QLowEnergyCharacteristic, und QLowEnergyDescriptor.
Dokumentation der Mitgliedstypen
[since 6.2]
enum QLowEnergyService::DiscoveryMode
Diese Aufzählung listet die Modi zur Ermittlung von Diensten auf. Alle Modi ermitteln die Merkmale des Dienstes und die Deskriptoren der Merkmale. Die Modi unterscheiden sich darin, ob Merkmalswerte und Deskriptoren gelesen werden.
Konstante | Wert | Beschreibung |
---|---|---|
QLowEnergyService::FullDiscovery | 0 | Bei einer vollständigen Ermittlung werden alle Merkmale ermittelt. Alle Merkmalswerte und Deskriptoren werden gelesen. |
QLowEnergyService::SkipValueDiscovery | 1 | Bei einer minimalen Ermittlung werden alle Merkmale ermittelt. Merkmalswerte und Deskriptoren werden nicht gelesen. |
Diese Aufzählung wurde in Qt 6.2 eingeführt.
Siehe auch discoverDetails().
enum QLowEnergyService::ServiceError
Diese Aufzählung beschreibt alle möglichen Fehlerzustände während der Existenz 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 | Eine Operation wurde versucht, während der Dienst nicht bereit war. Ein Beispiel könnte der Versuch sein, in den Dienst zu schreiben, während er sich noch nicht in der ServiceDiscovered state () befand, oder der Dienst ist aufgrund eines Verbindungsverlustes zum Peripheriegerät ungültig. |
QLowEnergyService::CharacteristicReadError (since Qt 5.5) | 5 | Ein Versuch, einen Merkmalswert zu lesen, ist fehlgeschlagen. Er könnte beispielsweise als Reaktion auf einen Aufruf von readCharacteristic() ausgelöst werden. |
QLowEnergyService::CharacteristicWriteError | 2 | Ein Versuch, einen neuen Wert in ein Merkmal zu schreiben, ist fehlgeschlagen. Dies kann z. B. der Fall sein, wenn versucht wird, in ein schreibgeschütztes Merkmal zu schreiben. |
QLowEnergyService::DescriptorReadError (since Qt 5.5) | 6 | Ein Versuch, einen Deskriptorwert zu lesen, ist fehlgeschlagen. Dies kann z. B. als Reaktion auf einen Aufruf von readDescriptor() ausgelöst werden. |
QLowEnergyService::DescriptorWriteError | 3 | Ein Versuch, einen neuen Wert in einen Deskriptor zu schreiben, schlug fehl. Dies kann zum Beispiel beim Versuch, in einen schreibgeschützten Deskriptor zu schreiben, ausgelöst werden. |
QLowEnergyService::UnknownError (since Qt 5.5) | 4 | Bei der Interaktion mit dem Dienst ist ein unbekannter Fehler aufgetreten. |
enum QLowEnergyService::ServiceState
Diese Aufzählung beschreibt die state() des Dienstobjekts.
Konstante | Wert | Beschreibung |
---|---|---|
QLowEnergyService::InvalidService | 0 | Ein Dienst kann ungültig werden, wenn er die Verbindung zu dem zugrunde liegenden Gerät verliert. Auch wenn die Verbindung verloren geht, bleiben die letzten Informationen erhalten. Ein ungültiger Dienst kann nicht mehr gültig werden, selbst wenn die Verbindung zum Gerät wiederhergestellt wird. |
QLowEnergyService::RemoteService | 1 | Die Details des Dienstes müssen noch durch den Aufruf von discoverDetails() ermittelt werden. Die einzigen zuverlässigen Informationen sind serviceUuid() und serviceName(). |
QLowEnergyService::RemoteServiceDiscovering | 2 | Die Details des Dienstes werden gerade ermittelt. |
QLowEnergyService::RemoteServiceDiscovered | 3 | Die Details des Dienstes wurden bereits ermittelt. |
QLowEnergyService::LocalService (since Qt 5.7) | 4 | Der Dienst ist mit einem Controller-Objekt in peripheral role verbunden. Solche Dienstobjekte ändern ihren Zustand nicht. |
QLowEnergyService::DiscoveryRequired | RemoteService | Veraltet. Wurde umbenannt in RemoteService. |
QLowEnergyService::DiscoveringService | RemoteServiceDiscovering | Veraltet. Wurde umbenannt in RemoteServiceDiscovering. |
QLowEnergyService::ServiceDiscovered | RemoteServiceDiscovered | Veraltet. Wurde umbenannt in RemoteServiceDiscovered. |
enum QLowEnergyService::ServiceType
flags QLowEnergyService::ServiceTypes
Diese Aufzählung beschreibt den Typ des Dienstes.
Konstante | Wert | Beschreibung |
---|---|---|
QLowEnergyService::PrimaryService | 0x0001 | Der Dienst ist ein Top-Level/Primärdienst. Ist dieses Typkennzeichen nicht gesetzt, wird der Dienst als sekundärer Dienst betrachtet. Jeder Dienst kann von einem anderen Dienst eingeschlossen sein, was durch IncludedService angezeigt wird. |
QLowEnergyService::IncludedService | 0x0002 | Der Dienst ist von einem anderen Dienst eingeschlossen. Auf einigen Plattformen kann dieses Kennzeichen erst ermittelt werden, wenn der Dienst, der den aktuellen Dienst einschließt, entdeckt wurde. |
Der Typ ServiceTypes ist ein Typedef für QFlags<ServiceType>. Er speichert eine ODER-Kombination von ServiceType-Werten.
enum QLowEnergyService::WriteMode
Diese Aufzählung beschreibt den Modus, der beim Schreiben eines Merkmalswerts zu verwenden ist. Das Merkmal gibt seine unterstützten Schreibmodi über seine properties bekannt.
Konstante | Wert | Beschreibung |
---|---|---|
QLowEnergyService::WriteWithResponse | 0 | Wenn ein Merkmal mit diesem Modus geschrieben wird, sendet das Peripheriegerät eine Schreibbestätigung. Wenn der Vorgang erfolgreich ist, wird die Bestätigung über das Signal characteristicWritten() ausgegeben. Andernfalls wird das Signal CharacteristicWriteError ausgesendet. Ein Merkmal muss die Eigenschaft QLowEnergyCharacteristic::Write gesetzt haben, um diesen Schreibmodus zu unterstützen. |
QLowEnergyService::WriteWithoutResponse | 1 | Wenn ein Merkmal in diesem Modus geschrieben wird, sendet das entfernte Peripheriegerät keine Schreibbestätigung. 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. Sein Vorteil ist ein schnellerer Schreibvorgang, da er zwischen anderen Geräteinteraktionen erfolgen kann. |
QLowEnergyService::WriteSigned (since Qt 5.7) | 2 | Wenn ein Merkmal in diesem Modus geschrieben wird, sendet das entfernte Peripheriegerät keine Schreibbestätigung. Der Erfolg des Vorgangs kann nicht festgestellt werden, und die Nutzlast darf nicht länger als 8 Byte sein. Es muss eine Verbindung zwischen den beiden Geräten bestehen und die Verbindung darf nicht verschlüsselt sein. Ein Merkmal 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 Kernelversion 3.7 oder neuer unterstützt. |
Dokumentation der Mitgliedsfunktionen
[virtual noexcept]
QLowEnergyService::~QLowEnergyService()
Zerstört die Instanz QLowEnergyService.
QLowEnergyCharacteristic QLowEnergyService::characteristic(const QBluetoothUuid &uuid) const
Gibt das passende Merkmal für uuid zurück, ansonsten ein ungültiges Merkmal.
Das zurückgegebene Merkmal ist ungültig, wenn die Funktion discoverDetails() dieser Serviceinstanz noch nicht aufgerufen wurde oder es keine Merkmale mit einem passenden uuid gibt.
Siehe auch characteristics().
[signal]
void QLowEnergyService::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
Befindet sich das zugehörige Steuerungsobjekt 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 impliziert die Ausgabe des Signals, dass Änderungsmeldungen über den ClientCharacteristicConfiguration Deskriptor des Merkmals vor dem Änderungsereignis auf der Peripherieseite aktiviert worden sein müssen. Weitere Einzelheiten darüber, wie dies geschehen kann, sind unter above zu finden.
Befindet sich der Controller in der Rolle peripheral, d.h. das Serviceobjekt wurde über QLowEnergyController::addService erstellt, wird das Signal ausgegeben, wenn ein GATT-Client den Wert des Merkmals über eine Schreibanforderung oder einen Schreibbefehl geschrieben hat.
Der Parameter newValue enthält den aktualisierten Wert des characteristic.
[signal]
void QLowEnergyService::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value)
Dieses Signal wird ausgegeben, wenn die Leseabfrage für characteristic erfolgreich dessen value zurückgegeben hat. Das Signal kann durch den Aufruf von characteristicRead() ausgelöst werden. Wenn der Lesevorgang nicht erfolgreich war, wird das Signal errorOccurred() unter Verwendung des Flags CharacteristicReadError ausgegeben.
Hinweis: Dieses Signal wird nur für Anwendungsfälle mit zentraler Rolle ausgegeben.
Siehe auch readCharacteristic().
[signal]
void QLowEnergyService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
Dieses Signal wird ausgegeben, wenn der Wert von characteristic erfolgreich in newValue geändert wurde. Die Änderung muss durch den Aufruf von writeCharacteristic() ausgelöst worden sein. Ist der Schreibvorgang nicht erfolgreich, wird das Signal errorOccurred() über das Flag CharacteristicWriteError ausgegeben.
Der Empfang des Schreibsignals kann als Zeichen dafür gewertet werden, dass das Zielgerät den zu schreibenden Wert erhalten hat und den Status der Schreibanforderung zurückmeldet.
Hinweis: Wenn writeCharacteristic() im Modus WriteWithoutResponse aufgerufen wird, werden dieses Signal und das Signal errorOccurred() nie ausgegeben.
Hinweis: Dieses Signal wird nur für Anwendungsfälle mit zentraler Rolle ausgegeben.
Siehe auch writeCharacteristic().
QList<QLowEnergyCharacteristic> QLowEnergyService::characteristics() const
Gibt alle Merkmale zurück, die mit dieser QLowEnergyService
Instanz verbunden sind.
Die zurückgegebene Liste ist leer, wenn discoverDetails() für diese Dienstinstanz 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 einer Dienstleistung, 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 ausgegeben, wenn die Leseanfrage für descriptor erfolgreich dessen value zurückgegeben hat. Das Signal kann durch den Aufruf von descriptorRead() ausgelöst werden. Wenn der Lesevorgang nicht erfolgreich war, wird das Signal errorOccurred() unter Verwendung des Flags DescriptorReadError ausgegeben.
Hinweis: Dieses Signal wird nur für Anwendungsfälle mit zentraler Rolle ausgegeben.
Siehe auch readDescriptor().
[signal]
void QLowEnergyService::descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
Dieses Signal wird ausgegeben, wenn der Wert von descriptor erfolgreich in newValue geändert wurde. Wenn sich das zugehörige Controller-Objekt in der Rolle central befindet, muss die Änderung durch den Aufruf von writeDescriptor() verursacht worden sein. Andernfalls ist das Signal das Ergebnis einer Schreibanforderung oder eines Schreibbefehls von einem GATT-Client an den entsprechenden Deskriptor.
Siehe auch writeDescriptor().
void QLowEnergyService::discoverDetails(QLowEnergyService::DiscoveryMode mode = FullDiscovery)
Initiiert die Ermittlung der in den Dienst einbezogenen Dienste, Merkmale und der zugehörigen Deskriptoren.
Der Erkennungsprozess wird durch das Signal stateChanged() angezeigt. Nach der Erstellung befindet sich der Dienst im Zustand DiscoveryRequired. Beim Aufruf von discoverDetails() geht er in den Zustand DiscoveringService über. Nach Abschluss der Detailermittlung geht er in den Zustand ServiceDiscovered über. Bei jedem Übergang wird das Signal stateChanged() ausgegeben. Je nach dem Argument mode wird ein FullDiscovery oder ein SkipValueDiscovery ausgeführt. In jedem Fall werden alle Dienste und Merkmale ermittelt. Ein FullDiscovery liest alle Merkmalswerte und Deskriptoren aus. Ein SkipValueDiscovery liest keine Merkmalswerte und Deskriptoren. Ein SkipValueDiscovery hat zwei Vorteile. Erstens ist es schneller. Zweitens umgeht es Fehler in einigen Geräten, die fälschlicherweise Merkmale oder Deskriptoren als lesbar ankündigen, aber dennoch kein Lesen auf ihnen erlauben. Dies kann zu unvorhersehbarem Verhalten führen. Nach einem SkipValueDiscovery ist es notwendig, readCharacteristic() / readDescriptor() aufzurufen und auf deren erfolgreichen Abschluss zu warten, bevor auf den Wert eines Merkmals oder 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 zurück oder NoError.
[signal, since 6.2]
void QLowEnergyService::errorOccurred(QLowEnergyService::ServiceError newError)
Dieses Signal wird ausgegeben, wenn ein Fehler aufgetreten ist. 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 umfasst sind.
Die zurückgegebene Liste ist leer, wenn discoverDetails() dieser Dienstinstanz noch nicht aufgerufen wurde oder es keine bekannten Merkmale gibt.
Es ist möglich, dass ein inkludierter Dienst noch einen weiteren Dienst enthält. Solche Second-Level-Includes müssen über ihre entsprechende First-Level-Instanz QLowEnergyService bezogen werden. Technisch gesehen könnte dies eine zirkuläre Abhängigkeit erzeugen.
QLowEnergyController::createServiceObject() sollte verwendet werden, um Dienstinstanzen für jede der UUIDs zu erhalten.
Siehe auch createServiceObject().
void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &characteristic)
Liest den Wert von characteristic. Ist der Vorgang erfolgreich, wird das Signal characteristicRead() ausgegeben; andernfalls wird CharacteristicReadError gesetzt. Im Allgemeinen ist ein characteristic lesbar, wenn seine QLowEnergyCharacteristic::Read Eigenschaft gesetzt ist.
Alle Deskriptor- und Merkmalsanforderungen an ein und dasselbe entfernte Gerät werden serialisiert. Eine Warteschlange wird verwendet, wenn mehrere Anfragen gleichzeitig gestellt werden. Die Warteschlange verhindert nicht, dass doppelte Leseanforderungen für dasselbe Merkmal gestellt werden.
Ein Merkmal kann nur gelesen werden, wenn sich der Dienst im Zustand ServiceDiscovered befindet und zum Dienst gehört. Wenn eine dieser Bedingungen nicht erfüllt ist, wird QLowEnergyService::OperationError gesetzt.
Hinweis: Der Aufruf dieser Funktion, obwohl QLowEnergyCharacteristic::properties() eine nicht lesbare Eigenschaft meldet, versucht immer, den Wert des Merkmals auf der Hardware zu lesen. Wenn die Hardware mit einem Fehler zurückkehrt, wird CharacteristicReadError gesetzt.
Siehe auch characteristicRead() und writeCharacteristic().
void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor)
Liest den Wert von descriptor. Ist der Vorgang erfolgreich, wird das Signal descriptorRead() ausgegeben; andernfalls wird DescriptorReadError gesetzt.
Alle Deskriptor- und Merkmalsanfragen an dasselbe entfernte Gerät werden serialisiert. Eine Warteschlange wird verwendet, wenn mehrere Anfragen gleichzeitig gestellt werden. Die Warteschlange verhindert nicht, dass doppelte Leseanforderungen für denselben Deskriptor gestellt werden.
Ein Deskriptor kann nur gelesen werden, wenn sich der Dienst im Zustand ServiceDiscovered befindet und der Deskriptor zu diesem Dienst gehört. Wenn eine dieser Bedingungen nicht erfüllt ist, 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.
Wenn der Dienst des Geräts zum ersten Mal instanziiert wurde, lautet der Zustand des Objekts DiscoveryRequired. Der Zustand aller Dienstobjekte, die auf denselben Dienst des Peripheriegeräts verweisen, ist immer gleich. Dies ist auf die gemeinsame Nutzung der internen Objektdaten zurückzuführen. Daher hat jede Instanz eines Dienstobjekts, die nach der ersten erstellt wird, den gleichen Status wie die bereits vorhandenen Instanzen.
Ein Dienst wird ungültig, wenn die QLowEnergyController die Verbindung zum entfernten Gerät trennt. Ein ungültiger Dienst behält seinen internen Zustand zum Zeitpunkt der Verbindungstrennung bei. Dies bedeutet, dass die Details eines Dienstes auch von einem ungültigen Dienst abgerufen werden können, sobald sie entdeckt wurden. Dies ermöglicht Szenarien, in denen die Geräteverbindung hergestellt wird, die Dienstdetails abgerufen werden und das Gerät sofort getrennt wird, damit das nächste Gerät die Verbindung zum Peripheriegerät herstellen kann.
Unter normalen Umständen sollte die Verbindung jedoch bestehen bleiben, um eine wiederholte Ermittlung der Dienste und ihrer Details zu vermeiden. Die Ermittlung kann eine Weile dauern, und der Client kann sich für laufende Änderungsmeldungen anmelden.
Siehe auch stateChanged().
[signal]
void QLowEnergyService::stateChanged(QLowEnergyService::ServiceState newState)
Dieses Signal wird ausgesendet, wenn sich der Zustand des Dienstes ändert. Die newState kann auch über state() abgerufen werden.
Siehe auch state().
QLowEnergyService::ServiceTypes QLowEnergyService::type() const
Gibt den Typ des Dienstes zurück.
Hinweis: Auf das Attribut type kann erst dann zurückgegriffen werden, wenn der Dienst den Zustand ServiceDiscovered erreicht hat. Dieses Feld wird mit PrimaryService initialisiert.
Hinweis: Unter Android ist es nicht möglich, festzustellen, ob ein Dienst ein primärer oder sekundärer Dienst ist. Daher haben alle Dienste das PrimaryService Flag gesetzt.
void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse)
Schreibt newValue als Wert für die 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() ausgegeben, andernfalls wird CharacteristicWriteError gesetzt. Der Aufruf dieser Funktion löst nur dann das Signal characteristicChanged() aus, wenn das Peripheriegerät selbst den Wert nach der aktuellen Schreibanforderung erneut ändert.
Der Parameter mode bestimmt, ob das entfernte Gerät eine Schreibbestätigung senden soll. Das zu beschreibende characteristic muss den entsprechenden Schreibmodus unterstützen. Die unterstützten Schreibmodi des Merkmals werden durch seine Eigenschaften QLowEnergyCharacteristic::Write und QLowEnergyCharacteristic::WriteNoResponse angegeben.
Alle Schreibanforderungen von Deskriptoren und Merkmalen an ein und dasselbe entfernte Gerät werden serialisiert. Eine Warteschlange wird verwendet, wenn mehrere Schreibanforderungen gleichzeitig gestellt werden. Die Warteschlange verhindert nicht, dass doppelte Schreibanforderungen für dasselbe Merkmal gestellt werden. Wenn beispielsweise derselbe Deskriptor auf den Wert A und unmittelbar danach auf B gesetzt wird, werden die beiden Schreibaufträge in der angegebenen Reihenfolge ausgeführt.
Hinweis: Derzeit ist es nicht möglich, signierte oder zuverlässige Schreibvorgänge zu verwenden, wie sie in der Bluetooth-Spezifikation definiert sind.
Ein Merkmal kann nur geschrieben werden, wenn sich dieser Dienst im Zustand ServiceDiscovered befindet und zum Dienst gehört. Wenn eine dieser Bedingungen nicht erfüllt ist, wird QLowEnergyService::OperationError gesetzt.
Hinweis: Der Aufruf dieser Funktion, obwohl QLowEnergyCharacteristic::properties() eine nicht beschreibbare Eigenschaft meldet, versucht immer, in die Hardware zu schreiben. In ähnlicher Weise wird auch ein WriteWithoutResponse an die Hardware gesendet, obwohl das Merkmal möglicherweise nur WriteWithResponse unterstützt. Wenn die Hardware mit einem Fehler zurückkommt, wird CharacteristicWriteError gesetzt.
Rolle der Peripherie
Der Aufruf führt dazu, dass der Wert des Merkmals in der lokalen Datenbank aktualisiert wird.
Ist ein Client gerade verbunden und hat er Benachrichtigungen oder Hinweise für das Merkmal aktiviert, werden die entsprechenden Informationen gesendet. Wenn ein Gerät Benachrichtigungen oder Hinweise für das Merkmal aktiviert hat und dieses Gerät derzeit nicht verbunden ist, aber eine Verbindung zwischen ihm und dem lokalen Gerät besteht, wird die Benachrichtigung oder der Hinweis bei der nächsten Wiederverbindung gesendet.
Wenn es eine Beschränkung für die Länge des Merkmalswertes gibt und newValue sich nicht an diese Beschränkung hä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 entfernte Gerät. Ist der Vorgang erfolgreich, wird das Signal descriptorWritten() ausgegeben; andernfalls wird DescriptorWriteError ausgegeben.
Alle Deskriptor- und Merkmalsanforderungen an dasselbe entfernte Gerät werden serialisiert. Eine Warteschlange wird verwendet, wenn mehrere Schreibanforderungen gleichzeitig gestellt werden. Die Warteschlange verhindert nicht, dass doppelte Schreibanforderungen für denselben Deskriptor gestellt werden. Wird beispielsweise derselbe Deskriptor auf den Wert A und unmittelbar danach auf B gesetzt, werden die beiden Schreibaufträge in der angegebenen Reihenfolge ausgeführt.
Ein Deskriptor kann nur geschrieben werden, wenn sich dieser Dienst im Zustand ServiceDiscovered befindet und zum Dienst gehört. Wenn eine dieser Bedingungen nicht erfüllt ist, wird QLowEnergyService::OperationError gesetzt.
Peripherie-Rolle
Der Wert wird in die lokale Dienstdatenbank geschrieben. Wenn der Inhalt von newValue nicht für descriptor gültig ist, ist das Verhalten nicht spezifiziert.
Siehe auch descriptorWritten() und readDescriptor().
© 2025 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.