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.
#!/bin/bash sleep 1 #LOG exec 2>&1 ulimit -aH #RUN 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.
#!/bin/bash sleep 5 #LOG exec 2>&1 ulimit -aH #RUN export TZ="UTC" exec /usr/sbin/bluetoothd -n
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 https://github.com/bluez/bluez
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 ./bootstrap ./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) req.connect(True) for n in range(10): req.write_cmd(0x000E, bytes([0x01,0x01])) time.sleep(1) req.write_cmd(0x000E, bytes([0x01,0x00])) time.sleep(1) req.disconnect()