Rust嵌入式开发框架embedded-svc的使用,高效构建物联网和硬件驱动服务

Rust嵌入式开发框架embedded-svc的使用,高效构建物联网和硬件驱动服务

embedded-svc是一个为嵌入式服务提供Rust API和抽象层的框架,主要用于构建物联网和硬件驱动服务。它提供了一系列特性如WiFi、网络、HTTP服务和日志记录等。

特性

该框架的特点是:

  1. 提供嵌入式功能的通用接口
  2. 旨在实现嵌入式生态系统的可移植性
  3. 目前主要支持ESP32[-XX]/ESP-IDF平台
  4. 设计上支持扩展到其他硬件平台

安装

在项目目录中运行以下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));
    }
}

代码说明

  1. 首先初始化WiFi模块
  2. 配置WiFi连接参数(SSID和密码)
  3. 启动WiFi并连接
  4. 等待连接成功并获取IP地址
  5. 创建HTTP服务器配置
  6. 注册根路由处理程序
  7. 保持服务器持续运行

这个示例展示了如何使用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...");
    }
}

示例说明

  1. WiFi连接

    • 配置WiFi的SSID和密码
    • 使用WPA2加密方式
    • 异步连接网络
  2. GPIO控制

    • 初始化GPIO2引脚作为输出
    • 实现LED每500毫秒闪烁一次
  3. 定时器

    • 每秒打印一次系统运行状态
  4. 多任务处理

    • 使用Executor同时运行多个异步任务
    • 保证WiFi连接、LED闪烁和定时器任务并行执行

要运行此示例,需要在Cargo.toml中添加以下依赖:

[dependencies]
embedded-svc = "0.20"
tokio = { version = "1.0", features = ["full"] }
anyhow = "1.0"

这个示例展示了embedded-svc框架在嵌入式开发中的典型用法,包括硬件控制、网络连接和异步任务处理等功能。

回到顶部