This is an old revision of the document!
Table of Contents
Bluetooth
There are two standards in use known as BT classic and BT low energy.
Anything other than BLE is considered obsolete now.
HCI / LMP | Version |
---|---|
0 | 1.0b |
1 | 1.1 |
2 | 1.2 |
3 | 2.0+EDR |
4 | 2.1+EDR |
5 | 3.0+HS |
6 | 4.0 |
7 | 4.1 |
8 | 4.2 |
9 | 5.0 |
10 | 5.1 |
11 | 5.2 |
12 | 5.3 |
BT 3.0+HS utilises WiFi. BT 4.0 onward is BLE, anything prior is BDR/EDR.
See bluetooth for Linux Bluetooth devices and setup.
Services
Development has two service dependencies, dbus and bluetoothd.
DBUS
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
BLUETOOTHD
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
C development
Development in C is mostly about reading the code examples.
Headers
Install dev headers for the current installation of bluez
apt install libbluetooth-dev
Source
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
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
Test 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 p2pServer demo
[GATT client]# write-value -w 0x000E 0x01 0x01 Write command sent [GATT client]# write-value -w 0x000E 0x01 0x00 Write command sent [GATT client]#
Python
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 p2pServer 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()