This crate implements the Broadcast Assistant role defined in the Bluetooth SIG Basic Audio Profile (BAP) v1.0.2 specification.
A Broadcast Assistant is a Bluetooth Low Energy (LE) device (typically a smartphone or tablet) that discovers Broadcast Sources and assists Broadcast Sinks (Scan Delegators) in synchronizing to LE Audio broadcast streams.
The bt-broadcast-assistant crate handles:
Broadcast Source Discovery & Synchronization:
0x1852) to extract the Broadcast_ID and Broadcast_Name.bt_gatt::periodic_advertising::PeriodicAdvertising trait when the Basic Audio Announcement Endpoint (BASE) structure (0x1851) is needed.Scan Delegator Management:
0x184F).bt_bass::BroadcastAudioScanServiceClient:Platform Independence:
bt-gatt crate interface to remain Bluetooth stack- and async executor-agnostic.bt-gatt-fuchsia (FuchsiaTypes).+--------------------------------+ | BroadcastAssistant<T> | +--------------------------------+ / \ +-----------------------+ +-----------------------+ | EventStream<T> | | Peer<T> | | (Source Discovery & | | (BASS Client for | | PA Sync via BASE) | | Scan Delegator) | +-----------------------+ +-----------------------+ \ / +--------------------------------+ | T: bt_gatt::GattTypes | +--------------------------------+
# use futures::StreamExt; # use bt_broadcast_assistant::assistant::Error; use bt_broadcast_assistant::{event::Event, BroadcastAssistant}; use bt_gatt::central::Central; async fn run_assistant<T: bt_gatt::GattTypes + 'static>(central: T::Central) -> Result<(), Error> { let mut assistant = BroadcastAssistant::<T>::new(central); // Start scanning for broadcast sources (EA + PA sync) let mut event_stream = assistant.start()?; while let Some(event_res) = event_stream.next().await { match event_res? { Event::FoundBroadcastSource { peer, advertising_sid, source } => { println!("Discovered complete broadcast source: {:?}", source); // Can now add this source to a connected scan delegator peer! } Event::CouldNotParseAdvertisingData { peer, error } => { eprintln!("Failed to parse advertisement from peer {:?}: {:?}", peer, error); } } } Ok(()) }