22个版本
0.6.6 | 2023年11月15日 |
---|---|
0.6.4 | 2023年10月11日 |
0.5.3 | 2022年10月12日 |
0.1.0 | 2022年6月9日 |
#139 在 硬件支持
317 每月下载量
300KB
5.5K SLoC
Bluest — Rust的跨平台蓝牙LE crate
Bluest 是一个跨平台的 蓝牙低能耗 (BLE) 库,适用于 Rust。它目前支持 Windows(版本 10 及以上)、MacOS/iOS 和 Linux。计划支持 Android。
Bluest 的目标是创建一个在平台特定的蓝牙 API 之上的 薄 抽象层,以提供安全、跨平台的蓝牙 LE 设备访问。该 crate 目前支持 GAP Central 和 GATT Client 角色。不支持外围和服务器角色。
用法
let adapter = Adapter::default().await.ok_or("Bluetooth adapter not found")?;
adapter.wait_available().await?;
println!("starting scan");
let mut scan = adapter.scan(&[]).await?;
println!("scan started");
while let Some(discovered_device) = scan.next().await {
println!(
"{}{}: {:?}",
discovered_device.device.name().as_deref().unwrap_or("(unknown)"),
discovered_device
.rssi
.map(|x| format!(" ({}dBm)", x))
.unwrap_or_default(),
discovered_device.adv_data.services
);
}
概览
Bluest 提供的主要功能包括
- 设备发现
- 访问远程 GATT 服务
异步运行时
在非Linux平台上,Bluest应与任何异步运行时一起工作。在Linux上,底层的bluer
crate需要Tokio运行时,Bluest使用Tokio的block_in_place
API(这需要Tokio的多线程运行时)来使一些方法同步。还提供了仅适用于Linux的这些方法的异步版本,应在平台特定代码中优先使用。
平台特定细节
因为Bluest旨在在平台特定API之上提供一个薄抽象,所以可用的API代表了支持平台之间API的最低共同点。例如,CoreBluetooth从不向应用程序公开设备的蓝牙地址,因此没有在Device
中检索地址或甚至任何蓝牙地址结构的方法。
大多数Bluest API应在所有支持的平台上一致地表现。行为有显著差异的API总结在下表中。
方法 | MacOS/iOS | Windows | Linux |
---|---|---|---|
适配器::connect_device |
✅ | ✨ | ✅ |
适配器::disconnect_device |
✅ | ✨ | ✅ |
设备::name |
✅ | ✅ | ⌛️ |
设备::is_paired |
❌ | ✅ | ✅ |
设备::pair |
✨ | ✅ | ✅ |
设备::pair_with_agent |
✨ | ✅ | ✅ |
设备::unpair |
❌ | ✅ | ✅ |
设备::rssi |
✅ | ❌ | ❌ |
服务::uuid |
✅ | ✅ | ⌛️ |
服务::is_primary |
✅ | ❌ | ✅ |
特征::uuid |
✅ | ✅ | ⌛️ |
特征::max_write_len |
✅ | ✅ | ⌛️ |
描述符::uuid |
✅ | ✅ | ⌛️ |
✅ = 支持
✨ = 由操作系统自动管理,此方法为空操作
⌛️ = 底层API是异步的,因此此方法内部使用Tokio的block_in_place
API
❌ = 返回一个NotSupported
错误
此外,在特定情况下API返回的错误可能在不同平台上不一致。例如,Linux的bluez API没有以有用的方式返回底层的蓝牙协议错误,而其他平台则这样做。在可能返回有意义错误的地方,Bluest将尝试这样做。在其他情况下,Bluest可能返回一个带有kind
为Other
的错误,并且您需要查看错误的平台特定source
以获取更多信息。
功能标志
可通过启用serde
功能来使用序列化/反序列化设备标识符。
示例
在示例文件夹中提供了演示基本使用的示例。
有关详细信息,请参阅API文档。
依赖关系
~0.8–44MB
~645K SLoC