diff options
author | Alex Blasche <alexander.blasche@digia.com> | 2014-07-16 10:55:15 +0200 |
---|---|---|
committer | Alex Blasche <alexander.blasche@digia.com> | 2014-07-23 08:35:31 +0200 |
commit | 3956cae8adc2cb7f8f883e52a7f19e4f5b9fea29 (patch) | |
tree | f6855ac4b718b142fda6d68308f5def5cfe74e14 | |
parent | ae61ed17641b0e3d5deae81cbc5360d2152ee676 (diff) |
Bind the BTLE socket to the local Bt device
This seems to be optional for Bluez4 but mandatory for Bluez5 to
establish a connection at all.
Change-Id: Ia99b6e6623fc63f3d0abe37a87808a59cbd889f1
Reviewed-by: Fabian Bumberger <fbumberger@rim.com>
-rw-r--r-- | src/bluetooth/qbluetoothsocket_bluez.cpp | 2 | ||||
-rw-r--r-- | src/bluetooth/qlowenergycontrollernew_bluez.cpp | 24 |
2 files changed, 25 insertions, 1 deletions
diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index ba99b889..b046998a 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -170,7 +170,7 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, #if defined(QT_BLUEZ_BLUETOOTH) && !defined(QT_BLUEZ_NO_BTLE) if (isLowEnergySocket) { - addr.l2_cid = port; + addr.l2_cid = htobs(port); addr.l2_bdaddr_type = BDADDR_LE_PUBLIC; } else { addr.l2_psm = port; diff --git a/src/bluetooth/qlowenergycontrollernew_bluez.cpp b/src/bluetooth/qlowenergycontrollernew_bluez.cpp index ad32ab0e..e613bc05 100644 --- a/src/bluetooth/qlowenergycontrollernew_bluez.cpp +++ b/src/bluetooth/qlowenergycontrollernew_bluez.cpp @@ -48,6 +48,7 @@ #include <QtBluetooth/QLowEnergyService> #include <bluetooth/bluetooth.h> +#include <bluetooth/l2cap.h> #define ATTRIBUTE_CHANNEL_ID 4 @@ -207,6 +208,29 @@ void QLowEnergyControllerNewPrivate::connectToDevice() connect(l2cpSocket, SIGNAL(readyRead()), this, SLOT(l2cpReadyRead())); l2cpSocket->d_ptr->isLowEnergySocket = true; + + // bind the socket to the local device + int sockfd = l2cpSocket->socketDescriptor(); + if (sockfd < 0) { + qCWarning(QT_BT_BLUEZ) << "l2cp socket not initialised"; + setError(QLowEnergyControllerNew::UnknownError); + return; + } + + struct sockaddr_l2 addr; + memset(&addr, 0, sizeof(addr)); + addr.l2_family = AF_BLUETOOTH; + addr.l2_cid = htobs(ATTRIBUTE_CHANNEL_ID); + addr.l2_bdaddr_type = BDADDR_LE_PUBLIC; + convertAddress(localAdapter.toUInt64(), addr.l2_bdaddr.b); + + if (::bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + qCWarning(QT_BT_BLUEZ) << qt_error_string(errno); + setError(QLowEnergyControllerNew::UnknownError); + return; + } + + // connect l2cpSocket->connectToService(remoteDevice, ATTRIBUTE_CHANNEL_ID); } |