diff options
author | Andreas Buhr <andreas.buhr@qt.io> | 2021-04-26 10:17:35 +0200 |
---|---|---|
committer | Andreas Buhr <andreas.buhr@qt.io> | 2021-04-27 13:39:52 +0200 |
commit | a93c7a8afee755dad9bee634f968658ab686bf1f (patch) | |
tree | 29541f5bb618c82a24c33ef459ba036657a06575 | |
parent | fab1aef025590c4d32ee03caf92400ae8d0a3e1e (diff) |
Implement reduced service discovery on Linux-BlueZ
This patch implements reduced service discovery on Linux in the
BlueZ backend (without DBUS). Reading of characteristics and
descriptors is skipped in service discovery.
Task-number: QTBUG-75349
Fixes: QTBUG-91960
Change-Id: Ie15462d79d76d5d2c49daf223b33f03b2a9b2672
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
-rw-r--r-- | src/bluetooth/qlowenergycontroller_bluez.cpp | 12 | ||||
-rw-r--r-- | src/bluetooth/qlowenergyserviceprivate.cpp | 10 | ||||
-rw-r--r-- | src/bluetooth/qlowenergyserviceprivate_p.h | 11 |
3 files changed, 18 insertions, 15 deletions
diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index fe9605d2..52c13304 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -1566,7 +1566,6 @@ void QLowEnergyControllerPrivateBluez::sendReadByGroupRequest( void QLowEnergyControllerPrivateBluez::discoverServiceDetails(const QBluetoothUuid &service, QLowEnergyService::DiscoveryMode mode) { - Q_UNUSED(mode); if (!serviceList.contains(service)) { qCWarning(QT_BT_BLUEZ) << "Discovery of unknown service" << service.toString() << "not possible"; @@ -1574,6 +1573,7 @@ void QLowEnergyControllerPrivateBluez::discoverServiceDetails(const QBluetoothUu } QSharedPointer<QLowEnergyServicePrivate> serviceData = serviceList.value(service); + serviceData->mode = mode; serviceData->characteristicList.clear(); sendReadByTypeRequest(serviceData, serviceData->startHandle, GATT_INCLUDED_SERVICE); } @@ -1629,6 +1629,16 @@ void QLowEnergyControllerPrivateBluez::readServiceValues( QSharedPointer<QLowEnergyServicePrivate> service = serviceList.value(serviceUuid); + if (service->mode == QLowEnergyService::SkipValueDiscovery) { + if (readCharacteristics) { + // -> continue with descriptor discovery + discoverServiceDescriptors(service->uuid); + } else { + service->setState(QLowEnergyService::RemoteServiceDiscovered); + } + return; + } + // pair.first -> target attribute // pair.second -> context information for read request QPair<QLowEnergyHandle, quint32> pair; diff --git a/src/bluetooth/qlowenergyserviceprivate.cpp b/src/bluetooth/qlowenergyserviceprivate.cpp index 91364155..0a401d8d 100644 --- a/src/bluetooth/qlowenergyserviceprivate.cpp +++ b/src/bluetooth/qlowenergyserviceprivate.cpp @@ -43,15 +43,7 @@ QT_BEGIN_NAMESPACE -QLowEnergyServicePrivate::QLowEnergyServicePrivate(QObject *parent) : - QObject(parent), - startHandle(0), - endHandle(0), - type(QLowEnergyService::PrimaryService), - state(QLowEnergyService::InvalidService), - lastError(QLowEnergyService::NoError) -{ -} +QLowEnergyServicePrivate::QLowEnergyServicePrivate(QObject *parent) : QObject(parent) { } QLowEnergyServicePrivate::~QLowEnergyServicePrivate() { diff --git a/src/bluetooth/qlowenergyserviceprivate_p.h b/src/bluetooth/qlowenergyserviceprivate_p.h index a74743d1..cf53b2e9 100644 --- a/src/bluetooth/qlowenergyserviceprivate_p.h +++ b/src/bluetooth/qlowenergyserviceprivate_p.h @@ -111,14 +111,15 @@ signals: const QByteArray &newValue); public: - QLowEnergyHandle startHandle; - QLowEnergyHandle endHandle; + QLowEnergyHandle startHandle = 0; + QLowEnergyHandle endHandle = 0; QBluetoothUuid uuid; QList<QBluetoothUuid> includedServices; - QLowEnergyService::ServiceTypes type; - QLowEnergyService::ServiceState state; - QLowEnergyService::ServiceError lastError; + QLowEnergyService::ServiceTypes type = QLowEnergyService::PrimaryService; + QLowEnergyService::ServiceState state = QLowEnergyService::InvalidService; + QLowEnergyService::ServiceError lastError = QLowEnergyService::NoError; + QLowEnergyService::DiscoveryMode mode = QLowEnergyService::FullDiscovery; QHash<QLowEnergyHandle, CharData> characteristicList; |