Try to enable also indications if possible with bluez version
parent
68ca8605f3
commit
a004724b0f
|
|
@ -72,6 +72,17 @@ QList<BluetoothGattDescriptor *> BluetoothGattCharacteristic::descriptors() cons
|
||||||
return m_descriptors;
|
return m_descriptors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BluetoothGattDescriptor *BluetoothGattCharacteristic::getDescriptor(const QBluetoothUuid &desciptorUuid) const
|
||||||
|
{
|
||||||
|
foreach (BluetoothGattDescriptor *descriptor, m_descriptors) {
|
||||||
|
if (descriptor->uuid() == desciptorUuid) {
|
||||||
|
return descriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
BluetoothGattCharacteristic::BluetoothGattCharacteristic(const QDBusObjectPath &path, const QVariantMap &properties, QObject *parent) :
|
BluetoothGattCharacteristic::BluetoothGattCharacteristic(const QDBusObjectPath &path, const QVariantMap &properties, QObject *parent) :
|
||||||
QObject(parent),
|
QObject(parent),
|
||||||
m_path(path),
|
m_path(path),
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ public:
|
||||||
Properties properties() const;
|
Properties properties() const;
|
||||||
QByteArray value() const;
|
QByteArray value() const;
|
||||||
QList<BluetoothGattDescriptor *> descriptors() const;
|
QList<BluetoothGattDescriptor *> descriptors() const;
|
||||||
|
BluetoothGattDescriptor *getDescriptor(const QBluetoothUuid &desciptorUuid) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit BluetoothGattCharacteristic(const QDBusObjectPath &path, const QVariantMap &properties, QObject *parent = 0);
|
explicit BluetoothGattCharacteristic(const QDBusObjectPath &path, const QVariantMap &properties, QObject *parent = 0);
|
||||||
|
|
|
||||||
|
|
@ -75,10 +75,17 @@ BluetoothGattDescriptor::BluetoothGattDescriptor(const QDBusObjectPath &path, co
|
||||||
QDBusConnection::systemBus().connect(orgBluez, m_path.path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(onPropertiesChanged(QString,QVariantMap,QStringList)));
|
QDBusConnection::systemBus().connect(orgBluez, m_path.path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(onPropertiesChanged(QString,QVariantMap,QStringList)));
|
||||||
|
|
||||||
processProperties(properties);
|
processProperties(properties);
|
||||||
|
|
||||||
|
// QDBusPendingCall readingCall = m_descriptorInterface->asyncCall("GetAll", QVariantMap());
|
||||||
|
// QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(readingCall, this);
|
||||||
|
// connect(watcher, &QDBusPendingCallWatcher::finished, this, [=](){
|
||||||
|
// qCDebug(dcBluez()) << "Get descriptor properties finished";
|
||||||
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
void BluetoothGattDescriptor::processProperties(const QVariantMap &properties)
|
void BluetoothGattDescriptor::processProperties(const QVariantMap &properties)
|
||||||
{
|
{
|
||||||
|
qCDebug(dcBluez()) << "Descriptor properties" << properties;
|
||||||
foreach (const QString &propertyName, properties.keys()) {
|
foreach (const QString &propertyName, properties.keys()) {
|
||||||
if (propertyName == "UUID") {
|
if (propertyName == "UUID") {
|
||||||
m_uuid = QBluetoothUuid(properties.value(propertyName).toString());
|
m_uuid = QBluetoothUuid(properties.value(propertyName).toString());
|
||||||
|
|
|
||||||
|
|
@ -150,9 +150,9 @@ void Nuki::printServices()
|
||||||
foreach (BluetoothGattService *service, m_bluetoothDevice->services()) {
|
foreach (BluetoothGattService *service, m_bluetoothDevice->services()) {
|
||||||
qCDebug(dcNuki()) << service;
|
qCDebug(dcNuki()) << service;
|
||||||
foreach (BluetoothGattCharacteristic *characteristic, service->characteristics()) {
|
foreach (BluetoothGattCharacteristic *characteristic, service->characteristics()) {
|
||||||
qCDebug(dcNuki()) << " " << characteristic->chararcteristicName() << characteristic->uuid().toString();
|
qCDebug(dcNuki()) << " " << characteristic;
|
||||||
foreach (BluetoothGattDescriptor *descriptor, characteristic->descriptors()) {
|
foreach (BluetoothGattDescriptor *descriptor, characteristic->descriptors()) {
|
||||||
qCDebug(dcNuki()) << " " << descriptor->name() << descriptor->uuid().toString();
|
qCDebug(dcNuki()) << " " << descriptor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -202,6 +202,45 @@ void Nuki::executeCurrentAction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Nuki::enableNotificationsIndications(BluetoothGattCharacteristic *characteristic)
|
||||||
|
{
|
||||||
|
qCDebug(dcNuki()) << "Start enable notifications/indications for" << characteristic;
|
||||||
|
|
||||||
|
// Get the client configuration descriptor
|
||||||
|
// https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Descriptors/org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml
|
||||||
|
BluetoothGattDescriptor *clientConfiguration = characteristic->getDescriptor(QBluetoothUuid::ClientCharacteristicConfiguration);
|
||||||
|
if (!clientConfiguration) {
|
||||||
|
qCWarning(dcNuki()) << "Could not start notification/indications for" << characteristic << "because the client configuration descriptor is missing";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
qCDebug(dcNuki()) << "Enable notifications on" << characteristic;
|
||||||
|
if (!characteristic->startNotifications()) {
|
||||||
|
qCDebug(dcNuki()) << "Failed to start notifications on" << characteristic;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (characteristic->properties().testFlag(BluetoothGattCharacteristic::Indicate)) {
|
||||||
|
qCDebug(dcNuki()) << "Enable indications on" << characteristic;
|
||||||
|
QByteArray configuration;
|
||||||
|
QDataStream stream(&configuration, QIODevice::WriteOnly);
|
||||||
|
stream.setByteOrder(QDataStream::LittleEndian);
|
||||||
|
stream << static_cast<quint16>(0x02);
|
||||||
|
if (!clientConfiguration->writeValue(configuration)) {
|
||||||
|
qCWarning(dcNuki()) << "Failed to write client configuration descriptor on" << characteristic;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
qCWarning(dcNuki()) << "Could not enable notifications. Access properties do not allow indicate or notify" << characteristic;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
clientConfiguration->readValue();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void Nuki::onBluetoothDeviceStateChanged(const BluetoothDevice::State &state)
|
void Nuki::onBluetoothDeviceStateChanged(const BluetoothDevice::State &state)
|
||||||
{
|
{
|
||||||
qCDebug(dcNuki()) << m_bluetoothDevice << "state changed --> " << state;
|
qCDebug(dcNuki()) << m_bluetoothDevice << "state changed --> " << state;
|
||||||
|
|
@ -433,29 +472,36 @@ bool Nuki::init()
|
||||||
qCWarning(dcNuki()) << "Could not find user data characteristc on device" << m_bluetoothDevice;
|
qCWarning(dcNuki()) << "Could not find user data characteristc on device" << m_bluetoothDevice;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// Set key turner characteristics for data and user data
|
||||||
if (!m_keyturnerService->hasCharacteristic(keyturnerDataCharacteristicUuid)) {
|
if (!m_keyturnerService->hasCharacteristic(keyturnerDataCharacteristicUuid)) {
|
||||||
qCWarning(dcNuki()) << "Could not find data characteristc on device" << m_bluetoothDevice;
|
qCWarning(dcNuki()) << "Could not find data characteristc on device" << m_bluetoothDevice;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enable notifications/indications
|
||||||
m_keyturnerUserDataCharacteristic = m_keyturnerService->getCharacteristic(keyturnerUserDataCharacteristicUuid);
|
m_keyturnerUserDataCharacteristic = m_keyturnerService->getCharacteristic(keyturnerUserDataCharacteristicUuid);
|
||||||
if (!m_keyturnerUserDataCharacteristic->startNotifications()) {
|
if (!enableNotificationsIndications(m_keyturnerUserDataCharacteristic)) {
|
||||||
qCWarning(dcNuki()) << "Could not enable notifications for user data characteristic.";
|
qCWarning(dcNuki()) << "Could not enable notifications/indications for user data characteristic.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_keyturnerDataCharacteristic = m_keyturnerService->getCharacteristic(keyturnerDataCharacteristicUuid);
|
m_keyturnerDataCharacteristic = m_keyturnerService->getCharacteristic(keyturnerDataCharacteristicUuid);
|
||||||
if (!m_keyturnerDataCharacteristic->startNotifications()) {
|
if (!enableNotificationsIndications(m_keyturnerDataCharacteristic)) {
|
||||||
qCWarning(dcNuki()) << "Could not enable notifications for data characteristic.";
|
qCWarning(dcNuki()) << "Could not enable notifications/indications for key turner data characteristic.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Pairing service
|
// Pairing service
|
||||||
m_pairingService = m_bluetoothDevice->getService(pairingServiceUuid);
|
m_pairingService = m_bluetoothDevice->getService(pairingServiceUuid);
|
||||||
if (!m_pairingService->hasCharacteristic(pairingDataCharacteristicUuid)) {
|
if (!m_pairingService->hasCharacteristic(pairingDataCharacteristicUuid)) {
|
||||||
qCWarning(dcNuki()) << "Could not find pairing data characteristc on device" << m_bluetoothDevice;
|
qCWarning(dcNuki()) << "Could not find pairing data characteristc on device" << m_bluetoothDevice;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_pairingDataCharacteristic = m_pairingService->getCharacteristic(pairingDataCharacteristicUuid);
|
m_pairingDataCharacteristic = m_pairingService->getCharacteristic(pairingDataCharacteristicUuid);
|
||||||
if (!m_pairingDataCharacteristic->startNotifications()) {
|
if (!enableNotificationsIndications(m_pairingDataCharacteristic)) {
|
||||||
qCWarning(dcNuki()) << "Could not enable notifications for pairing characteristic.";
|
qCWarning(dcNuki()) << "Could not enable notifications for pairing characteristic.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,7 @@ private:
|
||||||
void readDeviceInformationCharacteristics();
|
void readDeviceInformationCharacteristics();
|
||||||
|
|
||||||
void executeCurrentAction();
|
void executeCurrentAction();
|
||||||
|
bool enableNotificationsIndications(BluetoothGattCharacteristic *characteristic);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void availableChanged(bool available);
|
void availableChanged(bool available);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue