Bluetooth LE on Raspbian

2019-02-14 19:29发布

问题:

I installed bluez-5.15 from source with the following configuration:

$ ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc \
--localstatedir=/var --libexecdir=/lib --disable-systemd

Then I had to copy gatttool manually into the /usr/local/bin dir

$ sudo cp attrib/gatttool /usr/local/bin/

I rebooted the Raspberry Pi and tried the following to connect to my BLE device:

$ sudo hciconfig hci0 up

$ sudo hcitool lescan
LE Scan ...  
EA:FB:B5:CE:B0:13 DfuTarg

$ sudo hcitool lewladd EA:FB:B5:CE:B0:13

$ sudo hcitool lecc EA:FB:B5:CE:B0:13
Could not create connection: Input/output error

So then I tried to connect with gatttool:

$ gatttool -b EA:FB:B5:CE:B0:13 --interactive
[EA:FB:B5:CE:B0:13][LE]> connect
Attempting to connect to EA:FB:B5:CE:B0:13
Error: connect error: Device or resource busy (16)
[EA:FB:B5:CE:B0:13][LE]>

What am I missing here - is this a configuration issue? What do the errors mean?

回答1:

First off, I spoke with a colleague about my configuration and for Raspbian (or more specifically, Debian) he recommended the following configuration settings:

./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var --enable-library --with-systemdsystemunitdir=/lib/systemd/system --with-systemduserunitdir=/usr/lib/systemd

Afterward, upon further inspection, here is how I was able to successfully connect. So what was happening was that the device I was trying to connect to (an NRF-based BLE device) required the LE address flag to be set to 'random'. See below:

gatttool -t random -b EA:FB:B5:CE:B0:13 -I

Then the result:

[EA:FB:B5:CE:B0:13][LE]> connect
Attempting to connect to EA:FB:B5:CE:B0:13
Connection successful
[EA:FB:B5:CE:B0:13][LE]> characteristics
handle: 0x0002, char properties: 0x0a, char value handle: 0x0003, uuid: 00002a00
-0000-1000-8000-00805f9b34fb

Huzzah! Also, there may be a need to set the security level to something lower than high:

[EA:FB:B5:CE:B0:13][LE]> sec-level medium


回答2:

From my experience with Bluez 5.15

  1. Ensure you have no connections to the BLE device (check with hcitool con).
  2. Do not run hcitool lecc.
  3. Start gatttool like in your question.
  4. In gatttool run connect command. If the command hangs, then press button on the device (i.e. sometimes needed when connecting to SensorTag).

I believe earlier versions of Bluez required hcitool lecc step, but it is not the case anymore.