zenoh-nostd
Zero Network Overhead. Async. No std. No alloc. Pure Rust.
async β’ bare-metal β’ no_std β’ zenoh
π¦ Overview
β οΈ This project is in early development.
zenoh-nostd is a Rust-native, async, #![no_std], no_alloc library that provides a zero-overhead network abstraction layer for ultra-constrained and bare-metal environments. In other terms you can run this bare metal on your favourite microcontroller.
β‘ Built on the Zenoh protocol, but stripped to the bone for minimalism and raw performance.
β¨ Features
#![no_std]: No reliance on the Rust standard library.- No dynamic allocation: Fully
no_alloc, ideal for bare-metal targets. - Deterministic: No heap, no surprises.
- Safe Rust: Entirely memory-safe.
- Testable: Supports both embedded and native testing environments.
- Embassy Integration: Seamlessly integrates with the Embassy async runtime for embedded systems.
- Broker: A
#![no_std]broker to broke multiple zenohclientswith an optional gateway to azenohnetwork.
π§ Installation
Add this to your Cargo.toml:
[dependencies]
zenoh-nostd = { git = "https://github.com/ZettaScaleLabs/zenoh-nostd" }
For embedded systems, ensure your crate uses
#![no_std]:
#![no_std]
π Integration
Minimal Example
Hereβs a simple example of sending a payload with zenoh-nostd:
async fn entry(spawner: embassy_executor::Spawner) -> zenoh::ZResult<()> {
let config = init_session_example(&spawner).await;
let mut resources = Resources::default();
let session = zenoh::connect(&mut resources, &config, Endpoint::try_from(ENDPOINT)?).await?;
let ke = zenoh::keyexpr::new("demo/example")?;
let payload = b"Hello, from no-std!";
session.put(ke, payload).finish().await?;
Ok(())
}
π¬ MSRV
π οΈ Minimum Supported Rust Version: Currently
1.91.0
β οΈ Limitations
π§ͺ Building and Testing
This project uses just for task management. Use just check to check the project and examples, just test to run the tests and just bench to run the benchmarks.
π Pull requests that slow down the bench should be avoided.
Testing Examples
Use the following command structure:
just <platform> <example> [optional features]
- Platforms:
std,wasm,esp32s3 - Examples:
z_get,z_open,z_ping,z_pong,z_pub,z_pub_thr,z_put,z_querier,z_queryable,z_sub, ,z_sub_thr, - Broker:
z_broker(withallocfeature)
Set the ENDPOINT=<endpoint> environment variable to specify the endpoint (default is tcp/127.0.0.1:7447). Set LISTEN=1 to specify the connection method.
For esp32s3, you must also provide:
WIFI_SSID(default isZettaScale).WIFI_PASSWORD(no default, must be provided).
See the ESP32 setup documentation for toolchain and target installation.
Example of few commands:
ENDPOINT=tcp/127.0.0.1:7447 just std z_pub
WIFI_PASSWORD=* ENDPOINT=tcp/192.168.21.1:7447 just esp32s3 z_sub
Example: Local TCP
Run a Zenoh router with:
zenohd -l tcp/127.0.0.1:7447
In two terminals:
# Terminal 1
just std z_pub
# Terminal 2
just std z_sub
Example: WebSocket + WASM
Run a Zenoh router with:
zenohd -l tcp/127.0.0.1:7447 -l ws/127.0.0.1:7446
Then:
# Terminal 1 (WASM)
ENDPOINT=ws/127.0.0.1:7446 just wasm z_pub
# Terminal 2 (STD)
just std z_sub
π¦ Note: For WASM, ensure you have:
wasm32-unknown-unknowntargetwasm-bindgen-clibasic-http-server(or similar)
π Project Layout
zenoh-nostd/ # Git repository root
βββ crates/
β βββ zenoh-derive/ # Derive macros
β βββ zenoh-nostd/ # Zenoh with IO, embassy
β βββ zenoh-proto/ # Zenoh Protocol
β βββ zenoh-sansio/ # Zenoh Sans-IO objects (Transport only right now)
β
βββ examples/
β βββ web/
β β βββ index.html # File to test wasm example
β β
β βββ z_broker.rs # Example with std/wasm/embassy io
β βββ z_get.rs # Example with std/wasm/embassy io
β βββ z_open.rs # Example with std/wasm/embassy io
β βββ z_ping.rs # Example with std/wasm/embassy io
β βββ z_pong.rs # Example with std/wasm/embassy io
β βββ z_pub.rs # Example with std/wasm/embassy io
β βββ z_pub_thr.rs # Example with std/wasm/embassy io
β βββ z_put.rs # Example with std/wasm/embassy io
β βββ z_querier.rs # Example with std/wasm/embassy io
β βββ z_queryable.rs # Example with std/wasm/embassy io
β βββ z_sub.rs # Example with std/wasm/embassy io
β βββ z_sub_thr.rs # Example with std/wasm/embassy io
β
βββ platforms/ # Platform-specific implementations
β βββ zenoh-embassy/ # Embassy platforms (no_std)
β βββ zenoh-std/ # Standard platforms (std)
β βββ zenoh-wasm/ # WASM32 platforms (wasm)
β
βββ Cargo.toml # Workspace + example package
βββ src/
βββ lib.rs # Example lib.rs
π Documentation
The base project has been implemented in (#6) The structure and API have been reworked in (#34) The API has been reworked (#52)