1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use bluer::{Adapter, AdapterEvent, Address, DeviceEvent};
use futures::{pin_mut, stream::SelectAll, StreamExt};
use std::{collections::HashSet, env};
async fn query_device(adapter: &Adapter, addr: Address) -> bluer::Result<()> {
let device = adapter.device(addr)?;
println!(" Address type: {}", device.address_type().await?);
println!(" Name: {:?}", device.name().await?);
println!(" Icon: {:?}", device.icon().await?);
println!(" Class: {:?}", device.class().await?);
println!(" UUIDs: {:?}", device.uuids().await?.unwrap_or_default());
println!(" Paried: {:?}", device.is_paired().await?);
println!(" Connected: {:?}", device.is_connected().await?);
println!(" Trusted: {:?}", device.is_trusted().await?);
println!(" Modalias: {:?}", device.modalias().await?);
println!(" RSSI: {:?}", device.rssi().await?);
println!(" TX power: {:?}", device.tx_power().await?);
println!(" Manufacturer data: {:?}", device.manufacturer_data().await?);
println!(" Service data: {:?}", device.service_data().await?);
Ok(())
}
#[tokio::main(flavor = "current_thread")]
async fn main() -> bluer::Result<()> {
let with_changes = env::args().any(|arg| arg == "--changes");
let filter_addr: HashSet<_> = env::args().filter_map(|arg| arg.parse::<Address>().ok()).collect();
env_logger::init();
let session = bluer::Session::new().await?;
let adapter = session.default_adapter().await?;
println!("Discovering devices using Bluetooth adapater {}\n", adapter.name());
adapter.set_powered(true).await?;
let device_events = adapter.discover_devices().await?;
pin_mut!(device_events);
let mut all_change_events = SelectAll::new();
loop {
tokio::select! {
Some(device_event) = device_events.next() => {
match device_event {
AdapterEvent::DeviceAdded(addr) => {
if !filter_addr.is_empty() && !filter_addr.contains(&addr) {
continue;
}
println!("Device added: {}", addr);
if let Err(err) = query_device(&adapter, addr).await {
println!(" Error: {}", &err);
}
if with_changes {
let device = adapter.device(addr)?;
let change_events = device.events().await?.map(move |evt| (addr, evt));
all_change_events.push(change_events);
}
}
AdapterEvent::DeviceRemoved(addr) => {
println!("Device removed: {}", addr);
}
_ => (),
}
println!();
}
Some((addr, DeviceEvent::PropertyChanged(property))) = all_change_events.next() => {
println!("Device changed: {}", addr);
println!(" {:?}", property);
}
else => break
}
}
Ok(())
}