#ble #bluetooth #bluez #peripheral #bluetooth-le #core-bluetooth #api-bindings

ble-peripheral-rust

A cross-platform Rust crate for building Bluetooth Low Energy peripherals

2 unstable releases

new 0.2.0 Dec 28, 2024
0.1.0 Oct 27, 2024

#346 in Embedded development

MIT license

98KB
2.5K SLoC

Ble Peripheral Rust

Crates.io Version docs.rs page Crates.io Downloads Crates.io License

BlePeripheralRust is a cross-platform Rust crate that allows your device to function as a Bluetooth Low Energy (BLE) peripheral, enables you to define BLE services, characteristics, and handle BLE events asynchronously.

Getting Started

Check out the examples folder for detailed usage, or start by running:

cargo run --example server

Usage

Initialize the Peripheral

To initialize the peripheral, create a channel to handle events, instantiate the peripheral, and wait until the BLE device is powered on:

let (sender_tx, mut receiver_rx) = channel::<PeripheralEvent>(256);
let mut peripheral = Peripheral::new(sender_tx).await.unwrap();

// Ensure the peripheral is powered on
while !peripheral.is_powered().await.unwrap() {}

Add Services

Define and add a BLE service, including characteristics, descriptors with specified properties and permissions:

peripheral.add_service(
    &Service {
        uuid: Uuid::from_short(0x1234_u16),
        primary: true,
        characteristics: vec![
            Characteristic {
                uuid: Uuid::from_short(0x2A3D_u16),
                ..Default::default()
            }
        ],
    }
).await;

Start Advertising

Begin advertising the BLE peripheral to make it discoverable by other devices:

peripheral.start_advertising("RustBLE", &[Uuid::from_short(0x1234_u16)]).await;

Handle Events

Manage BLE events such as characteristic subscription updates, read requests, and write requests in an asynchronous loop:

while let Some(event) = receiver_rx.recv().await {
    match event {
        PeripheralEvent::CharacteristicSubscriptionUpdate { request, subscribed } => {
            // Send notifications to subscribed clients
        }
        PeripheralEvent::ReadRequest { request, offset, responder } => {
            // Respond to Read request
            responder.send(ReadRequestResponse {
                value: String::from("Hello").into(),
                response: RequestResponse::Success,
            });
        }
        PeripheralEvent::WriteRequest { request, offset, value, responder } => {
            // Respond to Write request
            responder.send(WriteRequestResponse {
                response: RequestResponse::Success,
            });
        },
        - => {}
    }
}

Update Characteristics

Send characteristic updates to all clients listening to the characteristic:

peripheral.update_characteristic(Uuid::from_short(0x2A3D_u16), "Ping!".into()).await;

Notes

This crate is inspired by bluster. Contributions, bug reports, and feature requests are welcome!

Dependencies

~3–44MB
~692K SLoC