Crates.io | bluer |
lib.rs | bluer |
version | 0.17.3 |
source | src |
created_at | 2021-07-06 09:57:55.669801 |
updated_at | 2024-07-15 09:17:49.61425 |
description | BlueR: official Rust interface to the Linux Bluetooth protocol stack (BlueZ) |
homepage | |
repository | https://github.com/bluez/bluer |
max_upload_size | |
id | 419376 |
size | 797,416 |
This library provides the official Rust interface to the Linux Bluetooth protocol stack (BlueZ). Both publishing local and consuming remote GATT services using idiomatic Rust code is supported. L2CAP and RFCOMM sockets are presented using an API similar to Tokio networking.
The following functionality is provided:
AsyncRead
and AsyncWrite
streams for notify and write operationsAsyncRead
and AsyncWrite
streamsAsyncRead
and AsyncWrite
supportAsyncRead
and AsyncWrite
supportCurrently, some classic Bluetooth (BR/EDR) functionality is missing. However, pull requests and contributions are welcome!
To use BlueR as a library, run the following command in your project directory:
cargo add -F full bluer
This will add the latest version of BlueR with all features enabled as a dependency to your Cargo.toml
.
The following crate features are available.
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.id
: Enables database of assigned numbers.l2cap
: Enables L2CAP sockets.rfcomm
: Enables RFCOMM sockets.mesh
: Enables Bluetooth mesh functionality.serde
: Enables serialization and deserialization of some data types.To enable all crate features specify the full
crate feature.
The minimum support Rust version (MSRV) is 1.75.
This library has been tested with BlueZ 5.60. 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.
For mesh
feature Bluetooth mesh daemon must be running and configured for access over D-Bus.
The following options in /etc/bluetooth/main.conf
are helpful when working with GATT services.
[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.
When cloning this repository make sure to use the following command. Otherwise the build will fail with file not found errors.
git clone --recursive https://github.com/bluez/bluer.git
D-Bus development headers are required for building.
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
fixes persistent issues with device connectivity.
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.
le_passive_scan: LE passive scan & subscribe to updates for discovered peripheral(s).
list_adapters: List installed Bluetooth adapters and their properties.
mesh_sensor_client: Simple Bluetooth mesh client sending sensor model messages
mesh_sensor_server: Simple Bluetooth mesh server receiving sensor model messages
mesh_provisioner: Simple Bluetooth mesh provisioner
rfcomm_client: Simple RFCOMM socket client that connects to a socket and sends and receives test data.
rfcomm_server: Corresponding RFCOMM socket server that echos received data.
Use cargo run --all-features --example <name>
to run a particular example application.
See the BlueR tools crate for tools that build on this library.
This project started as a fork of blurz but has since then become a full rewrite.
It was published under the name blez
before it was designated the official Rust
interface to BlueZ and renamed to BlueR.
Documentation has been mostly copied from the BlueZ API specification, but
also adapted where it makes sense.