Rust嵌入式开发框架embedded-svc的使用,高效构建物联网和硬件驱动服务
Rust嵌入式开发框架embedded-svc的使用,高效构建物联网和硬件驱动服务
embedded-svc是一个为嵌入式服务提供Rust API和抽象层的框架,主要用于构建物联网和硬件驱动服务。它提供了一系列特性如WiFi、网络、HTTP服务和日志记录等。
特性
该框架的特点是:
- 提供嵌入式功能的通用接口
- 旨在实现嵌入式生态系统的可移植性
- 目前主要支持ESP32[-XX]/ESP-IDF平台
- 设计上支持扩展到其他硬件平台
安装
在项目目录中运行以下Cargo命令:
cargo add embedded-svc
或者在Cargo.toml中添加:
embedded-svc = "0.28.1"
完整示例代码
以下是一个使用embedded-svc构建物联网服务的完整示例:
use embedded_svc::{
wifi::{AccessPointConfiguration, ClientConfiguration, Wifi},
ipv4, httpd,
};
use esp_idf_svc::wifi::EspWifi;
use std::net::Ipv4Addr;
fn main() -> anyhow::Result<()> {
// 1. 初始化WiFi
let wifi = EspWifi::new()?;
// 2. 配置WiFi为客户端模式
wifi.set_configuration(&ClientConfiguration {
ssid: "your_wifi_ssid".into(),
password: "your_wifi_password".into(),
..Default::default()
})?;
// 3. 启动WiFi
wifi.start()?;
wifi.connect()?;
// 4. 等待获取IP地址
while !wifi.is_connected()? {
std::thread::sleep(std::time::Duration::from_secs(1));
}
// 5. 创建HTTP服务器
let server_config = httpd::Configuration {
stack_size: 32768,
..Default::default()
};
let mut server = httpd::Server::new(&server_config)?;
// 6. 注册路由处理程序
server.register_handler("/", |req, resp| {
resp.send_str("Hello from embedded Rust!")?;
Ok(())
})?;
println!("Server started at {:?}", wifi.ip_info()?.ip);
// 7. 保持服务器运行
loop {
std::thread::sleep(std::time::Duration::from_secs(1));
}
}
代码说明
- 首先初始化WiFi模块
- 配置WiFi连接参数(SSID和密码)
- 启动WiFi并连接
- 等待连接成功并获取IP地址
- 创建HTTP服务器配置
- 注册根路由处理程序
- 保持服务器持续运行
这个示例展示了如何使用embedded-svc快速构建一个嵌入式Web服务器,包括WiFi连接和HTTP服务等基本物联网功能。您可以根据需要扩展更多功能,如添加更多路由、实现API接口或集成其他硬件驱动。
扩展示例:带温度传感器读取的Web服务
use embedded_svc::{
wifi::{ClientConfiguration, Wifi},
httpd,
};
use esp_idf_svc::{
wifi::EspWifi,
hal::adc::ADC1,
};
use anyhow::Result;
use std::sync::Arc;
// 温度传感器结构体
struct TemperatureSensor {
adc: ADC1,
}
impl TemperatureSensor {
fn new(adc: ADC1) -> Self {
Self { adc }
}
fn read_temperature(&self) -> Result<f32> {
// 这里实现具体的ADC读取和温度转换逻辑
// 示例代码,实际需要根据硬件实现
let raw_value = 0; // 从ADC读取原始值
Ok((raw_value as f32) * 0.1) // 转换为温度值
}
}
fn main() -> Result<()> {
// 1. 初始化WiFi
let wifi = EspWifi::new()?;
wifi.set_configuration(&ClientConfiguration {
ssid: "your_wifi_ssid".into(),
password: "your_wifi_password".into(),
..Default::default()
})?;
// 2. 连接WiFi
wifi.start()?;
wifi.connect()?;
while !wifi.is_connected()? {
std::thread::sleep(std::time::Duration::from_secs(1));
}
// 3. 初始化温度传感器
let adc = ADC1::new()?;
let sensor = Arc::new(TemperatureSensor::new(adc));
// 4. 创建HTTP服务器
let mut server = httpd::Server::new(&Default::default())?;
// 5. 注册路由
let sensor_clone = sensor.clone();
server.register_handler("/temperature", move |_, resp| {
let temp = sensor_clone.read_temperature()?;
resp.send_str(&format!("Current temperature: {:.1}°C", temp))?;
Ok(())
})?;
println!("Server running at {:?}", wifi.ip_info()?.ip);
loop {
std::thread::sleep(std::time::Duration::from_secs(1));
}
}
该框架遵循MIT或Apache-2.0开源协议,当前版本为0.28.1,由esp-rs团队维护。
1 回复
Rust嵌入式开发框架embedded-svc的使用指南
完整示例Demo
下面是一个结合WiFi连接、定时器和GPIO控制的完整嵌入式应用示例:
use embedded_svc::{
executor::asynch::Executor,
gpio::{Pin, Direction, Level},
timer::asynch::Timer,
wifi::{AuthMethod, ClientConfiguration, Configuration},
};
use std::time::Duration;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// 初始化执行器
let executor = Executor::new();
// 初始化WiFi
let wifi = embedded_svc::wifi::WifiDriver::new()?;
// 初始化GPIO引脚
let mut led_pin = embedded_svc::gpio::GpioPin::new(2)?; // 假设GPIO2连接LED
// 配置WiFi
wifi.set_configuration(&Configuration::Client(ClientConfiguration {
ssid: "my_wifi".into(),
password: "password".into(),
auth_method: AuthMethod::WPA2Personal,
..Default::default()
}))?;
// 启动WiFi
wifi.start()?;
// 连接WiFi
wifi.connect().await?;
println!("Connected to WiFi!");
// 启动LED闪烁任务
executor.spawn(blink_led(led_pin)).unwrap();
// 启动定时器任务
executor.spawn(timer_task()).unwrap();
// 运行执行器
executor.run().await;
Ok(())
}
// LED闪烁任务
async fn blink_led(mut pin: impl Pin) -> anyhow::Result<()> {
pin.set_direction(Direction::Output)?;
loop {
pin.set_level(Level::High)?;
embedded_svc::timer::delay(Duration::from_millis(500)).await;
pin.set_level(Level::Low)?;
embedded_svc::timer::delay(Duration::from_millis(500)).await;
}
}
// 定时器任务
async fn timer_task() {
let timer = embedded_svc::timer::TimerDriver::new().unwrap();
loop {
timer.after(Duration::from_secs(1)).await;
println!("System running...");
}
}
示例说明
-
WiFi连接:
- 配置WiFi的SSID和密码
- 使用WPA2加密方式
- 异步连接网络
-
GPIO控制:
- 初始化GPIO2引脚作为输出
- 实现LED每500毫秒闪烁一次
-
定时器:
- 每秒打印一次系统运行状态
-
多任务处理:
- 使用Executor同时运行多个异步任务
- 保证WiFi连接、LED闪烁和定时器任务并行执行
要运行此示例,需要在Cargo.toml
中添加以下依赖:
[dependencies]
embedded-svc = "0.20"
tokio = { version = "1.0", features = ["full"] }
anyhow = "1.0"
这个示例展示了embedded-svc
框架在嵌入式开发中的典型用法,包括硬件控制、网络连接和异步任务处理等功能。