blob: ecddff77f3aee06dfcd4c6957000956e6ca87d7a [file] [log] [blame] [view]
# bt-gatt
An abstraction layer enabling Bluetooth Low Energy Central and Peripheral
crates to be built in a Bluetooth host stack agnostic way.
Crates that wish to interact with GATT Services or implement a Service should
use this crate, and accept or generalize on the `bt_gatt::Central` or
`bt_gatt::Peripheral` trait implementations, which will be provided by a
Bluetooth stack support Crate.
An example server and client for the Battery Service is provided.
Implementations for the following Bluetooth stacks exist in other crates, i.e.:
- bt-gatt-sapphire
- bt-gatt-fluoride
## Examples
### Connecting from a central to a service
```rust
async fn print_volume_changes(central: impl bt_gatt::central::Central) -> Result<(), Error> {
let peers_with_vcs = central.scan(VolumeControlService::UUID.into());
// Presumably we would match more than just the first peer at some point.
let Some(first_match) = matches.next().await else {
panic!("Stack shutdown before we found a peer");
};
let client = central.connect(first_match.id).await?;
let handle = client.find_service(VolumeControlService::UUID.into()).await?;
let service = handle.connect().await?;
let current_char = service.discover_characteristics(Some(0x2b7d_u16.into())).await?.pop().unwrap();
let mut current_state: [u8; 3] = [0; 3];
let _ = service.read_characteristic(current_char.handle, 0, &mut current_state[..]).await?;
let updates = service.subscribe(current_char.handle);
while let Some(Ok(notif)) = updates.next().await? {
let new_state = notif.value;
let muted = new_state[1] == 1;
let muted_str = if muted { " muted" } else { "" };
print!("New volume: {}{}", new_state[0], muted_str);
}
}
```
# Stack Connector Crates
Bluetooth stacks that wish to make use of the crates that abstract over bt-gatt to provide services or clients should provide a method to
use the core traits:
- [`central::Central`] enables scanning and connecting to peers, providing connections to [`client::Client`]
- [`server::Server`] enables publishing Services and accepting connections from peers
- [`peripheral::Peripheral`] enables advertising