4个版本 (2个重大更改)
0.3.0 | 2022年7月27日 |
---|---|
0.2.0 | 2022年7月25日 |
0.1.0-alpha.1 | 2022年7月21日 |
0.1.0-alpha.0 | 2022年7月19日 |
在硬件支持中排名第697
2MB
789 行
ble-ledly
可定制和可扩展的跨平台高级蓝牙低能耗光控制器。
提供对通用RGB灯条和BLE灯和灯泡的即插即用支持。设计为可扩展,允许实现您自己的设备、通信协议或两者都实现(请参阅readme文件以获取更多信息)。支持特定硬件的动画(可传输)和不可传输的软件动画。
功能
每个设备都支持通过在.toml文件中进行条件编译提供的多个功能。
ble-ledly = {version = "0.3", features = ["all"]}
每个功能都提供对特定设备特性的单点访问,可以通过公开的set()
方法进行操作。所有方法都可通过标准API Capability::set(opts)
或以下更直观的方法访问。
// standard
Light::set(light, &protocol, &LightOption::On).await?;
// idiomatic syntactic sugar
light.turn_on(&protocol).await?;
功能 | 描述 | 实现? |
---|---|---|
灯光 |
灯光状态(开/关) | ✅ |
颜色 |
灯光颜色(RGB) | ✅ |
亮度 |
灯光白度级别 | ✅ |
HWAnimate |
特定硬件的动画(受协议约束) | ✅ |
SWAnimate |
软件动画(需要持续通信,但允许在任意设备上自定义效果) | ✅ |
温度 |
灯光温度(K) |
动画
可传输与非可传输
可传输动画内置在目标ble设备中,负责驱动led;一旦发送了命令,客户端和ble光控制器之间无需额外通信。不可传输动画绕过控制器内置的效果,允许进行更高程度的定制,同时支持支持旧版或廉价光控制器,使目标设备能够提供其他情况下不可用的效果。因此,这需要在控制器和客户端之间保持持续连接。
当前支持
动画 | 功能 | 颜色支持 | 实现? |
---|---|---|---|
闪烁 | HWAnimate | 红/绿/蓝 | ✅ |
呼吸 | SWAnimate | RGB/任何 | ✅ |
彩虹闪烁 | HWAnimate | 不适用 | |
双色闪烁 | HWAnimate | 红/绿, 红/蓝, 绿/蓝 | |
彩虹闪烁 | HWAnimate | 不适用 | |
交叉淡入淡出 | SWAnimate | RGB/任何 | |
彩虹跳跃 | HWAnimate | 不适用 | |
闪烁 | HWAnimate | 红、绿、蓝、黄、紫、青色 |
可扩展性
这个库的设计考虑了可扩展性。
- 通过实现
Device
特质,可以创建自己的设备,并使用内置的通信协议。 - 通过实现
Protocol
特质,可以添加自己的通信协议,并用它来驱动内置的设备之一。 - 创建自己的
device
和communication protocol
。
用法
以下是一个使用内置设备 LedDevice和通用RGB通信协议的示例。更多示例,请参阅示例文件夹。
最小配置
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
// Create a new Light controller with prefix
// Auto-filter devices that contain the prefix
let mut controller = Controller::<LedDevice>::new_with_prefix("QHM-").await?;
// Connect
controller.connect().await?;
// Choose your communication protocol
let protocol = GenericRGB::default();
// set default write characteristic for all connected
// devices
controller.set_all_char(&CharKind::Write, &UuidKind::Uuid16(0xFFD9))?;
// Setting first found light color to red
let first_light = controller.list().get(0).unwrap();
first_light.color(&protocol, 255, 0, 0).await?;
Ok(())
}
灯光控制
use ble_ledly::capability::color::*;
use ble_ledly::capability::light::*;
use ble_ledly::capability::sw_animate::*;
use ble_ledly::communication_protocol::GenericRGB;
use ble_ledly::Controller;
use ble_ledly::device::LedDevice;
use ble_ledly::device::{CharKind, UuidKind};
use std::error::Error;
use std::time::Duration;
use tokio::time;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
// Create a new Light controller
let mut controller = Controller::<LedDevice>::new().await?;
// Discover devices (scan)
let led_devices = controller.device_discovery().await?;
// inspect all found devices
for device in led_devices.iter() {
println!("Found device: {}", device);
}
// filter devices
let lights: Vec<LedDevice> = led_devices
.into_iter()
.filter(|device| device.name.contains("QHM-"))
.collect();
// Connect
controller.connect_with_devices(lights).await?;
// Choose your communication protocol
let protocol = GenericRGB::default();
// set the default write Characteristic
// for all devices. Optionally you can also
// set it per-device. Look the examples folder for more
controller.set_all_char(&CharKind::Write, &UuidKind::Uuid16(0xFFD9))?;
// list all connected devices
let connected_lights = controller.list();
for light in connected_lights.iter_mut() {
println!("Connected to : {}", light.name);
// Control the lights
println!("Turning light on...");
light.turn_on(&protocol).await?;
// Set color
println!("Setting color...");
light.color(&protocol, 255, 0, 0).await?;
time::sleep(Duration::from_millis(800)).await;
light.color(&protocol, 0, 255, 0).await?;
time::sleep(Duration::from_millis(800)).await;
light.color(&protocol, 0, 0, 255).await?;
time::sleep(Duration::from_millis(800)).await;
println!("SW Animation - Breathing effect...");
light
.breathing(
&GenericRGB {},
&ColorOption::RGB(255, 0, 0),
&SWAnimationRepeat::FiniteCount(2),
&SWAnimationSpeed::Fastest,
)
.await?;
light
.breathing(
&GenericRGB {},
&ColorOption::RGB(0, 255, 0),
&SWAnimationRepeat::FiniteCount(2),
&SWAnimationSpeed::Fastest,
)
.await?;
light
.breathing(
&GenericRGB {},
&ColorOption::RGB(0, 0, 255),
&SWAnimationRepeat::FiniteCount(2),
&SWAnimationSpeed::Fastest,
)
.await?;
// Control the lights
println!("Turning light off...");
light.turn_off(&protocol).await?;
}
Ok(())
}
贡献
提交PR或问题
许可证
MIT
依赖项
~5–37MB
~507K SLoC