mirror of
https://github.com/servo/servo.git
synced 2025-08-10 07:55:33 +01:00
serviceData and manufacturerData support
This commit is contained in:
parent
bcf4184483
commit
1b1b07ef42
19 changed files with 830 additions and 83 deletions
|
@ -130,26 +130,63 @@ fn matches_filter(device: &BluetoothDevice, filter: &BluetoothScanfilter) -> boo
|
|||
}
|
||||
}
|
||||
|
||||
// Step 4.
|
||||
// TODO: Implement get_manufacturer_data in device crate.
|
||||
// if let Some(manufacturer_id) = filter.get_manufacturer_id() {
|
||||
// if !device.get_manufacturer_data().contains_key(manufacturer_id) {
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// Step 5.
|
||||
// TODO: Implement get_device_data in device crate.
|
||||
// if !filter.get_service_data_uuid().is_empty() {
|
||||
// if !device.get_service_data().contains_key(filter.get_service_data_uuid()) {
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
// Step 4.
|
||||
if let Some(ref manufacturer_data) = filter.get_manufacturer_data() {
|
||||
let advertised_manufacturer_data = match device.get_manufacturer_data() {
|
||||
Ok(data) => data,
|
||||
Err(_) => return false,
|
||||
};
|
||||
for (ref id, &(ref prefix, ref mask)) in manufacturer_data.iter() {
|
||||
if let Some(advertised_data) = advertised_manufacturer_data.get(id) {
|
||||
if !data_filter_matches(advertised_data, prefix, mask) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Step 5.
|
||||
if let Some(ref service_data) = filter.get_service_data() {
|
||||
let advertised_service_data = match device.get_service_data() {
|
||||
Ok(data) => data,
|
||||
Err(_) => return false,
|
||||
};
|
||||
for (uuid, &(ref prefix, ref mask)) in service_data.iter() {
|
||||
if let Some(advertised_data) = advertised_service_data.get(uuid.as_str()) {
|
||||
if !data_filter_matches(advertised_data, prefix, mask) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Step 6.
|
||||
true
|
||||
}
|
||||
|
||||
// https://webbluetoothcg.github.io/web-bluetooth/#bluetoothdatafilterinit-matches
|
||||
fn data_filter_matches(data: &[u8], prefix: &[u8], mask: &[u8]) -> bool {
|
||||
// Step 1-2: No need to copy the bytes here.
|
||||
// Step 3.
|
||||
if data.len() < prefix.len() {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Step 4.
|
||||
for ((data, mask), prefix) in data.iter().zip(mask.iter()).zip(prefix.iter()) {
|
||||
if data & mask != prefix & mask {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Step 5.
|
||||
true
|
||||
}
|
||||
|
||||
fn matches_filters(device: &BluetoothDevice, filters: &BluetoothScanfilterSequence) -> bool {
|
||||
if filters.has_empty_or_invalid_filter() {
|
||||
return false;
|
||||
|
|
|
@ -7,7 +7,7 @@ use device::bluetooth::{BluetoothAdapter, BluetoothDevice};
|
|||
use device::bluetooth::{BluetoothGATTCharacteristic, BluetoothGATTDescriptor, BluetoothGATTService};
|
||||
use std::borrow::ToOwned;
|
||||
use std::cell::RefCell;
|
||||
use std::collections::HashSet;
|
||||
use std::collections::{HashSet, HashMap};
|
||||
use std::error::Error;
|
||||
use std::string::String;
|
||||
use uuid::Uuid;
|
||||
|
@ -417,6 +417,29 @@ fn create_blocklisted_device(adapter: &BluetoothAdapter) -> Result<(), Box<Error
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn create_glucose_heart_rate_devices(adapter: &BluetoothAdapter) -> Result<(), Box<Error>> {
|
||||
let glucose_devie = try!(create_device_with_uuids(adapter,
|
||||
GLUCOSE_DEVICE_NAME.to_owned(),
|
||||
GLUCOSE_DEVICE_ADDRESS.to_owned(),
|
||||
vec![GLUCOSE_SERVICE_UUID.to_owned(),
|
||||
TX_POWER_SERVICE_UUID.to_owned()]));
|
||||
|
||||
let heart_rate_device_empty = try!(create_heart_rate_device(adapter, true));
|
||||
|
||||
let mut manufacturer_dta = HashMap::new();
|
||||
manufacturer_dta.insert(17, vec![1, 2, 3]);
|
||||
try!(glucose_devie.set_manufacturer_data(manufacturer_dta));
|
||||
|
||||
let mut service_data = HashMap::new();
|
||||
service_data.insert(GLUCOSE_SERVICE_UUID.to_owned(), vec![1, 2, 3]);
|
||||
try!(glucose_devie.set_service_data(service_data));
|
||||
|
||||
service_data = HashMap::new();
|
||||
service_data.insert(HEART_RATE_SERVICE_UUID.to_owned(), vec![1, 2, 3]);
|
||||
try!(heart_rate_device_empty.set_service_data(service_data));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn test(manager: &mut BluetoothManager, data_set_name: String) -> Result<(), Box<Error>> {
|
||||
let may_existing_adapter = manager.get_or_create_adapter();
|
||||
let adapter = match may_existing_adapter.as_ref() {
|
||||
|
@ -437,14 +460,7 @@ pub fn test(manager: &mut BluetoothManager, data_set_name: String) -> Result<(),
|
|||
},
|
||||
GLUCOSE_HEART_RATE_ADAPTER => {
|
||||
try!(set_adapter(adapter, GLUCOSE_HEART_RATE_ADAPTER.to_owned()));
|
||||
|
||||
let _glucose_devie = try!(create_device_with_uuids(adapter,
|
||||
GLUCOSE_DEVICE_NAME.to_owned(),
|
||||
GLUCOSE_DEVICE_ADDRESS.to_owned(),
|
||||
vec![GLUCOSE_SERVICE_UUID.to_owned(),
|
||||
TX_POWER_SERVICE_UUID.to_owned()]));
|
||||
|
||||
let _heart_rate_device_empty = try!(create_heart_rate_device(adapter, true));
|
||||
let _ = try!(create_glucose_heart_rate_devices(adapter));
|
||||
},
|
||||
UNICODE_DEVICE_ADAPTER => {
|
||||
try!(set_adapter(adapter, UNICODE_DEVICE_ADAPTER.to_owned()));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue