#蓝牙 #gatt #linux-bluetooth #mesh #l2cap #read-write #rfcomm

bluer

BlueR:Linux蓝牙协议栈(BlueZ)的官方Rust接口

33个版本

0.17.3 2024年7月15日
0.17.1 2024年3月14日
0.17.0-pre12023年11月17日
0.16.0-pre12023年6月20日
0.10.3 2021年7月18日

#16 in Unix API

Download history 15157/week @ 2024-05-03 17710/week @ 2024-05-10 18081/week @ 2024-05-17 18822/week @ 2024-05-24 20780/week @ 2024-05-31 15191/week @ 2024-06-07 16544/week @ 2024-06-14 20292/week @ 2024-06-21 16911/week @ 2024-06-28 11077/week @ 2024-07-05 10067/week @ 2024-07-12 10693/week @ 2024-07-19 10162/week @ 2024-07-26 10148/week @ 2024-08-02 9534/week @ 2024-08-09 9759/week @ 2024-08-16

41,935 每月下载量
用于 17 个crate(13个直接)

BSD-2-Clause

430KB
8K SLoC

BlueR — Rust官方BlueZ绑定

crates.io page docs.rs page BSD-2-Clause license

此库提供了对Linux蓝牙协议栈(BlueZ)的官方Rust接口。支持使用惯用的Rust代码发布本地和消费远程GATT服务。使用类似于Tokio网络API来表示L2CAP和RFCOMM套接字。

提供以下功能

  • 蓝牙适配器
    • 枚举
    • 配置电源、可发现性、名称等
    • 通过更改事件流的热插拔支持
  • 蓝牙设备
    • 使用自定义过滤器进行发现
    • 查询地址、名称、类别、信号强度(RSSI)等
    • 蓝牙低能耗广告
    • 更改事件流
    • 连接和配对
    • 被动LE广告监控
  • 消费远程GATT服务
    • GATT服务发现
    • 对特性进行读取、写入和通知操作
    • 对特性描述符进行读取和写入操作
    • 可选使用低开销的AsyncReadAsyncWrite流进行通知和写入操作
  • 发布本地GATT服务
    • 对特性进行读取、写入和通知操作
    • 对特性描述符进行读取和写入操作
    • 支持两种编程模型
      • 基于回调的接口
      • 低开销的AsyncReadAsyncWrite
  • 发送蓝牙低能耗广告
  • 蓝牙授权代理
  • 高效的事件分发
    • 不受D-Bus匹配规则数量影响
    • 订阅数量为O(1)
  • L2CAP套接字
    • 支持经典蓝牙(BR/EDR)和蓝牙LE
    • 面向流
    • 面向顺序数据包
    • 面向数据报
    • 异步I/O接口,支持AsyncReadAsyncWrite
  • RFCOMM套接字
    • 支持经典蓝牙(BR/EDR)
    • 面向流
    • 异步I/O接口,支持AsyncReadAsyncWrite
  • 蓝牙网状网络
    • 配置和加入网络
    • 发送和接收消息
  • 分配号码数据库
    • 制造商ID
    • 服务类、GATT服务、特性和描述符

目前,某些经典蓝牙(BR/EDR)功能缺失。不过,欢迎提交拉取请求和贡献!

使用方法

要将BlueR用作库,请在您的项目目录中运行以下命令

cargo add -F full bluer

这将添加最新版本的BlueR,并启用所有功能作为依赖项添加到您的Cargo.toml中。

crate功能

以下crate功能可用。

  • bluetoothd:启用所有需要运行蓝牙守护进程的功能。构建时,必须安装由Debian的libdbus-1-dev提供的D-Bus库头文件。
  • id:启用分配号码数据库。
  • l2cap:启用L2CAP套接字。
  • rfcomm:启用RFCOMM套接字。
  • mesh:启用蓝牙网状网络功能。
  • serde:启用一些数据类型的序列化和反序列化。

要启用所有crate功能,请指定full crate功能。

要求

最低支持Rust版本(MSRV)为1.75。

此库已与BlueZ 5.60进行了测试。旧版本可能也可以工作,但请注意,存在许多与GATT处理相关的错误。有关详细信息,请参阅官方变更日志

如果使用了任何bluetoothd功能,蓝牙守护进程必须正在运行,并配置为通过D-Bus进行访问。在大多数发行版中,这应该是默认设置。

对于mesh功能,蓝牙网状网络守护进程必须正在运行,并配置为通过D-Bus进行访问。

配置

/etc/bluetooth/main.conf中的以下选项在处理GATT服务时很有帮助。

[GATT]
Cache = no
Channels = 1

这禁用了GATT缓存,以避免设备发现期间的过时数据。

仅允许一个通道将扩展属性协议(EATT)禁用。如果EATT启用,所有GATT命令和通知都通过多个L2CAP通道发送,并且可以在协议堆栈的低层任意重新排序。这使得通过GATT特性进行顺序数据传输更加困难。

构建

在克隆此存储库时,请确保使用以下命令。否则,构建将因找不到文件错误而失败。

git clone --recursive https://github.com/bluez/bluer.git

构建需要D-Bus开发头文件。

故障排除

库返回BlueZ接收到的详细错误。

将Rust日志级别设置为trace可查看与BlueZ的所有D-Bus通信。

在某些情况下,检查蓝牙系统日志可能提供更多信息。在基于Debian的系统上,可以通过执行journalctl -u bluetooth来显示。有关提高日志级别的信息,请参阅bluetoothd手册页。

有时,删除位于/var/lib/bluetooth的系统蓝牙缓存并重新启动bluetoothd可以解决与设备连接的持续问题。

示例

请参阅API 文档示例文件夹以获取示例。

以下提供了以下示例应用程序。

  • discover_devices:发现蓝牙设备并打印其属性。

  • gatt_client:简单的 GATT 客户端,在特征上调用读取、写入和通知。

  • gatt_server_cb:使用回调编程模型实现的相应 GATT 服务器。

  • gatt_server_io:使用 IO 编程模型实现的相应 GATT 服务器。

  • gatt_echo_client:简单的 GATT 客户端,连接到服务器并发送接收测试数据。

  • gatt_echo_server:相应的 GATT 服务器,回显接收到的数据。

  • l2cap_client:简单的 L2CAP 套接字客户端,连接到套接字并发送接收测试数据。

  • l2cap_server:相应的 L2CAP 套接字服务器,回显接收到的数据。

  • le_advertise:注册蓝牙 LE 广告。

  • le_passive_scan:LE 被动扫描并订阅已发现的外围设备的更新。

  • list_adapters:列出已安装的蓝牙适配器及其属性。

  • mesh_sensor_client:简单的蓝牙网状客户端,发送传感器模型消息。

  • mesh_sensor_server:简单的蓝牙网状服务器,接收传感器模型消息。

  • mesh_provisioner:简单的蓝牙网状配置器。

  • rfcomm_client:简单的 RFCOMM 套接字客户端,连接到套接字并发送接收测试数据。

  • rfcomm_server:相应的 RFCOMM 套接字服务器,回显接收到的数据。

使用cargo run --all-features --example <name>来运行特定的示例应用程序。

工具

有关构建在此库之上的工具,请参阅BlueR 工具 crate。

历史

该项目最初是从blurz分叉而来,但后来已经完全重写。它被命名为blez发布,后来被指定为 BlueZ 的官方 Rust 接口并更名为 BlueR。文档主要来自BlueZ API 规范,但也根据需要进行了调整。

依赖项

~5–16MB
~200K SLoC