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 嵌入式开发
11,061 每月下载次数
用于 6 个库
170KB
3.5K SLoC
coap-lite
一个轻量级的低级CoAP消息处理库。
其目标是符合CoAP标准,并为库(例如 coap)和应用提供构建块。
coap-lite
支持 #![no_std]
和嵌入式环境。
它最初基于从 coap 库以及 rust-async-coap 库改进的低级消息处理代码,旨在在裸机环境中工作。
支持的RFC
- CoAP RFC 7252
- CoAP Observe Option RFC 7641
- Too Many Requests Response Code RFC 8516
- Block-Wise Transfers RFC 7959
- Constrained RESTful Environments (CoRE) Link Format RFC6690
使用方法
此库提供了几种类型,可用于构建、修改以及编码/解码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[..]);
许可证
根据您的要求,可以选择以下任一许可证:
(任选其一)。
这是对 coap 和 rust-async-coap 集成的修改,它们的许可证在 LICENSE-3RD-PARTY 中。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,将如上所述双许可,不附加任何额外条款或条件。
依赖项
约 220KB