use btleplug::api::{
Central, CentralEvent, Manager as _, Peripheral, ScanFilter, bleuuid::BleUuid,
};
use btleplug::platform::{Adapter, Manager};
use futures::stream::StreamExt;
async fn get_central(manager: &Manager) -> Adapter {
let adapters = manager.adapters().await.unwrap();
adapters.into_iter().nth(0).unwrap()
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
pretty_env_logger::init();
let manager = Manager::new().await?;
let central = get_central(&manager).await;
let central_state = central.adapter_state().await.unwrap();
println!("CentralState: {:?}", central_state);
let mut events = central.events().await?;
central.start_scan(ScanFilter::default()).await?;
while let Some(event) = events.next().await {
match event {
CentralEvent::DeviceDiscovered(id) => {
let peripheral = central.peripheral(&id).await?;
let properties = peripheral.properties().await?;
let name = properties
.and_then(|p| p.local_name)
.map(|local_name| format!("Name: {local_name}"))
.unwrap_or_default();
println!("DeviceDiscovered: {:?} {}", id, name);
}
CentralEvent::StateUpdate(state) => {
println!("AdapterStatusUpdate {:?}", state);
}
CentralEvent::DeviceConnected(id) => {
println!("DeviceConnected: {:?}", id);
}
CentralEvent::DeviceDisconnected(id) => {
println!("DeviceDisconnected: {:?}", id);
}
CentralEvent::ManufacturerDataAdvertisement {
id,
manufacturer_data,
} => {
println!(
"ManufacturerDataAdvertisement: {:?}, {:?}",
id, manufacturer_data
);
}
CentralEvent::ServiceDataAdvertisement { id, service_data } => {
println!("ServiceDataAdvertisement: {:?}, {:?}", id, service_data);
}
CentralEvent::ServicesAdvertisement { id, services } => {
let services: Vec<String> =
services.into_iter().map(|s| s.to_short_string()).collect();
println!("ServicesAdvertisement: {:?}, {:?}", id, services);
}
_ => {}
}
}
Ok(())
}