use btleplug::api::{bleuuid::BleUuid, Central, CentralEvent, Manager as _, ScanFilter};
use btleplug::platform::{Adapter, Manager};
use futures::stream::StreamExt;
use std::error::Error;
async fn get_central(manager: &Manager) -> Adapter {
let adapters = manager.adapters().await.unwrap();
adapters.into_iter().nth(0).unwrap()
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
pretty_env_logger::init();
let manager = Manager::new().await?;
let central = get_central(&manager).await;
let mut events = central.events().await?;
central.start_scan(ScanFilter::default()).await?;
while let Some(event) = events.next().await {
match event {
CentralEvent::DeviceDiscovered(id) => {
println!("DeviceDiscovered: {:?}", id);
}
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(())
}