diff options
-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); } |