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