Skip to content

reneherrero/someip-rs

Repository files navigation

someip-rs

A Rust library for the SOME/IP (Scalable service-Oriented MiddlewarE over IP) protocol, built on std::net.

Crates.io Documentation License

Features

  • Pure Rust - No C dependencies, built on std::net
  • Complete header support - Full 16-byte SOME/IP header with serialization
  • Type-safe IDs - ServiceId, MethodId, ClientId, SessionId newtypes
  • TCP & UDP - Both transport protocols with client/server support
  • Builder pattern - Fluent API for message construction
  • Request/Response - Built-in session management and correlation

Quick Start

[dependencies]
someip-rs = "0.1"

Send a Request (TCP)

use someip_rs::{SomeIpMessage, ServiceId, MethodId};
use someip_rs::transport::TcpClient;

let mut client = TcpClient::connect("127.0.0.1:30490")?;

let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
    .payload(b"Hello, SOME/IP!".as_slice())
    .build();

let response = client.call(request)?;
println!("Response: {:?}", response.payload);

Handle Requests (TCP Server)

use someip_rs::transport::TcpServer;
use someip_rs::MessageType;

let server = TcpServer::bind("127.0.0.1:30490")?;

for connection in server.incoming() {
    let mut conn = connection?;
    let request = conn.read_message()?;

    if request.header.message_type == MessageType::Request {
        let response = request.create_response()
            .payload(b"Hello back!".as_slice())
            .build();
        conn.write_message(&response)?;
    }
}

UDP Client/Server

use someip_rs::{SomeIpMessage, ServiceId, MethodId};
use someip_rs::transport::{UdpClient, UdpServer};

// Client
let mut client = UdpClient::new()?;
let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
    .payload(b"ping".as_slice())
    .build();
let response = client.call_to("127.0.0.1:30491", request)?;

// Server
let mut server = UdpServer::bind("127.0.0.1:30491")?;
let (request, client_addr) = server.receive()?;
server.respond(&request, b"pong".as_slice(), client_addr)?;

Protocol Overview

SOME/IP messages consist of a 16-byte header followed by an optional payload:

+----------------+----------------+----------------+----------------+
|         Service ID (16)         |         Method ID (16)          |
+----------------+----------------+----------------+----------------+
|                          Length (32)                              |
+----------------+----------------+----------------+----------------+
|         Client ID (16)          |         Session ID (16)         |
+----------------+----------------+----------------+----------------+
| Proto Ver (8)  | Iface Ver (8)  | Msg Type (8)   | Return Code(8) |
+----------------+----------------+----------------+----------------+
|                         Payload (variable)                        |
+----------------+----------------+----------------+----------------+

Examples

See examples/ for complete working examples:

  • message_basics.rs - Message creation, serialization, and parsing
  • tcp_server.rs - TCP echo server
  • tcp_client.rs - TCP client with request/response
  • udp_server.rs - UDP server with responses
  • udp_client.rs - UDP client with request/response

Run examples:

# Message basics (standalone)
cargo run --example message_basics

# TCP (run server first, then client)
cargo run --example tcp_server
cargo run --example tcp_client

# UDP (run server first, then client)
cargo run --example udp_server
cargo run --example udp_client

Documentation

License

MIT OR Apache-2.0. See LICENSING.md.

About

No description, website, or topics provided.

Resources

License

Unknown and 2 other licenses found

Licenses found

Unknown
LICENSE-APACHE
Unknown
LICENSE-COMMERCIAL
MIT
LICENSE-MIT

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages