Skip to content
This repository has been archived by the owner on Jul 6, 2021. It is now read-only.
/ blez Public archive

Asynchronous interface to official Bluetooth Low Energy APIs on Linux (BlueZ)

License

Notifications You must be signed in to change notification settings

surban/blez

Repository files navigation

BLEZ - Asynchronous Bluetooth Low Energy on Linux for Rust

crates.io page docs.rs page BSD-2-Clause license

Renamed to BlueR

BLEZ has been renamed to BlueR and is now the official Rust interface to BlueZ.

Development will continue in the BlueZ organization repository.

Please update your links and crate references.


This library provides an asynchronous, fully featured interface to the Bluetooth Low Energy (BLE) APIs of the official Linux Bluetooth protocol stack (BlueZ) for Rust. Both publishing local and consuming remote GATT services using idiomatic Rust code is supported. L2CAP sockets are presented using an API similar to Tokio networking.

The following functionality is provided:

  • Bluetooth adapters
    • enumeration
    • configuration of power, discoverability, name, etc.
    • hot-plug support through change events stream
  • Bluetooth devices
    • discovery
    • querying of address, name, class, signal strength (RSSI), etc.
    • Bluetooth Low Energy advertisements
    • change events stream
    • connecting and pairing
  • consumption of remote GATT services
    • GATT service discovery
    • read, write and notify operations on characteristics
    • read and write operations on characteristic descriptors
    • optional use of low-overhead AsyncRead and AsyncWrite streams for notify and write operations
  • publishing local GATT services
    • read, write and notify operations on characteristics
    • read and write operations on characteristic descriptors
    • two programming models supported
      • callback-based interface
      • low-overhead AsyncRead and AsyncWrite streams
  • sending Bluetooth Low Energy advertisements
  • Bluetooth authorization agent
  • efficient event dispatching
    • not affected by D-Bus match rule count
    • O(1) in number of subscriptions
  • L2CAP sockets
    • stream oriented
    • sequential packet oriented
    • datagram oriented
    • async IO interface with AsyncRead and AsyncWrite support
  • database of assigned numbers
    • manufacturer ids
    • GATT services, characteristics and descriptors

Classic Bluetooth is unsupported except for device discovery.

History

This project started as a fork of blurz but has since then become a full rewrite. Documentation has been mostly copied from the BlueZ API specification, but also adapted where it makes sense.

Crate features

All crate features are enabled by default.

  • bluetoothd: Enables all functions requiring a running Bluetooth daemon. For building, D-Bus library headers, provided by libdbus-1-dev on Debian, must be installed.
  • l2cap: Enables L2CAP sockets. For building, Bluetooth library headers, provided by libbluetooth-dev on Debian, must be installed.

Requirements

This library has been tested with BlueZ version 5.59 with additional patches from the master branch applied. Older versions might work, but be aware that many bugs related to GATT handling exist. Refer to the official changelog for details.

If any bluetoothd feature is used the Bluetooth daemon must be running and configured for access over D-Bus. On most distributions this should work out of the box.

Configuration

The following options in /etc/bluetooth/main.conf are helpful.

[GATT]
Cache = no
Channels = 1

This disables the GATT cache to avoid stale data during device discovery.

By only allowing one channel the extended attribute protocol (EATT) is disabled. If EATT is enabled, all GATT commands and notifications are sent over multiple L2CAP channels and can be reordered arbitrarily by lower layers of the protocol stack. This makes sequential data transmission over GATT characteristics more difficult.

Troubleshooting

The library returns detailed errors received from BlueZ.

Set the Rust log level to trace to see all D-Bus communications with BlueZ.

In some cases checking the Bluetooth system log might provide further insights. On Debian-based systems it can be displayed by executing journalctl -u bluetooth. Check the bluetoothd man page for increasing the log level.

Sometimes deleting the system Bluetooth cache at /var/lib/bluetooth and restarting bluetoothd is helpful.

Examples

Refer to the API documentation and examples folder for examples.

The following example applications are provided.

  • discover_devices: Discover Bluetooth devices and print their properties.

  • gatt_client: Simple GATT client that calls read, write and notify on a characteristic.

  • gatt_server_cb: Corresponding GATT server implemented using callback programming model.

  • gatt_server_io: Corresponding GATT server implemented using IO programming model.

  • gatt_echo_client: Simple GATT client that connects to a server and sends and receives test data.

  • gatt_echo_server: Corresponding GATT server that echos received data.

  • l2cap_client: Simple L2CAP socket client that connects to a socket and sends and receives test data.

  • l2cap_server: Corresponding L2CAP socket server that echos received data.

  • le_advertise: Register Bluetooth LE advertisement.

  • list_adapters: List installed Bluetooth adapters and their properties.

Use cargo run --example <name> to run a particular example application.

Tools

See the BLEZ tools crate for tools that build on this library.