#ble #bluetooth #bluez #bluetooth-le #iot

rumble

A Rust 蓝牙低功耗(BLE)中心模块库,目前支持 Linux/Bluez

4个版本 (2个破坏性更新)

使用旧的Rust 2015

0.3.0 2019年1月2日
0.2.1 2018年5月28日
0.2.0 2018年4月9日
0.0.1 2018年1月2日

#1588 in 硬件支持

每月44次下载
ruuvitag-upload 中使用

MIT/Apache

100KB
2.5K SLoC

Rumble

Build Status Crates.io Version docs

Rumble 是一个用于 Rust 的蓝牙低能耗(BLE)中心模块库。目前仅支持 Linux(使用 BlueZ 蓝牙库),尽管未来可能支持其他操作系统。Rumble 使用其套接字接口而非 DBus 与 BlueZ 交互。这提供了比 DBus 接口更多的控制和可靠性,并且不需要在实验模式下运行 BlueZ 以支持 BLE。

截至版本 0.2,API 正在变得更加稳定,库本身也更有用。您仍然可能遇到错误、限制和异常行为。欢迎提交拉取请求(和 wireshark 跟踪)!

使用方法

如何使用此库控制一些 BLE 智能灯的示例

extern crate rumble;
extern crate rand;

use std::thread;
use std::time::Duration;
use rand::{Rng, thread_rng};
use rumble::bluez::manager::Manager;
use rumble::api::{UUID, Central, Peripheral};

pub fn main() {
    let manager = Manager::new().unwrap();

    // get the first bluetooth adapter
    let adapters = manager.adapters().unwrap();
    let mut adapter = adapters.into_iter().nth(0).unwrap();

    // reset the adapter -- clears out any errant state
    adapter = manager.down(&adapter).unwrap();
    adapter = manager.up(&adapter).unwrap();

    // connect to the adapter
    let central = adapter.connect().unwrap();

    // start scanning for devices
    central.start_scan().unwrap();
    // instead of waiting, you can use central.on_event to be notified of
    // new devices
    thread::sleep(Duration::from_secs(2));

    // find the device we're interested in
    let light = central.peripherals().into_iter()
        .find(|p| p.properties().local_name.iter()
            .any(|name| name.contains("LEDBlue"))).unwrap();

    // connect to the device
    light.connect().unwrap();

    // discover characteristics
    light.discover_characteristics().unwrap();

    // find the characteristic we want
    let chars = light.characteristics();
    let cmd_char = chars.iter().find(|c| c.uuid == UUID::B16(0xFFE9)).unwrap();

    // dance party
    let mut rng = thread_rng();
    for _ in 0..20 {
        let color_cmd = vec![0x56, rng.gen(), rng.gen(), rng.gen(), 0x00, 0xF0, 0xAA];
        light.command(&cmd_char, &color_cmd).unwrap();
        thread::sleep(Duration::from_millis(200));
    }
}

依赖项

~8.5MB
~173K SLoC