diff options
author | Alex Blasche <alexander.blasche@digia.com> | 2014-07-14 11:24:35 +0200 |
---|---|---|
committer | Alex Blasche <alexander.blasche@digia.com> | 2014-07-16 08:28:51 +0200 |
commit | 5e6a8d2dceb69f32a4c80be34917da2d9eaea623 (patch) | |
tree | 186a105e38ce454373b08e82029bb5e30794d8c6 | |
parent | 447b2366bbf999858db4ddecadd9fcb0fae63447 (diff) |
Add capability to dectect MTU value of the COM channel
The MTU is still being ignored during the read/write operations. This
will change in later commits.
Change-Id: If13cf949e5258159ec59678e9235de4d248af446
Reviewed-by: Fabian Bumberger <fbumberger@rim.com>
-rw-r--r-- | src/bluetooth/qlowenergycontrollernew_bluez.cpp | 50 | ||||
-rw-r--r-- | src/bluetooth/qlowenergycontrollernew_p.h | 2 |
2 files changed, 50 insertions, 2 deletions
diff --git a/src/bluetooth/qlowenergycontrollernew_bluez.cpp b/src/bluetooth/qlowenergycontrollernew_bluez.cpp index 2067948c..af2ec9f7 100644 --- a/src/bluetooth/qlowenergycontrollernew_bluez.cpp +++ b/src/bluetooth/qlowenergycontrollernew_bluez.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2013 Javier S. Pedro <maemo@javispedro.com> ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtBluetooth module of the Qt Toolkit. @@ -51,11 +52,16 @@ #define ATTRIBUTE_CHANNEL_ID 4 +#define ATT_DEFAULT_LE_MTU 23 +#define ATT_MAX_LE_MTU 0x200 + #define GATT_PRIMARY_SERVICE 0x2800 #define GATT_CHARACTERISTIC 0x2803 // GATT commands #define ATT_OP_ERROR_RESPONSE 0x1 +#define ATT_OP_EXCHANGE_MTU_REQUEST 0x2 //send own mtu +#define ATT_OP_EXCHANGE_MTU_RESPONSE 0x3 //receive server MTU #define ATT_OP_FIND_INFORMATION_REQUEST 0x4 //discover individual attribute info #define ATT_OP_FIND_INFORMATION_RESPONSE 0x5 #define ATT_OP_READ_BY_TYPE_REQUEST 0x8 //discover characteristics @@ -76,6 +82,7 @@ #define READ_BY_TYPE_REQ_SIZE 7 #define READ_REQUEST_SIZE 3 #define WRITE_REQUEST_SIZE 3 +#define MTU_EXCHANGE_SIZE 3 // GATT error codes #define ATT_ERROR_INVALID_HANDLE 0x01 @@ -177,7 +184,8 @@ QLowEnergyControllerNewPrivate::QLowEnergyControllerNewPrivate() : QObject(), state(QLowEnergyControllerNew::UnconnectedState), error(QLowEnergyControllerNew::NoError), - l2cpSocket(0) + l2cpSocket(0), requestPending(false), + mtuSize(ATT_DEFAULT_LE_MTU) { qRegisterMetaType<QList<QLowEnergyHandle> >(); } @@ -207,8 +215,9 @@ void QLowEnergyControllerNewPrivate::l2cpConnected() { Q_Q(QLowEnergyControllerNew); + exchangeMTU(); + setState(QLowEnergyControllerNew::ConnectedState); - requestPending = false; emit q->connected(); } @@ -331,6 +340,24 @@ void QLowEnergyControllerNewPrivate::processReply( } switch (command) { + case ATT_OP_EXCHANGE_MTU_REQUEST: // in case of error + case ATT_OP_EXCHANGE_MTU_RESPONSE: + { + Q_ASSERT(request.command == ATT_OP_EXCHANGE_MTU_REQUEST); + if (isErrorResponse) { + mtuSize = ATT_DEFAULT_LE_MTU; + break; + } + + const char *data = response.constData(); + quint16 mtu = bt_get_le16(&data[1]); + mtuSize = mtu; + if (mtuSize < ATT_DEFAULT_LE_MTU) + mtuSize = ATT_DEFAULT_LE_MTU; + + qCDebug(QT_BT_BLUEZ) << "Server MTU:" << mtu << "resulting mtu:" << mtuSize; + } + break; case ATT_OP_READ_BY_GROUP_REQUEST: // in case of error case ATT_OP_READ_BY_GROUP_RESPONSE: { @@ -831,6 +858,25 @@ void QLowEnergyControllerNewPrivate::processUnsolicitedReply(const QByteArray &p } } +void QLowEnergyControllerNewPrivate::exchangeMTU() +{ + qCDebug(QT_BT_BLUEZ) << "Exchanging MTU"; + + quint8 packet[MTU_EXCHANGE_SIZE]; + packet[0] = ATT_OP_EXCHANGE_MTU_REQUEST; + bt_put_unaligned(htobs(ATT_MAX_LE_MTU), (quint16 *) &packet[1]); + + QByteArray data(MTU_EXCHANGE_SIZE, Qt::Uninitialized); + memcpy(data.data(), packet, MTU_EXCHANGE_SIZE); + + Request request; + request.payload = data; + request.command = ATT_OP_EXCHANGE_MTU_REQUEST; + openRequests.enqueue(request); + + sendNextPendingRequest(); +} + void QLowEnergyControllerNewPrivate::discoverNextDescriptor( QSharedPointer<QLowEnergyServicePrivate> serviceData, const QList<QLowEnergyHandle> pendingCharHandles, diff --git a/src/bluetooth/qlowenergycontrollernew_p.h b/src/bluetooth/qlowenergycontrollernew_p.h index a3243a2c..d51f04f0 100644 --- a/src/bluetooth/qlowenergycontrollernew_p.h +++ b/src/bluetooth/qlowenergycontrollernew_p.h @@ -126,6 +126,7 @@ private: }; QQueue<Request> openRequests; bool requestPending; + quint16 mtuSize; void sendCommand(const QByteArray &packet); void sendNextPendingRequest(); @@ -142,6 +143,7 @@ private: const QList<QLowEnergyHandle> pendingCharHandles, QLowEnergyHandle startingHandle); void processUnsolicitedReply(const QByteArray &msg); + void exchangeMTU(); private slots: |