~ Notifications from an RFduino over Bluetooth LE (4.0) on a Linux machine» By Joren on Thursday 21 May 2015
This post describes how to get notifications from a Bluetooth LE or Bluetooth v4.0 device on a Linux machine. Since it took me a while to get it going it is perhaps of interest to others.
The hardware I used is an RFduino board and a Belikin mini Bluethooth v4.0 adapter. The RFduino was programmed to wait for an event with
RFduino_pinWake(pni, HIGH). When the pin is
HIGH a count is incremented and this number is send to any device that is listening. In my case a Linux machine. The code is essentially the same as the button example included in the RDduino software distribution.
To install the Bluetooth stack on Debian the following command is executed
sudo apt-get install bluetooth bluez bluez-utils bluez-firmware. A blog post describes more about the Bluetooth tools. Some other interesting reads are Get started with Bluetooth Low Energy and this stackoverflow question. Once the stack is installed correctly the
lescan utility should give an output like this:
Bluetooth LE works with the Generic Attribute Profile (GATT). A Bluetooth LE device can provide services by combining characteristics. These characteristics are the way to communicate with the device. Some characteristics are writable and are able to send notifications. To receive notifications one such characteristic (referred to with a hex handle) needs to be written. Write 0100 to get notifications, 0200 for indications (indications are notifications that are acknowledged), 0300 for both, or 0000 for nothing (default). With this in mind, the following command enables listening for notifications:
gatttool --device=DC:87:CC:18:14:A5 --char-write-req --handle=0x000f --value=0300 --listen
With those commands working, the process can be automated with a Ruby script to get Bluetooth LE notifications. The script essentially calls
gatttool with the correct parameters and parses and reacts to its output. To make it work
lescan needs to be called before starting the script:
$ sudo hcitool lescan && ruby bluetooth_notifications.rb LE Scan ... DC:87:CC:18:14:A5 RFduino DC:87:CC:18:14:A5 (unknown) Characteristic value was written successfully Notification handle = 0x000e value: 41 decimal value: 65 Notification handle = 0x000e value: 42 decimal value: 66 Notification handle = 0x000e value: 43 decimal value: 67 Notification handle = 0x000e value: 44 decimal value: 68 Notification handle = 0x000e value: 45 decimal value: 69 Notification handle = 0x000e value: 46 decimal value: 70