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}