See bluetooth for Linux Bluetooth devices and setup.


Development has two service dependencies, dbus and bluetoothd.


I normally disable dbus with systemd and here is how to enable this service with `runit' if preferred.

sleep 1

exec 2>&1
ulimit -aH

export TZ="UTC"
rm -Rf /var/run/dbus
mkdir -p /var/run/dbus
exec dbus-daemon --syslog --syslog-only --nofork --config-file=/usr/share/dbus-1/system.conf

Install bluez and various tools if not already installed

apt install bluez bluez-tools bluez-test-tools bluez-hcidump

I prefer to run Bluetoothd from `runit'

This run file can work but it should wait until dbus is ready before starting.

See the wait method of runit to detect /var/run/dbus/pid.

sleep 5

exec 2>&1
ulimit -aH

export TZ="UTC"
exec /usr/sbin/bluetoothd -n

C development

Development in C is mostly about reading the code examples.


Install dev headers for the current installation of bluez

apt install libbluetooth-dev

Access source code for documentation of how to use bluez

git clone

bluez source code demonstrates how to access BT devices via dbus in the src directory or the API in the attrib and tools directories.


Build the source to create tools

sudo apt-get install glib2.0-dev libdbus-1-dev libical-dev python3-docutils
./configure --prefix=/opt/bt --enable-experimental --enable-deprecated

Test STM32WB15CC BLE device.

./tools/btgatt-client -d 00:80:E1:22:F9:7C
Connecting to device... Done
[GATT client]# Service Added - UUID: 00001801-0000-1000-8000-00805f9b34fb start: 0x0001 end: 0x0004
[GATT client]# Service Added - UUID: 00001800-0000-1000-8000-00805f9b34fb start: 0x0005 end: 0x000b
[GATT client]# Service Added - UUID: 0000fe40-cc7a-482a-984a-7f2ed5b3e58f start: 0x000c end: 0x0011
[GATT client]# GATT discovery procedures complete
[GATT client]#
service - start: 0x0001, end: 0x0004, type: primary, uuid: 00001801-0000-1000-8000-00805f9b34fb
          charac - start: 0x0002, value: 0x0003, props: 0x20, ext_props: 0x0000, uuid: 00002a05-0000-1000-8000-00805f9b34fb
                  descr - handle: 0x0004, uuid: 00002902-0000-1000-8000-00805f9b34fb

service - start: 0x0005, end: 0x000b, type: primary, uuid: 00001800-0000-1000-8000-00805f9b34fb
          charac - start: 0x0006, value: 0x0007, props: 0x0a, ext_props: 0x0000, uuid: 00002a00-0000-1000-8000-00805f9b34fb
          charac - start: 0x0008, value: 0x0009, props: 0x02, ext_props: 0x0000, uuid: 00002a01-0000-1000-8000-00805f9b34fb
          charac - start: 0x000a, value: 0x000b, props: 0x02, ext_props: 0x0000, uuid: 00002a04-0000-1000-8000-00805f9b34fb

service - start: 0x000c, end: 0x0011, type: primary, uuid: 0000fe40-cc7a-482a-984a-7f2ed5b3e58f
          charac - start: 0x000d, value: 0x000e, props: 0x06, ext_props: 0x0000, uuid: 0000fe41-8e22-4541-9d4c-21edae82ed19
          charac - start: 0x000f, value: 0x0010, props: 0x10, ext_props: 0x0000, uuid: 0000fe42-8e22-4541-9d4c-21edae82ed19
                  descr - handle: 0x0011, uuid: 00002902-0000-1000-8000-00805f9b34fb

[GATT client]# ^C

Shutting down...

LED on/off for demo connection above.

[GATT client]# write-value -w 0x000E 0x01 0x01
Write command sent
[GATT client]# write-value -w 0x000E 0x01 0x00
Write command sent
[GATT client]#


It's certainly a lot easier to write code to access BLE devices in Python and preferred for demo purposes and maybe even end use cases.

apt install python3-gattlib

Example for the STM32WB15CC BLE demo.

import sys, time

from gattlib import GATTRequester

req = GATTRequester("00:80:E1:22:F9:7C", False)


for n in range(10):
    req.write_cmd(0x000E, bytes([0x01,0x01]))
    req.write_cmd(0x000E, bytes([0x01,0x00]))

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies