connected/
connected.rs

1use std::error::Error;
2
3use bluest::Adapter;
4use tracing::info;
5use tracing::metadata::LevelFilter;
6
7#[tokio::main]
8async fn main() -> Result<(), Box<dyn Error>> {
9    use tracing_subscriber::prelude::*;
10    use tracing_subscriber::{fmt, EnvFilter};
11
12    tracing_subscriber::registry()
13        .with(fmt::layer())
14        .with(
15            EnvFilter::builder()
16                .with_default_directive(LevelFilter::INFO.into())
17                .from_env_lossy(),
18        )
19        .init();
20
21    let adapter = Adapter::default().await.ok_or("Bluetooth adapter not found")?;
22    adapter.wait_available().await?;
23
24    info!("getting connected devices");
25    let devices = adapter.connected_devices().await?;
26    for device in devices {
27        info!("found {:?}", device);
28        adapter.connect_device(&device).await?;
29        let services = device.services().await?;
30        for service in services {
31            info!("  {:?}", service);
32            let characteristics = service.characteristics().await?;
33            for characteristic in characteristics {
34                info!("    {:?}", characteristic);
35                let props = characteristic.properties().await?;
36                info!("      props: {:?}", props);
37                if props.read {
38                    info!("      value: {:?}", characteristic.read().await);
39                }
40                if props.write_without_response {
41                    info!("      max_write_len: {:?}", characteristic.max_write_len());
42                }
43
44                let descriptors = characteristic.descriptors().await?;
45                for descriptor in descriptors {
46                    info!("      {:?}: {:?}", descriptor, descriptor.read().await);
47                }
48            }
49        }
50    }
51    info!("done");
52
53    Ok(())
54}