Skip to content

Commit 6e5120e

Browse files
authored
add service uuids to notifications (#445)
* add service uuids to notifications * make find_characteristic_by_id return service info
1 parent d91a54c commit 6e5120e

File tree

6 files changed

+30
-9
lines changed

6 files changed

+30
-9
lines changed

src/api/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ impl AddressType {
8686
pub struct ValueNotification {
8787
/// UUID of the characteristic that fired the notification.
8888
pub uuid: Uuid,
89+
/// UUID of the service that contains the characteristic.
90+
pub service_uuid: Uuid,
8991
/// The new value of the characteristic.
9092
pub value: Vec<u8>,
9193
}

src/bluez/peripheral.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,12 @@ fn value_notification(
298298
event: CharacteristicEvent::Value { value },
299299
} if id.service().device() == *device_id => {
300300
let services = services.lock().unwrap();
301-
let uuid = find_characteristic_by_id(&services, id)?.uuid;
302-
Some(ValueNotification { uuid, value })
301+
let (charac, service) = find_characteristic_by_id(&services, id.clone())?;
302+
Some(ValueNotification {
303+
uuid: charac.uuid,
304+
service_uuid: service.uuid,
305+
value,
306+
})
303307
}
304308
_ => None,
305309
}
@@ -308,11 +312,11 @@ fn value_notification(
308312
fn find_characteristic_by_id(
309313
services: &HashMap<Uuid, ServiceInternal>,
310314
characteristic_id: CharacteristicId,
311-
) -> Option<&CharacteristicInfo> {
315+
) -> Option<(&CharacteristicInfo, &ServiceInfo)> {
312316
for service in services.values() {
313317
for characteristic in service.characteristics.values() {
314318
if characteristic.info.id == characteristic_id {
315-
return Some(&characteristic.info);
319+
return Some((&characteristic.info, &service.info));
316320
}
317321
}
318322
}

src/corebluetooth/internal.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ pub enum CoreBluetoothReply {
157157
#[derive(Debug)]
158158
pub enum PeripheralEventInternal {
159159
Disconnected,
160-
Notification(Uuid, Vec<u8>),
160+
Notification(Uuid, Uuid, Vec<u8>),
161161
ManufacturerData(u16, Vec<u8>, i16),
162162
ServiceData(HashMap<Uuid, Vec<u8>>, i16),
163163
Services(Vec<Uuid>, i16),
@@ -818,6 +818,7 @@ impl CoreBluetoothInternal {
818818
.event_sender
819819
.send(PeripheralEventInternal::Notification(
820820
characteristic_uuid,
821+
service_uuid,
821822
data,
822823
))
823824
.await

src/corebluetooth/peripheral.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,12 @@ impl Peripheral {
118118

119119
loop {
120120
match event_receiver.next().await {
121-
Some(PeripheralEventInternal::Notification(uuid, data)) => {
122-
let notification = ValueNotification { uuid, value: data };
121+
Some(PeripheralEventInternal::Notification(uuid, service_uuid, data)) => {
122+
let notification = ValueNotification {
123+
uuid,
124+
service_uuid,
125+
value: data,
126+
};
123127

124128
// Note: we ignore send errors here which may happen while there are no
125129
// receivers...

src/droidplug/peripheral.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use std::{
2626
pin::Pin,
2727
sync::{Arc, Mutex},
2828
};
29+
use uuid::Uuid;
2930

3031
use super::jni::{
3132
global_jvm,
@@ -367,7 +368,11 @@ impl api::Peripheral for Peripheral {
367368
let characteristic = JBluetoothGattCharacteristic::from_env(&env, item)?;
368369
let uuid = characteristic.get_uuid()?;
369370
let value = characteristic.get_value()?;
370-
Ok(ValueNotification { uuid, value })
371+
Ok(ValueNotification {
372+
uuid,
373+
service_uuid: Uuid::default(),
374+
value,
375+
}) // TODO: get service UUID
371376
}
372377
Err(err) => Err(err),
373378
})

src/winrtble/peripheral.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -509,9 +509,14 @@ impl ApiPeripheral for Peripheral {
509509
.ok_or_else(|| Error::NotSupported("Characteristic not found for subscribe".into()))?;
510510
let notifications_sender = self.shared.notifications_channel.clone();
511511
let uuid = characteristic.uuid;
512+
let service_uuid = characteristic.service_uuid;
512513
ble_characteristic
513514
.subscribe(Box::new(move |value| {
514-
let notification = ValueNotification { uuid, value };
515+
let notification = ValueNotification {
516+
uuid,
517+
service_uuid,
518+
value,
519+
};
515520
// Note: we ignore send errors here which may happen while there are no
516521
// receivers...
517522
let _ = notifications_sender.send(notification);

0 commit comments

Comments
 (0)