ble-server test

This commit is contained in:
Conner 2024-09-30 11:47:21 +02:00
parent 317ff93585
commit 82f1227593
4 changed files with 1323 additions and 1 deletions

1239
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,3 @@
[workspace]
resolver = "2"
members = ["crates/backend"]
members = ["crates/backend", "crates/ble-server"]

View file

@ -0,0 +1,10 @@
[package]
name = "ble-server"
version = "0.1.0"
edition = "2021"
[dependencies]
bluer = { version = "*", features = ["full"] }
btleplug = "*"
tokio = { version = "1", features = ["full"] }
uuid = "*"

View file

@ -0,0 +1,73 @@
use btleplug::api::{
bleuuid::uuid_from_u16, Central, Manager as _, Peripheral as _, ScanFilter, WriteType,
};
use btleplug::platform::{Adapter, Manager, Peripheral};
use std::error::Error;
use std::str::FromStr;
use std::thread;
use std::time::Duration;
use tokio::time;
use uuid::Uuid;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let characteristic = Uuid::from_str("e54b0002-67f5-479e-8711-b3b99198ce6c").unwrap();
let manager = Manager::new().await.unwrap();
// get the first bluetooth adapter
let adapters = manager.adapters().await?;
let central = adapters.into_iter().nth(0).unwrap();
// start scanning for devices
central.start_scan(ScanFilter::default()).await?;
// instead of waiting, you can use central.events() to get a stream which will
// notify you of new devices, for an example of that see examples/event_driven_discovery.rs
time::sleep(Duration::from_secs(5)).await;
// find the device we're interested in
let handle = find_light(&central).await.unwrap();
println!("{:#?}", handle);
handle.connect().await?;
// connect to the device
//light.connect().await?;
// discover services and characteristics
handle.discover_services().await?;
// find the characteristic we want
let chars = handle.characteristics();
println!("Characteristics: {:#?}", chars);
let light = chars.iter().find(|c| c.uuid == characteristic).unwrap();
handle
.write(light, &[0x00], WriteType::WithoutResponse)
.await
.unwrap();
println!("LED");
handle.disconnect().await.unwrap();
Ok(())
}
async fn find_light(central: &Adapter) -> Option<Peripheral> {
for p in central.peripherals().await.unwrap() {
if p.properties()
.await
.unwrap()
.unwrap()
.local_name
.iter()
.any(|name| name.contains("RAK4630"))
{
return Some(p);
}
}
None
}