1use std::error::Error;
2
3use bluest::Adapter;
4use futures_lite::StreamExt;
5use tracing::info;
6use tracing::metadata::LevelFilter;
7
8#[tokio::main]
9async fn main() -> Result<(), Box<dyn Error>> {
10 use tracing_subscriber::prelude::*;
11 use tracing_subscriber::{fmt, EnvFilter};
12
13 tracing_subscriber::registry()
14 .with(fmt::layer())
15 .with(
16 EnvFilter::builder()
17 .with_default_directive(LevelFilter::INFO.into())
18 .from_env_lossy(),
19 )
20 .init();
21
22 let adapter = Adapter::default().await.ok_or("Bluetooth adapter not found")?;
23 adapter.wait_available().await?;
24
25 info!("starting scan");
26 let mut scan = adapter.scan(&[]).await?;
27 info!("scan started");
28 while let Some(discovered_device) = scan.next().await {
29 info!(
30 "{}{}: {:?}",
31 discovered_device.device.name().as_deref().unwrap_or("(unknown)"),
32 discovered_device
33 .rssi
34 .map(|x| format!(" ({}dBm)", x))
35 .unwrap_or_default(),
36 discovered_device.adv_data.services
37 );
38 }
39
40 Ok(())
41}