#ble #bluetooth #bluez

bluez-async

An async wrapper around the D-Bus interface of BlueZ (the Linux Bluetooth daemon), supporting GATT client (central) functionality

8 releases (4 breaking)

0.5.0 Oct 2, 2021
0.4.0 Aug 20, 2021
0.3.1 Mar 11, 2021
0.3.0 Feb 27, 2021
0.1.1 Jan 14, 2021

#30 in Hardware support

Download history 56/week @ 2021-08-08 95/week @ 2021-08-15 159/week @ 2021-08-22 64/week @ 2021-08-29 134/week @ 2021-09-05 125/week @ 2021-09-12 57/week @ 2021-09-19 150/week @ 2021-09-26 67/week @ 2021-10-03 49/week @ 2021-10-10 136/week @ 2021-10-17 93/week @ 2021-10-24 91/week @ 2021-10-31 95/week @ 2021-11-07 99/week @ 2021-11-14 96/week @ 2021-11-21

330 downloads per month
Used in 11 crates (5 directly)

MIT/Apache

110KB
2.5K SLoC

BlueZ async client

crates.io page docs.rs page

bluez-async is an async wrapper around the D-Bus interface of BlueZ, the Linux Bluetooth daemon. It provides type-safe interfaces to a subset of the Bluetooth client (i.e. central, in Bluetooth terminology) interfaces exposed by BlueZ, focussing on the Generic Attribute Profile (GATT) of Bluetooth Low Energy (BLE).

This crate is incomplete, experimental, and may not be supported.

Usage

// Create a new session. This establishes the D-Bus connection to talk to BlueZ. In this case we
// ignore the join handle, as we don't intend to run indefinitely.
let (_, session) = BluetoothSession::new().await?;

// Start scanning for Bluetooth devices, and wait a few seconds for some to be discovered.
session.start_discovery().await?;
time::sleep(Duration::from_secs(5)).await;
session.stop_discovery().await?;

// Get a list of devices which are currently known.
let devices = session.get_devices().await?;

// Find the device we care about.
let device = devices
    .into_iter()
    .find(|device| device.name.as_deref() == Some("My device"))
    .unwrap();

// Connect to it.
session.connect(&device.id).await?;

// Look up a GATT service and characteristic by short UUIDs.
let service = session
    .get_service_by_uuid(&device.id, uuid_from_u16(0x1234))
    .await?;
let characteristic = session
    .get_characteristic_by_uuid(&service.id, uuid_from_u32(0x1235))
    .await?;

// Read the value of the characteristic and write a new value.
println!(
    "Value: {:?}",
    session
        .read_characteristic_value(&characteristic.id)
        .await?
);
session
    .write_characteristic_value(&characteristic.id, vec![1, 2, 3])
    .await?;

// Subscribe to notifications on the characteristic and print them out.
let mut events = session
    .characteristic_event_stream(&characteristic.id)
    .await?;
session.start_notify(&characteristic.id).await?;
while let Some(event) = events.next().await {
    if let BluetoothEvent::Characteristic {
        id,
        event: CharacteristicEvent::Value { value },
    } = event
    {
        println!("Update from {}: {:?}", id, value);
    }
}

For some more complete examples, see the examples directory.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~6MB
~107K SLoC

6Xa