summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@digia.com>2014-07-16 10:55:15 +0200
committerAlex Blasche <alexander.blasche@digia.com>2014-07-23 08:35:31 +0200
commit3956cae8adc2cb7f8f883e52a7f19e4f5b9fea29 (patch)
treef6855ac4b718b142fda6d68308f5def5cfe74e14
parentae61ed17641b0e3d5deae81cbc5360d2152ee676 (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.cpp2
-rw-r--r--src/bluetooth/qlowenergycontrollernew_bluez.cpp24
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);
}