2 个版本

0.1.1 2022 年 5 月 4 日
0.1.0 2022 年 4 月 28 日

#33 in #coap

35 每月下载量

MIT 许可证

110KB
2.5K SLoC

健壮、易用的 Rust CoAP 服务器

Build Status Coverage Status Crates.io MIT licensed

一个异步的 CoAP 服务器,具有现代和易用的 API,适用于更大规模的应用程序,灵感来源于 warp 和 actix。CoAP 为资源受限的环境,如物联网设备,提供了一个极佳的 HTTP 替代方案。

  • 易用性:流畅的应用程序构建器 API 使构建丰富的应用程序变得简单,包括使用更高级 CoAP 功能的应用程序。
  • 并发:通过为每个请求创建单独的子任务支持高并发,允许长运行请求不会干扰短运行请求的规模。
  • 功能丰富:方便地支持一系列 CoAP 服务器功能,包括 Observe分块传输
  • 灵活:支持可插拔的传输后端,旨在支持替代的异步运行时,如 embassy

示例

use coap_server::app::{CoapError, Request, Response};
use coap_server::{app, CoapServer, FatalServerError, UdpTransport};

#[tokio::main]
async fn main() -> Result<(), FatalServerError> {
    let server = CoapServer::bind(UdpTransport::new("0.0.0.0:5683")).await?;
    server.serve(
        app::new().resource(
            app::resource("/hello").get(handle_get_hello))
    ).await
}

async fn handle_get_hello(request: Request<SocketAddr>) -> Result<Response, CoapError> {
    let whom = request
        .unmatched_path
        .first()
        .cloned()
        .unwrap_or_else(|| "world".to_string());

    let mut response = request.new_response();
    response.message.payload = format!("Hello, {whom}").into_bytes();
    Ok(response)
}

为了进行实验,我建议使用出色的 coap-client 命令行工具,如下所示:

$ coap-client -m get coap://127.0.0.1/hello
Hello, world

更多示例请参阅 示例

功能

该项目旨在成为一个健壮且完整的 CoAP 服务器,特别是为基于 Rust 的项目提供一个更方便的 MQTT 替代方案。

  • 正确且方便的 Observe 支持 (RFC 7641)
  • 分块传输支持 (RFC 7959)
  • 通过 /.well-known/core 进行资源发现和过滤 (RFC 6690)
  • 多播 UDP
  • 完全并发请求处理(无头阻塞或扩展惊喜!)
  • Ping/Pong 保持连接消息

期望但尚未实现

依赖项

~8–19MB
~246K SLoC