summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Buhr <andreas.buhr@qt.io>2021-04-26 10:17:35 +0200
committerAndreas Buhr <andreas.buhr@qt.io>2021-04-27 13:39:52 +0200
commita93c7a8afee755dad9bee634f968658ab686bf1f (patch)
tree29541f5bb618c82a24c33ef459ba036657a06575
parentfab1aef025590c4d32ee03caf92400ae8d0a3e1e (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.cpp12
-rw-r--r--src/bluetooth/qlowenergyserviceprivate.cpp10
-rw-r--r--src/bluetooth/qlowenergyserviceprivate_p.h11
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;