#websocket #websocket-server #websocket-client #frame #read #codec

no-std embedded-websocket

适用于嵌入式系统的轻量级WebSocket库(no_std)

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 嵌入式开发

Download history 81/week @ 2024-03-10 47/week @ 2024-03-17 15/week @ 2024-03-24 42/week @ 2024-03-31 33/week @ 2024-04-07 28/week @ 2024-04-14 84/week @ 2024-04-21 47/week @ 2024-04-28 9/week @ 2024-05-05 61/week @ 2024-05-12 39/week @ 2024-05-19 25/week @ 2024-05-26 67/week @ 2024-06-02 67/week @ 2024-06-09 63/week @ 2024-06-16 44/week @ 2024-06-23

每月243次下载
pipebuf_websocket 中使用

MIT/Apache

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