C/C++ BLE read/write example with Bluez

Cole Wilson picture Cole Wilson · May 22, 2015 · Viewed 25.2k times · Source

I am starting to build up a simple BLE network with a microcontroller and a raspberry pi (tardis BLE dongle). As a starting point, I am looking for a simple C or C++ example to read/write a BLE device, similar to what I am able to do over the command line. The examples I have found so far are quite complicated. As a BLE beginner I need some very simple examples to build from before moving forward with a more complicated design. I am okay with hard-coding the BLE device name as I have in the gatttool example below.

Here is how I currently use the command line options from Bluez.

From the command line I am able to use:

$ sudo hcitool lescan
LE Scan ...
BB:A0:50:02:18:07 MyDevice

Next I am able to connect to the device on the command line with gatttool:

$ sudo gatttol -b BB:A0:50:02:18:07 -I
[BB:A0:50:02:18:07][LE]> connect
Attempting to connect to BB:A0:50:02:18:07
Connection successful

Finally I am able to read and write using the appropriate handles

[BB:A0:50:02:18:07][LE]> char-write-req 000f 0100
Characteristic value was written successfully
[BB:A0:50:02:18:07][LE]> char-write-cmd 0011 4C467A

Some sites I have used for initial research and to get started:
http://people.csail.mit.edu/albert/bluez-intro/c404.html
https://github.com/carsonmcdonald/bluez-experiments/blob/master/experiments/scantest.c

Answer

kaylum picture kaylum · May 22, 2015

Something simple? How short is a piece of string? I personally think that the gatttool code itself is simple enough to follow and extract for your own purposes (I've done it recently). But if that's really not suitable for you then another option is libgatt. It's essentially the same code that gatttool uses but has been bundled more conveniently into a public library API. Have a look at gatt.h which has connect/read/write etc. Hopefully it should be self evident how to use that.