Struct bluer::monitor::MonitorManager
source · pub struct MonitorManager { /* private fields */ }
Available on crate feature
bluetoothd
only.Expand description
Advertisement monitor manager.
Use Adapter::monitor
to obtain an instance.
Once a monitoring job is activated by BlueZ, the client can expect to get notified on the targeted advertisements no matter if there is an ongoing discovery session.
Use this to target advertisements and drop it to stop monitoring advertisements.
Implementations§
source§impl MonitorManager
impl MonitorManager
sourcepub async fn register(
&self,
advertisement_monitor: Monitor
) -> Result<MonitorHandle>
pub async fn register( &self, advertisement_monitor: Monitor ) -> Result<MonitorHandle>
Registers an advertisement monitor target.
Returns a handle to receive events.
Examples found in repository?
examples/le_passive_scan.rs (lines 55-64)
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 78 79 80 81
async fn main() -> bluer::Result<()> {
env_logger::init();
let adapter_name = std::env::args().nth(1);
let data_type: u8 = match std::env::args().nth(2) {
Some(s) => parse_u8_maybe_hex(&s).expect("Failed to parse AD type"),
None => 0xff,
};
let start_position: u8 = match std::env::args().nth(3) {
Some(s) => parse_u8_maybe_hex(&s).expect("Failed to parse or-pattern start position"),
None => 0x00,
};
let filter_string: Vec<String> = std::env::args().skip(4).collect();
let content: Vec<u8> = if !filter_string.is_empty() {
filter_string.iter().map(|s| parse_u8_maybe_hex(s).expect("Failed to parse or-pattern data")).collect()
} else {
vec![0xff, 0xff]
};
if content.is_empty() {
panic!("No filter bytes provided");
}
let pattern = Pattern { data_type, start_position, content };
let session = bluer::Session::new().await?;
let adapter = match adapter_name {
Some(name) => session.adapter(&name)?,
None => session.default_adapter().await?,
};
println!("Running le_passive_scan on adapter {} with or-pattern {:?}", adapter.name(), pattern);
adapter.set_powered(true).await?;
let mm = adapter.monitor().await?;
let mut monitor_handle = mm
.register(Monitor {
monitor_type: bluer::monitor::Type::OrPatterns,
rssi_low_threshold: None,
rssi_high_threshold: None,
rssi_low_timeout: None,
rssi_high_timeout: None,
rssi_sampling_period: Some(RssiSamplingPeriod::First),
patterns: Some(vec![pattern]),
..Default::default()
})
.await?;
while let Some(mevt) = &monitor_handle.next().await {
if let MonitorEvent::DeviceFound(devid) = mevt {
println!("Discovered device {:?}", devid);
let dev = adapter.device(devid.device)?;
tokio::spawn(async move {
let mut events = dev.events().await.unwrap();
while let Some(ev) = events.next().await {
println!("On device {:?}, received event {:?}", dev, ev);
}
});
}
}
Ok(())
}
Trait Implementations§
source§impl Debug for MonitorManager
impl Debug for MonitorManager
Auto Trait Implementations§
impl Freeze for MonitorManager
impl !RefUnwindSafe for MonitorManager
impl Send for MonitorManager
impl Sync for MonitorManager
impl Unpin for MonitorManager
impl !UnwindSafe for MonitorManager
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more