diff --git a/server/src/bonding_helper.rs b/server/src/bonding_helper.rs index 2c6d340..1c751b4 100644 --- a/server/src/bonding_helper.rs +++ b/server/src/bonding_helper.rs @@ -7,18 +7,35 @@ use bluer::{ agent::{Agent, ReqResult, RequestConfirmation}, Address, Session, }; -use log::info; +use log::{info, warn}; use tokio::{sync::mpsc, time::timeout}; +const BT_NAME_PREFIX: &str = "cedar-"; + pub struct BluetoothDevice { pub name: String, pub address: String, } -pub async fn get_adapter_alias() -> Result> { +pub async fn get_adapter_alias( + serial: &str, +) -> Result> { let session = Session::new().await?; let adapter = session.default_adapter().await?; - let alias = adapter.alias().await?; + let mut alias = adapter.alias().await?; + let expected_alias = generate_bluetooth_name(serial); + if alias != expected_alias { + info!("Updating Bluetooth alias"); + match adapter.set_alias(expected_alias.clone()).await { + Ok(_) => { + alias = expected_alias.to_string(); + } + Err(e) => { + warn!("Unable to update alias: {:?}", e); + } + } + } + info!("Current device alias: {}", alias); Ok(alias) } @@ -114,4 +131,12 @@ pub async fn get_bonded_devices( }); } Ok(result) -} \ No newline at end of file +} + +fn generate_bluetooth_name(serial: &str) -> String { + if serial.len() < 3 { + warn!("Unexpected length for serial number: {}", serial); + return "cedar".to_string(); + } + format!("{}{}", BT_NAME_PREFIX, &serial[serial.len() - 3..]) +} diff --git a/server/src/cedar_server.rs b/server/src/cedar_server.rs index 443faad..447f96f 100644 --- a/server/src/cedar_server.rs +++ b/server/src/cedar_server.rs @@ -1527,7 +1527,7 @@ impl Cedar for MyCedar { &self, _request: tonic::Request, ) -> Result, tonic::Status> { - let bt_name = match get_adapter_alias().await { + let bt_name = match get_adapter_alias(&self.serial_number).await { Ok(name) => name, Err(e) => { warn!("Unable to get Bluetooth name: {}", e);