Struct bluer::gatt::local::CharacteristicNotifier
source · pub struct CharacteristicNotifier { /* private fields */ }
Available on crate feature
bluetoothd
only.Expand description
Notification session.
Use this to send notifications or indications.
Implementations§
source§impl CharacteristicNotifier
impl CharacteristicNotifier
sourcepub fn confirming(&self) -> bool
pub fn confirming(&self) -> bool
True, if each notification is confirmed by the receiving device.
This is the case when the Indication mechanism is used.
Examples found in repository?
examples/gatt_server_cb.rs (line 86)
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
async fn main() -> bluer::Result<()> {
env_logger::init();
let session = bluer::Session::new().await?;
let adapter = session.default_adapter().await?;
adapter.set_powered(true).await?;
println!("Advertising on Bluetooth adapter {} with address {}", adapter.name(), adapter.address().await?);
let mut manufacturer_data = BTreeMap::new();
manufacturer_data.insert(MANUFACTURER_ID, vec![0x21, 0x22, 0x23, 0x24]);
let le_advertisement = Advertisement {
service_uuids: vec![SERVICE_UUID].into_iter().collect(),
manufacturer_data,
discoverable: Some(true),
local_name: Some("gatt_server".to_string()),
..Default::default()
};
let adv_handle = adapter.advertise(le_advertisement).await?;
println!("Serving GATT service on Bluetooth adapter {}", adapter.name());
let value = Arc::new(Mutex::new(vec![0x10, 0x01, 0x01, 0x10]));
let value_read = value.clone();
let value_write = value.clone();
let value_notify = value.clone();
let app = Application {
services: vec![Service {
uuid: SERVICE_UUID,
primary: true,
characteristics: vec![Characteristic {
uuid: CHARACTERISTIC_UUID,
read: Some(CharacteristicRead {
read: true,
fun: Box::new(move |req| {
let value = value_read.clone();
async move {
let value = value.lock().await.clone();
println!("Read request {:?} with value {:x?}", &req, &value);
Ok(value)
}
.boxed()
}),
..Default::default()
}),
write: Some(CharacteristicWrite {
write: true,
write_without_response: true,
method: CharacteristicWriteMethod::Fun(Box::new(move |new_value, req| {
let value = value_write.clone();
async move {
println!("Write request {:?} with value {:x?}", &req, &new_value);
let mut value = value.lock().await;
*value = new_value;
Ok(())
}
.boxed()
})),
..Default::default()
}),
notify: Some(CharacteristicNotify {
notify: true,
method: CharacteristicNotifyMethod::Fun(Box::new(move |mut notifier| {
let value = value_notify.clone();
async move {
tokio::spawn(async move {
println!(
"Notification session start with confirming={:?}",
notifier.confirming()
);
loop {
{
let mut value = value.lock().await;
println!("Notifying with value {:x?}", &*value);
if let Err(err) = notifier.notify(value.to_vec()).await {
println!("Notification error: {}", &err);
break;
}
println!("Decrementing each element by one");
for v in &mut *value {
*v = v.saturating_sub(1);
}
}
sleep(Duration::from_secs(5)).await;
}
println!("Notification session stop");
});
}
.boxed()
})),
..Default::default()
}),
..Default::default()
}],
..Default::default()
}],
..Default::default()
};
let app_handle = adapter.serve_gatt_application(app).await?;
println!("Service ready. Press enter to quit.");
let stdin = BufReader::new(tokio::io::stdin());
let mut lines = stdin.lines();
let _ = lines.next_line().await;
println!("Removing service and advertisement");
drop(app_handle);
drop(adv_handle);
sleep(Duration::from_secs(1)).await;
Ok(())
}
sourcepub fn is_stopped(&self) -> bool
pub fn is_stopped(&self) -> bool
True, if the notification session has been stopped by the receiving device.
sourcepub fn stopped(&self) -> impl Future<Output = ()>
pub fn stopped(&self) -> impl Future<Output = ()>
Resolves once the notification session has been stopped by the receiving device.
sourcepub async fn notify(&mut self, value: Vec<u8>) -> Result<()>
pub async fn notify(&mut self, value: Vec<u8>) -> Result<()>
Sends a notification or indication with the specified data to the receiving device.
If confirming is true, the function waits until a confirmation is received from the device before it returns.
This fails when the notification session has been stopped by the receiving device.
Examples found in repository?
examples/gatt_server_cb.rs (line 92)
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
async fn main() -> bluer::Result<()> {
env_logger::init();
let session = bluer::Session::new().await?;
let adapter = session.default_adapter().await?;
adapter.set_powered(true).await?;
println!("Advertising on Bluetooth adapter {} with address {}", adapter.name(), adapter.address().await?);
let mut manufacturer_data = BTreeMap::new();
manufacturer_data.insert(MANUFACTURER_ID, vec![0x21, 0x22, 0x23, 0x24]);
let le_advertisement = Advertisement {
service_uuids: vec![SERVICE_UUID].into_iter().collect(),
manufacturer_data,
discoverable: Some(true),
local_name: Some("gatt_server".to_string()),
..Default::default()
};
let adv_handle = adapter.advertise(le_advertisement).await?;
println!("Serving GATT service on Bluetooth adapter {}", adapter.name());
let value = Arc::new(Mutex::new(vec![0x10, 0x01, 0x01, 0x10]));
let value_read = value.clone();
let value_write = value.clone();
let value_notify = value.clone();
let app = Application {
services: vec![Service {
uuid: SERVICE_UUID,
primary: true,
characteristics: vec![Characteristic {
uuid: CHARACTERISTIC_UUID,
read: Some(CharacteristicRead {
read: true,
fun: Box::new(move |req| {
let value = value_read.clone();
async move {
let value = value.lock().await.clone();
println!("Read request {:?} with value {:x?}", &req, &value);
Ok(value)
}
.boxed()
}),
..Default::default()
}),
write: Some(CharacteristicWrite {
write: true,
write_without_response: true,
method: CharacteristicWriteMethod::Fun(Box::new(move |new_value, req| {
let value = value_write.clone();
async move {
println!("Write request {:?} with value {:x?}", &req, &new_value);
let mut value = value.lock().await;
*value = new_value;
Ok(())
}
.boxed()
})),
..Default::default()
}),
notify: Some(CharacteristicNotify {
notify: true,
method: CharacteristicNotifyMethod::Fun(Box::new(move |mut notifier| {
let value = value_notify.clone();
async move {
tokio::spawn(async move {
println!(
"Notification session start with confirming={:?}",
notifier.confirming()
);
loop {
{
let mut value = value.lock().await;
println!("Notifying with value {:x?}", &*value);
if let Err(err) = notifier.notify(value.to_vec()).await {
println!("Notification error: {}", &err);
break;
}
println!("Decrementing each element by one");
for v in &mut *value {
*v = v.saturating_sub(1);
}
}
sleep(Duration::from_secs(5)).await;
}
println!("Notification session stop");
});
}
.boxed()
})),
..Default::default()
}),
..Default::default()
}],
..Default::default()
}],
..Default::default()
};
let app_handle = adapter.serve_gatt_application(app).await?;
println!("Service ready. Press enter to quit.");
let stdin = BufReader::new(tokio::io::stdin());
let mut lines = stdin.lines();
let _ = lines.next_line().await;
println!("Removing service and advertisement");
drop(app_handle);
drop(adv_handle);
sleep(Duration::from_secs(1)).await;
Ok(())
}
Auto Trait Implementations§
impl Freeze for CharacteristicNotifier
impl !RefUnwindSafe for CharacteristicNotifier
impl Send for CharacteristicNotifier
impl Sync for CharacteristicNotifier
impl Unpin for CharacteristicNotifier
impl !UnwindSafe for CharacteristicNotifier
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