#request #mqtt #configuration #embedded-io #no-std

no-std minireq

基于MQTT的请求/响应处理接口的轻量级支持

5个版本 (3个重大更改)

0.4.0 2024年6月13日
0.3.0 2023年11月1日
0.2.0 2023年6月22日
0.1.1 2022年12月6日
0.1.0 2022年3月28日

#626 in 嵌入式开发

每月41次下载
用于 booster

MIT 许可证

19KB
295 代码行

minireq

基于MQTT的请求/响应库


lib.rs:

MQTT请求/响应处理

概述

该库旨在提供一种简单的方式来自动处理传入请求。

可以将处理函数与库关联,以便在接收到指定的请求时自动调用,处理函数将自动使用请求数据调用。

限制

  • 由于需要与RTIC和未锁定资源兼容,`poll` 函数具有一个有些奇怪的签名(使用一个函数来提供 `Context` 并调用处理函数)。

  • 处理函数只能是未捕获任何局部资源的闭包。相反,将局部捕获移动到 `Context` 中,该 `Context` 将在函数调用中提供给处理函数。

示例

use embedded_io::Write;

#[derive(Copy, Clone)]
struct Context {}

#[derive(serde::Serialize, serde::Deserialize)]
struct Request {
    data: u32,
}

// Handler function for processing an incoming request.
pub fn handler(
    context: &mut Context,
    cmd: &str,
    data: &[u8],
    mut output_buffer: &mut [u8]
) -> Result<usize, minireq::NoErrors> {
    // Deserialize the request.
    let mut request: Request = serde_json_core::from_slice(data).unwrap().0;

    let response = request.data.wrapping_add(1);
    let start = output_buffer.len();

    write!(output_buffer, "{}", response).unwrap();
    Ok(start - output_buffer.len())
}

let mqtt: minimq::Minimq<'_, _, _, minimq::broker::IpBroker> = minireq::minimq::Minimq::new(
// Constructor
);

// Construct the client
let mut handlers = [None; 10];
let mut client: minireq::Minireq<Context, _, _, _> = minireq::Minireq::new(
    "prefix/device",
    mqtt,
    &mut handlers[..],
)
.unwrap();

// Whenever the `/test` command is received, call the associated handler.
// You may add as many handlers as you would like.
client.register("/test", handler).unwrap();

// ...

loop {
    // In your main execution loop, continually poll the client to process incoming requests.
    client.poll(|handler, command, data, buffer| {
        let mut context = Context {};
        handler(&mut context, command, data, buffer)
    }).unwrap();
}

依赖项

~3.5MB
~75K SLoC