#coap-message #coap #environments #low-level #building-block #bare-metal

无std coap-lite

一个轻量级的CoAP消息处理库,适用于嵌入式环境

26个版本

0.13.0 2024年7月31日
0.11.5 2024年2月25日
0.11.3 2023年8月12日
0.11.2 2022年10月4日
0.3.0 2019年9月12日

#66 in 嵌入式开发

Download history 1901/week @ 2024-05-02 2138/week @ 2024-05-09 2268/week @ 2024-05-16 2392/week @ 2024-05-23 2712/week @ 2024-05-30 2819/week @ 2024-06-06 2237/week @ 2024-06-13 3043/week @ 2024-06-20 2412/week @ 2024-06-27 2555/week @ 2024-07-04 3287/week @ 2024-07-11 3437/week @ 2024-07-18 3066/week @ 2024-07-25 2771/week @ 2024-08-01 2554/week @ 2024-08-08 2035/week @ 2024-08-15

11,061 每月下载次数
用于 6 个库

MIT/Apache

170KB
3.5K SLoC

coap-lite

Latest version Documentation License

一个轻量级的低级CoAP消息处理库。

其目标是符合CoAP标准,并为库(例如 coap)和应用提供构建块。

coap-lite 支持 #![no_std] 和嵌入式环境。

它最初基于从 coap 库以及 rust-async-coap 库改进的低级消息处理代码,旨在在裸机环境中工作。

支持的RFC

使用方法

此库提供了几种类型,可用于构建、修改以及编码/解码CoAP消息到/从它们的字节表示形式。

无std用户注意:它确实需要分配,因此您可能需要根据您的目标设置全局分配器。

客户端

以下示例使用 std::net::UdpSocket 发送 UDP 数据包,但您可以使用任何东西,例如用于嵌入式系统的 smoltcp

use coap_lite::{
    CoapRequest, RequestType as Method
};
use std::net::{SocketAddr, UdpSocket};

fn main() {
    let mut request: CoapRequest<SocketAddr> = CoapRequest::new();

    request.set_method(Method::Get);
    request.set_path("/test");

    let socket = UdpSocket::bind("127.0.0.1:0").unwrap();

    let packet = request.message.to_bytes().unwrap();
    socket.send_to(&packet[..], "127.0.0.1:5683").expect("Could not send the data");
}

服务器

use coap_lite::{CoapRequest, Packet};
use std::net::{UdpSocket};

fn main() {
    let socket = UdpSocket::bind("127.0.0.1:5683").unwrap();
    let mut buf = [0; 100];
    let (size, src) = socket.recv_from(&mut buf).expect("Didn't receive data");

    println!("Payload {:x?}", &buf[..size]);

    let packet = Packet::from_bytes(&buf[..size]).unwrap();
    let request = CoapRequest::from_packet(packet, src);

    let method = request.get_method().clone();
    let path = request.get_path();

    println!("Received CoAP request '{:?} {}' from {}", method, path, src);

    let mut response = request.response.unwrap();
    response.message.payload = b"OK".to_vec();

    let packet = response.message.to_bytes().unwrap();
    socket.send_to(&packet[..], &src).expect("Could not send the data");
}

低级二进制转换

use coap_lite::{
    CoapOption, MessageClass, MessageType,
    Packet, RequestType, ResponseType,
};

let mut request = Packet::new();
request.header.message_id = 23839;
request.header.code = MessageClass::Request(RequestType::Get);
request.set_token(vec![0, 0, 57, 116]);
request.add_option(CoapOption::UriHost, b"localhost".to_vec());
request.add_option(CoapOption::UriPath, b"tv1".to_vec());
assert_eq!(
    [
        0x44, 0x01, 0x5D, 0x1F, 0x00, 0x00, 0x39, 0x74, 0x39, 0x6C, 0x6F,
        0x63, 0x61, 0x6C, 0x68, 0x6F, 0x73, 0x74, 0x83, 0x74, 0x76, 0x31,
    ],
    request.to_bytes().unwrap()[..]
);

let response = Packet::from_bytes(&[
    0x64, 0x45, 0x5D, 0x1F, 0x00, 0x00, 0x39, 0x74, 0xFF, 0x48, 0x65,
    0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64, 0x21,
])
.unwrap();
assert_eq!(23839, response.header.message_id);
assert_eq!(
    MessageClass::Response(ResponseType::Content),
    response.header.code
);
assert_eq!(MessageType::Acknowledgement, response.header.get_type());
assert_eq!([0, 0, 57, 116], response.get_token()[..]);
assert_eq!(b"Hello World!", &response.payload[..]);

许可证

根据您的要求,可以选择以下任一许可证:

(任选其一)。

这是对 coaprust-async-coap 集成的修改,它们的许可证在 LICENSE-3RD-PARTY 中。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,将如上所述双许可,不附加任何额外条款或条件。

依赖项

约 220KB