11个版本 (7个重大更新)
0.9.3 | 2023年6月26日 |
---|---|
0.8.0 | 2021年4月26日 |
0.6.0 | 2021年4月16日 |
0.5.0 | 2021年2月2日 |
0.1.0 | 2019年6月18日 |
#204 in 嵌入式开发
每月243次下载
在 pipebuf_websocket 中使用
100KB
2K SLoC
embedded-websocket
适用于嵌入式系统的轻量级Rust WebSocket库 no_std
该库简化了WebSocket消息的编解码过程,可用于客户端和服务器。此库旨在在内存受限的环境中(如无法引用Rust标准库的嵌入式微控制器)使用。只要能读取WebSocket头部(2-14字节),该库就可以在任意大小的缓冲区中工作,而不管WebSocket帧的大小如何。
no_std支持
您可以在不链接Rust标准库的情况下使用此库。请确保在Cargo.toml文件中将默认功能设置为false。例如
embedded-websocket = { version = "x.x.x", default-features = false }
可选的(但推荐)framer 模块允许您以更舒适的方式处理完整的WebSocket帧,而无需处理分片数据。如果您使用它,您将必须在该模块中实现Read和Write trait,因为它们在no_std
中不可用。
注意:如果您收到以下类似的错误消息,这意味着您在Cargo.toml文件中声明依赖项时没有使用default-features = false
error[E0463]: can't find crate for `std`
|
= note: the `thumbv7m-none-eabi` target may not be installed
运行示例
以下示例运行一个WebSocket服务器,该服务器循环接受客户端连接并返回客户端发送的任何文本。客户端连接到服务器,发送一条“Hello, World!”消息,等待服务器响应,然后断开连接并终止。演示了正确的打开和关闭握手。
要运行演示Web服务器
cargo run --example server
要运行演示WebSocket客户端
cargo run --example client
或在浏览器中使用此url http://127.0.0.1:1337/
工作示例项目
请参阅https://github.com/ninjasource/led-display-websocket-demo,以获取该库与stm32 m3 bluepill MCU和嵌入式以太网卡一起工作的完整端到端示例。
示例WebSocket客户端使用
以下示例还可在此处找到,它启动一个握手,检查握手响应,发送一条简短的消息,启动关闭握手,检查关闭握手响应并退出。
// open a TCP stream to localhost port 1337
let address = "127.0.0.1:1337";
println!("Connecting to: {}", address);
let mut stream = TcpStream::connect(address).map_err(FramerError::Io)?;
println!("Connected.");
let mut read_buf = [0; 4000];
let mut read_cursor = 0;
let mut write_buf = [0; 4000];
let mut frame_buf = [0; 4000];
let mut websocket = WebSocketClient::new_client(rand::thread_rng());
// initiate a websocket opening handshake
let websocket_options = WebSocketOptions {
path: "/chat",
host: "localhost",
origin: "https://127.0.0.1:1337",
sub_protocols: None,
additional_headers: None,
};
let mut framer = Framer::new(
&mut read_buf,
&mut read_cursor,
&mut write_buf,
&mut websocket,
);
framer.connect(&mut stream, &websocket_options)?;
let message = "Hello, World!";
framer.write(
&mut stream,
WebSocketSendMessageType::Text,
true,
message.as_bytes(),
)?;
while let Some(s) = framer.read_text(&mut stream, &mut frame_buf)? {
println!("Received: {}", s);
// close the websocket after receiving the first reply
framer.close(&mut stream, WebSocketCloseStatusCode::NormalClosure, None)?;
println!("Sent close handshake");
}
println!("Connection closed");
示例WebSocket服务器使用
服务器示例过于冗长,无法包含在此readme中。请参阅服务器示例
异步支持
异步支持是实验性的,API可能会发生重大变化。
许可证
根据您的选择,许可协议为MIT或Apache-2.0
依赖项
~2.5MB
~44K SLoC