SomeIpMessage

Struct SomeIpMessage 

Source
pub struct SomeIpMessage {
    pub header: SomeIpHeader,
    pub payload: Bytes,
}
Expand description

A complete SOME/IP message (header + payload).

Fields§

§header: SomeIpHeader

Message header.

§payload: Bytes

Message payload.

Implementations§

Source§

impl SomeIpMessage

Source

pub fn new(header: SomeIpHeader, payload: impl Into<Bytes>) -> Self

Create a new message with the given header and payload.

Source

pub fn with_header(header: SomeIpHeader) -> Self

Create a new message with an empty payload.

Source

pub fn request(service_id: ServiceId, method_id: MethodId) -> MessageBuilder

Create a request message builder.

Examples found in repository?
examples/udp_client.rs (line 28)
17fn main() -> Result<(), Box<dyn std::error::Error>> {
18    println!("Creating SOME/IP UDP client...");
19
20    let mut client = UdpClient::new()?;
21    client.set_client_id(ClientId(0x0200));
22    client.set_read_timeout(Some(Duration::from_secs(5)))?;
23
24    println!("Client bound to {}", client.local_addr()?);
25
26    // Example 1: Request with call_to (specify address per-request)
27    println!("\n--- Example 1: Request/Response ---");
28    let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_REVERSE))
29        .payload(b"Hello UDP!".as_slice())
30        .build();
31
32    println!(
33        "Sending: {:?}",
34        String::from_utf8_lossy(&request.payload)
35    );
36
37    let response = client.call_to(SERVER_ADDR, request)?;
38    println!(
39        "Received: {:?} (reversed)",
40        String::from_utf8_lossy(&response.payload)
41    );
42
43    // Example 2: Connect and use call()
44    println!("\n--- Example 2: Connected Mode ---");
45    client.connect(SERVER_ADDR)?;
46    println!("Connected to {SERVER_ADDR}");
47
48    for word in ["Rust", "SOME/IP", "Automotive"] {
49        let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_REVERSE))
50            .payload(word.as_bytes().to_vec())
51            .build();
52
53        let response = client.call(request)?;
54        println!(
55            "{} -> {}",
56            word,
57            String::from_utf8_lossy(&response.payload)
58        );
59    }
60
61    // Example 3: Send notification (fire-and-forget)
62    println!("\n--- Example 3: Notification ---");
63    let notification = SomeIpMessage::notification(ServiceId(SERVICE_ID), MethodId(0x8001))
64        .payload(b"Event occurred!".as_slice())
65        .build();
66
67    client.send(notification)?;
68    println!("Notification sent!");
69
70    println!("\nDone!");
71    Ok(())
72}
More examples
Hide additional examples
examples/tcp_client.rs (line 29)
18fn main() -> Result<(), Box<dyn std::error::Error>> {
19    println!("Connecting to SOME/IP server at {SERVER_ADDR}...");
20
21    let mut client = TcpClient::connect(SERVER_ADDR)?;
22    client.set_client_id(ClientId(0x0100));
23    client.set_read_timeout(Some(Duration::from_secs(5)))?;
24
25    println!("Connected!");
26
27    // Example 1: Simple echo request
28    println!("\n--- Example 1: Echo Request ---");
29    let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_ECHO))
30        .payload(b"Hello, SOME/IP!".as_slice())
31        .build();
32
33    println!(
34        "Sending request: service={}, method={}, payload={:?}",
35        request.header.service_id,
36        request.header.method_id,
37        String::from_utf8_lossy(&request.payload)
38    );
39
40    let response = client.call(request)?;
41    println!(
42        "Received response: return_code={:?}, payload={:?}",
43        response.header.return_code,
44        String::from_utf8_lossy(&response.payload)
45    );
46
47    // Example 2: Multiple requests
48    println!("\n--- Example 2: Multiple Requests ---");
49    for i in 1..=3 {
50        let payload = format!("Message #{i}");
51        let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_GREET))
52            .payload(payload.as_bytes().to_vec())
53            .build();
54
55        println!("Request {i}: session_id={}", request.header.session_id);
56        let response = client.call(request)?;
57        println!(
58            "Response {i}: session_id={}, payload={:?}",
59            response.header.session_id,
60            String::from_utf8_lossy(&response.payload)
61        );
62    }
63
64    // Example 3: Fire-and-forget (notification)
65    println!("\n--- Example 3: Fire-and-Forget ---");
66    let notification =
67        SomeIpMessage::request_no_return(ServiceId(SERVICE_ID), MethodId(METHOD_ECHO))
68            .payload(b"This is a notification".as_slice())
69            .build();
70
71    println!("Sending notification (no response expected)...");
72    client.send(notification)?;
73    println!("Notification sent!");
74
75    println!("\nDone!");
76    Ok(())
77}
examples/message_basics.rs (line 18)
13fn main() {
14    println!("=== SOME/IP Message Basics ===\n");
15
16    // Example 1: Create a request message using the builder
17    println!("--- Example 1: Building Messages ---");
18    let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19        .client_id(ClientId(0x0100))
20        .session_id(SessionId(0x0001))
21        .interface_version(2)
22        .payload(b"Hello, World!".as_slice())
23        .build();
24
25    println!("Request message:");
26    print_message(&request);
27
28    // Example 2: Create a response from the request
29    println!("\n--- Example 2: Creating Responses ---");
30    let response = request
31        .create_response()
32        .payload(b"Response data".as_slice())
33        .build();
34
35    println!("Response message:");
36    print_message(&response);
37
38    // Example 3: Create an error response
39    println!("\n--- Example 3: Error Response ---");
40    let error = request
41        .create_error_response(ReturnCode::UnknownMethod)
42        .build();
43
44    println!("Error response:");
45    print_message(&error);
46
47    // Example 4: Serialize and deserialize
48    println!("\n--- Example 4: Serialization ---");
49    let bytes = request.to_bytes();
50    println!("Serialized to {} bytes", bytes.len());
51    println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52    println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54    let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55    println!("\nParsed message matches original: {}", parsed == request);
56
57    // Example 5: Working with headers directly
58    println!("\n--- Example 5: Header Details ---");
59    let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60    println!("Service ID: {}", header.service_id);
61    println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62    println!("Message ID: 0x{:08X}", header.message_id());
63    println!("Request ID: 0x{:08X}", header.request_id());
64
65    // Example 6: Different message types
66    println!("\n--- Example 6: Message Types ---");
67
68    let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69        .payload(b"Event data".as_slice())
70        .build();
71    println!("Notification: type={:?}, method_id={} (is_event: {})",
72        notification.header.message_type,
73        notification.header.method_id,
74        notification.header.method_id.is_event()
75    );
76
77    let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78        .payload(b"Fire and forget".as_slice())
79        .build();
80    println!("Fire-and-forget: type={:?}, expects_response: {}",
81        fire_and_forget.header.message_type,
82        fire_and_forget.expects_response()
83    );
84
85    // Example 7: Return codes
86    println!("\n--- Example 7: Return Codes ---");
87    for code in [
88        ReturnCode::Ok,
89        ReturnCode::NotOk,
90        ReturnCode::UnknownService,
91        ReturnCode::UnknownMethod,
92        ReturnCode::Timeout,
93    ] {
94        println!("  {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95    }
96
97    println!("\n=== Done! ===");
98}
Source

pub fn request_no_return( service_id: ServiceId, method_id: MethodId, ) -> MessageBuilder

Create a request-no-return message builder.

Examples found in repository?
examples/tcp_client.rs (line 67)
18fn main() -> Result<(), Box<dyn std::error::Error>> {
19    println!("Connecting to SOME/IP server at {SERVER_ADDR}...");
20
21    let mut client = TcpClient::connect(SERVER_ADDR)?;
22    client.set_client_id(ClientId(0x0100));
23    client.set_read_timeout(Some(Duration::from_secs(5)))?;
24
25    println!("Connected!");
26
27    // Example 1: Simple echo request
28    println!("\n--- Example 1: Echo Request ---");
29    let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_ECHO))
30        .payload(b"Hello, SOME/IP!".as_slice())
31        .build();
32
33    println!(
34        "Sending request: service={}, method={}, payload={:?}",
35        request.header.service_id,
36        request.header.method_id,
37        String::from_utf8_lossy(&request.payload)
38    );
39
40    let response = client.call(request)?;
41    println!(
42        "Received response: return_code={:?}, payload={:?}",
43        response.header.return_code,
44        String::from_utf8_lossy(&response.payload)
45    );
46
47    // Example 2: Multiple requests
48    println!("\n--- Example 2: Multiple Requests ---");
49    for i in 1..=3 {
50        let payload = format!("Message #{i}");
51        let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_GREET))
52            .payload(payload.as_bytes().to_vec())
53            .build();
54
55        println!("Request {i}: session_id={}", request.header.session_id);
56        let response = client.call(request)?;
57        println!(
58            "Response {i}: session_id={}, payload={:?}",
59            response.header.session_id,
60            String::from_utf8_lossy(&response.payload)
61        );
62    }
63
64    // Example 3: Fire-and-forget (notification)
65    println!("\n--- Example 3: Fire-and-Forget ---");
66    let notification =
67        SomeIpMessage::request_no_return(ServiceId(SERVICE_ID), MethodId(METHOD_ECHO))
68            .payload(b"This is a notification".as_slice())
69            .build();
70
71    println!("Sending notification (no response expected)...");
72    client.send(notification)?;
73    println!("Notification sent!");
74
75    println!("\nDone!");
76    Ok(())
77}
More examples
Hide additional examples
examples/message_basics.rs (line 77)
13fn main() {
14    println!("=== SOME/IP Message Basics ===\n");
15
16    // Example 1: Create a request message using the builder
17    println!("--- Example 1: Building Messages ---");
18    let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19        .client_id(ClientId(0x0100))
20        .session_id(SessionId(0x0001))
21        .interface_version(2)
22        .payload(b"Hello, World!".as_slice())
23        .build();
24
25    println!("Request message:");
26    print_message(&request);
27
28    // Example 2: Create a response from the request
29    println!("\n--- Example 2: Creating Responses ---");
30    let response = request
31        .create_response()
32        .payload(b"Response data".as_slice())
33        .build();
34
35    println!("Response message:");
36    print_message(&response);
37
38    // Example 3: Create an error response
39    println!("\n--- Example 3: Error Response ---");
40    let error = request
41        .create_error_response(ReturnCode::UnknownMethod)
42        .build();
43
44    println!("Error response:");
45    print_message(&error);
46
47    // Example 4: Serialize and deserialize
48    println!("\n--- Example 4: Serialization ---");
49    let bytes = request.to_bytes();
50    println!("Serialized to {} bytes", bytes.len());
51    println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52    println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54    let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55    println!("\nParsed message matches original: {}", parsed == request);
56
57    // Example 5: Working with headers directly
58    println!("\n--- Example 5: Header Details ---");
59    let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60    println!("Service ID: {}", header.service_id);
61    println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62    println!("Message ID: 0x{:08X}", header.message_id());
63    println!("Request ID: 0x{:08X}", header.request_id());
64
65    // Example 6: Different message types
66    println!("\n--- Example 6: Message Types ---");
67
68    let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69        .payload(b"Event data".as_slice())
70        .build();
71    println!("Notification: type={:?}, method_id={} (is_event: {})",
72        notification.header.message_type,
73        notification.header.method_id,
74        notification.header.method_id.is_event()
75    );
76
77    let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78        .payload(b"Fire and forget".as_slice())
79        .build();
80    println!("Fire-and-forget: type={:?}, expects_response: {}",
81        fire_and_forget.header.message_type,
82        fire_and_forget.expects_response()
83    );
84
85    // Example 7: Return codes
86    println!("\n--- Example 7: Return Codes ---");
87    for code in [
88        ReturnCode::Ok,
89        ReturnCode::NotOk,
90        ReturnCode::UnknownService,
91        ReturnCode::UnknownMethod,
92        ReturnCode::Timeout,
93    ] {
94        println!("  {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95    }
96
97    println!("\n=== Done! ===");
98}
Source

pub fn notification( service_id: ServiceId, method_id: MethodId, ) -> MessageBuilder

Create a notification message builder.

Examples found in repository?
examples/udp_client.rs (line 63)
17fn main() -> Result<(), Box<dyn std::error::Error>> {
18    println!("Creating SOME/IP UDP client...");
19
20    let mut client = UdpClient::new()?;
21    client.set_client_id(ClientId(0x0200));
22    client.set_read_timeout(Some(Duration::from_secs(5)))?;
23
24    println!("Client bound to {}", client.local_addr()?);
25
26    // Example 1: Request with call_to (specify address per-request)
27    println!("\n--- Example 1: Request/Response ---");
28    let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_REVERSE))
29        .payload(b"Hello UDP!".as_slice())
30        .build();
31
32    println!(
33        "Sending: {:?}",
34        String::from_utf8_lossy(&request.payload)
35    );
36
37    let response = client.call_to(SERVER_ADDR, request)?;
38    println!(
39        "Received: {:?} (reversed)",
40        String::from_utf8_lossy(&response.payload)
41    );
42
43    // Example 2: Connect and use call()
44    println!("\n--- Example 2: Connected Mode ---");
45    client.connect(SERVER_ADDR)?;
46    println!("Connected to {SERVER_ADDR}");
47
48    for word in ["Rust", "SOME/IP", "Automotive"] {
49        let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_REVERSE))
50            .payload(word.as_bytes().to_vec())
51            .build();
52
53        let response = client.call(request)?;
54        println!(
55            "{} -> {}",
56            word,
57            String::from_utf8_lossy(&response.payload)
58        );
59    }
60
61    // Example 3: Send notification (fire-and-forget)
62    println!("\n--- Example 3: Notification ---");
63    let notification = SomeIpMessage::notification(ServiceId(SERVICE_ID), MethodId(0x8001))
64        .payload(b"Event occurred!".as_slice())
65        .build();
66
67    client.send(notification)?;
68    println!("Notification sent!");
69
70    println!("\nDone!");
71    Ok(())
72}
More examples
Hide additional examples
examples/message_basics.rs (line 68)
13fn main() {
14    println!("=== SOME/IP Message Basics ===\n");
15
16    // Example 1: Create a request message using the builder
17    println!("--- Example 1: Building Messages ---");
18    let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19        .client_id(ClientId(0x0100))
20        .session_id(SessionId(0x0001))
21        .interface_version(2)
22        .payload(b"Hello, World!".as_slice())
23        .build();
24
25    println!("Request message:");
26    print_message(&request);
27
28    // Example 2: Create a response from the request
29    println!("\n--- Example 2: Creating Responses ---");
30    let response = request
31        .create_response()
32        .payload(b"Response data".as_slice())
33        .build();
34
35    println!("Response message:");
36    print_message(&response);
37
38    // Example 3: Create an error response
39    println!("\n--- Example 3: Error Response ---");
40    let error = request
41        .create_error_response(ReturnCode::UnknownMethod)
42        .build();
43
44    println!("Error response:");
45    print_message(&error);
46
47    // Example 4: Serialize and deserialize
48    println!("\n--- Example 4: Serialization ---");
49    let bytes = request.to_bytes();
50    println!("Serialized to {} bytes", bytes.len());
51    println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52    println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54    let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55    println!("\nParsed message matches original: {}", parsed == request);
56
57    // Example 5: Working with headers directly
58    println!("\n--- Example 5: Header Details ---");
59    let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60    println!("Service ID: {}", header.service_id);
61    println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62    println!("Message ID: 0x{:08X}", header.message_id());
63    println!("Request ID: 0x{:08X}", header.request_id());
64
65    // Example 6: Different message types
66    println!("\n--- Example 6: Message Types ---");
67
68    let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69        .payload(b"Event data".as_slice())
70        .build();
71    println!("Notification: type={:?}, method_id={} (is_event: {})",
72        notification.header.message_type,
73        notification.header.method_id,
74        notification.header.method_id.is_event()
75    );
76
77    let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78        .payload(b"Fire and forget".as_slice())
79        .build();
80    println!("Fire-and-forget: type={:?}, expects_response: {}",
81        fire_and_forget.header.message_type,
82        fire_and_forget.expects_response()
83    );
84
85    // Example 7: Return codes
86    println!("\n--- Example 7: Return Codes ---");
87    for code in [
88        ReturnCode::Ok,
89        ReturnCode::NotOk,
90        ReturnCode::UnknownService,
91        ReturnCode::UnknownMethod,
92        ReturnCode::Timeout,
93    ] {
94        println!("  {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95    }
96
97    println!("\n=== Done! ===");
98}
Source

pub fn create_response(&self) -> MessageBuilder

Create a response to this message.

Examples found in repository?
examples/tcp_server.rs (line 55)
16fn main() -> Result<(), Box<dyn std::error::Error>> {
17    println!("Starting SOME/IP TCP server on {BIND_ADDR}...");
18
19    let server = TcpServer::bind(BIND_ADDR)?;
20    println!("Server listening on {}", server.local_addr());
21
22    for connection in server.incoming() {
23        match connection {
24            Ok(mut conn) => {
25                let peer = conn.peer_addr();
26                println!("New connection from {peer}");
27
28                // Handle each connection in a separate thread
29                thread::spawn(move || {
30                    loop {
31                        match conn.read_message() {
32                            Ok(request) => {
33                                println!(
34                                    "Received: service={}, method={}, type={:?}, payload={} bytes",
35                                    request.header.service_id,
36                                    request.header.method_id,
37                                    request.header.message_type,
38                                    request.payload.len()
39                                );
40
41                                // Check if it's our service
42                                if request.header.service_id != ServiceId(SERVICE_ID) {
43                                    println!("Unknown service, sending error response");
44                                    let error = request
45                                        .create_error_response(ReturnCode::UnknownService)
46                                        .build();
47                                    let _ = conn.write_message(&error);
48                                    continue;
49                                }
50
51                                // Only respond to requests (not notifications)
52                                if request.header.message_type == MessageType::Request {
53                                    // Echo back the payload
54                                    let response = request
55                                        .create_response()
56                                        .payload(request.payload.clone())
57                                        .build();
58
59                                    if let Err(e) = conn.write_message(&response) {
60                                        eprintln!("Failed to send response: {e}");
61                                        break;
62                                    }
63                                    println!("Sent response");
64                                }
65                            }
66                            Err(e) => {
67                                eprintln!("Connection error: {e}");
68                                break;
69                            }
70                        }
71                    }
72                    println!("Connection closed: {peer}");
73                });
74            }
75            Err(e) => {
76                eprintln!("Accept error: {e}");
77            }
78        }
79    }
80
81    Ok(())
82}
More examples
Hide additional examples
examples/message_basics.rs (line 31)
13fn main() {
14    println!("=== SOME/IP Message Basics ===\n");
15
16    // Example 1: Create a request message using the builder
17    println!("--- Example 1: Building Messages ---");
18    let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19        .client_id(ClientId(0x0100))
20        .session_id(SessionId(0x0001))
21        .interface_version(2)
22        .payload(b"Hello, World!".as_slice())
23        .build();
24
25    println!("Request message:");
26    print_message(&request);
27
28    // Example 2: Create a response from the request
29    println!("\n--- Example 2: Creating Responses ---");
30    let response = request
31        .create_response()
32        .payload(b"Response data".as_slice())
33        .build();
34
35    println!("Response message:");
36    print_message(&response);
37
38    // Example 3: Create an error response
39    println!("\n--- Example 3: Error Response ---");
40    let error = request
41        .create_error_response(ReturnCode::UnknownMethod)
42        .build();
43
44    println!("Error response:");
45    print_message(&error);
46
47    // Example 4: Serialize and deserialize
48    println!("\n--- Example 4: Serialization ---");
49    let bytes = request.to_bytes();
50    println!("Serialized to {} bytes", bytes.len());
51    println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52    println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54    let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55    println!("\nParsed message matches original: {}", parsed == request);
56
57    // Example 5: Working with headers directly
58    println!("\n--- Example 5: Header Details ---");
59    let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60    println!("Service ID: {}", header.service_id);
61    println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62    println!("Message ID: 0x{:08X}", header.message_id());
63    println!("Request ID: 0x{:08X}", header.request_id());
64
65    // Example 6: Different message types
66    println!("\n--- Example 6: Message Types ---");
67
68    let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69        .payload(b"Event data".as_slice())
70        .build();
71    println!("Notification: type={:?}, method_id={} (is_event: {})",
72        notification.header.message_type,
73        notification.header.method_id,
74        notification.header.method_id.is_event()
75    );
76
77    let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78        .payload(b"Fire and forget".as_slice())
79        .build();
80    println!("Fire-and-forget: type={:?}, expects_response: {}",
81        fire_and_forget.header.message_type,
82        fire_and_forget.expects_response()
83    );
84
85    // Example 7: Return codes
86    println!("\n--- Example 7: Return Codes ---");
87    for code in [
88        ReturnCode::Ok,
89        ReturnCode::NotOk,
90        ReturnCode::UnknownService,
91        ReturnCode::UnknownMethod,
92        ReturnCode::Timeout,
93    ] {
94        println!("  {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95    }
96
97    println!("\n=== Done! ===");
98}
Source

pub fn create_error_response(&self, return_code: ReturnCode) -> MessageBuilder

Create an error response to this message.

Examples found in repository?
examples/tcp_server.rs (line 45)
16fn main() -> Result<(), Box<dyn std::error::Error>> {
17    println!("Starting SOME/IP TCP server on {BIND_ADDR}...");
18
19    let server = TcpServer::bind(BIND_ADDR)?;
20    println!("Server listening on {}", server.local_addr());
21
22    for connection in server.incoming() {
23        match connection {
24            Ok(mut conn) => {
25                let peer = conn.peer_addr();
26                println!("New connection from {peer}");
27
28                // Handle each connection in a separate thread
29                thread::spawn(move || {
30                    loop {
31                        match conn.read_message() {
32                            Ok(request) => {
33                                println!(
34                                    "Received: service={}, method={}, type={:?}, payload={} bytes",
35                                    request.header.service_id,
36                                    request.header.method_id,
37                                    request.header.message_type,
38                                    request.payload.len()
39                                );
40
41                                // Check if it's our service
42                                if request.header.service_id != ServiceId(SERVICE_ID) {
43                                    println!("Unknown service, sending error response");
44                                    let error = request
45                                        .create_error_response(ReturnCode::UnknownService)
46                                        .build();
47                                    let _ = conn.write_message(&error);
48                                    continue;
49                                }
50
51                                // Only respond to requests (not notifications)
52                                if request.header.message_type == MessageType::Request {
53                                    // Echo back the payload
54                                    let response = request
55                                        .create_response()
56                                        .payload(request.payload.clone())
57                                        .build();
58
59                                    if let Err(e) = conn.write_message(&response) {
60                                        eprintln!("Failed to send response: {e}");
61                                        break;
62                                    }
63                                    println!("Sent response");
64                                }
65                            }
66                            Err(e) => {
67                                eprintln!("Connection error: {e}");
68                                break;
69                            }
70                        }
71                    }
72                    println!("Connection closed: {peer}");
73                });
74            }
75            Err(e) => {
76                eprintln!("Accept error: {e}");
77            }
78        }
79    }
80
81    Ok(())
82}
More examples
Hide additional examples
examples/message_basics.rs (line 41)
13fn main() {
14    println!("=== SOME/IP Message Basics ===\n");
15
16    // Example 1: Create a request message using the builder
17    println!("--- Example 1: Building Messages ---");
18    let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19        .client_id(ClientId(0x0100))
20        .session_id(SessionId(0x0001))
21        .interface_version(2)
22        .payload(b"Hello, World!".as_slice())
23        .build();
24
25    println!("Request message:");
26    print_message(&request);
27
28    // Example 2: Create a response from the request
29    println!("\n--- Example 2: Creating Responses ---");
30    let response = request
31        .create_response()
32        .payload(b"Response data".as_slice())
33        .build();
34
35    println!("Response message:");
36    print_message(&response);
37
38    // Example 3: Create an error response
39    println!("\n--- Example 3: Error Response ---");
40    let error = request
41        .create_error_response(ReturnCode::UnknownMethod)
42        .build();
43
44    println!("Error response:");
45    print_message(&error);
46
47    // Example 4: Serialize and deserialize
48    println!("\n--- Example 4: Serialization ---");
49    let bytes = request.to_bytes();
50    println!("Serialized to {} bytes", bytes.len());
51    println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52    println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54    let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55    println!("\nParsed message matches original: {}", parsed == request);
56
57    // Example 5: Working with headers directly
58    println!("\n--- Example 5: Header Details ---");
59    let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60    println!("Service ID: {}", header.service_id);
61    println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62    println!("Message ID: 0x{:08X}", header.message_id());
63    println!("Request ID: 0x{:08X}", header.request_id());
64
65    // Example 6: Different message types
66    println!("\n--- Example 6: Message Types ---");
67
68    let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69        .payload(b"Event data".as_slice())
70        .build();
71    println!("Notification: type={:?}, method_id={} (is_event: {})",
72        notification.header.message_type,
73        notification.header.method_id,
74        notification.header.method_id.is_event()
75    );
76
77    let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78        .payload(b"Fire and forget".as_slice())
79        .build();
80    println!("Fire-and-forget: type={:?}, expects_response: {}",
81        fire_and_forget.header.message_type,
82        fire_and_forget.expects_response()
83    );
84
85    // Example 7: Return codes
86    println!("\n--- Example 7: Return Codes ---");
87    for code in [
88        ReturnCode::Ok,
89        ReturnCode::NotOk,
90        ReturnCode::UnknownService,
91        ReturnCode::UnknownMethod,
92        ReturnCode::Timeout,
93    ] {
94        println!("  {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95    }
96
97    println!("\n=== Done! ===");
98}
Source

pub fn from_bytes(data: &[u8]) -> Result<Self>

Parse a message from bytes.

Examples found in repository?
examples/message_basics.rs (line 54)
13fn main() {
14    println!("=== SOME/IP Message Basics ===\n");
15
16    // Example 1: Create a request message using the builder
17    println!("--- Example 1: Building Messages ---");
18    let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19        .client_id(ClientId(0x0100))
20        .session_id(SessionId(0x0001))
21        .interface_version(2)
22        .payload(b"Hello, World!".as_slice())
23        .build();
24
25    println!("Request message:");
26    print_message(&request);
27
28    // Example 2: Create a response from the request
29    println!("\n--- Example 2: Creating Responses ---");
30    let response = request
31        .create_response()
32        .payload(b"Response data".as_slice())
33        .build();
34
35    println!("Response message:");
36    print_message(&response);
37
38    // Example 3: Create an error response
39    println!("\n--- Example 3: Error Response ---");
40    let error = request
41        .create_error_response(ReturnCode::UnknownMethod)
42        .build();
43
44    println!("Error response:");
45    print_message(&error);
46
47    // Example 4: Serialize and deserialize
48    println!("\n--- Example 4: Serialization ---");
49    let bytes = request.to_bytes();
50    println!("Serialized to {} bytes", bytes.len());
51    println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52    println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54    let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55    println!("\nParsed message matches original: {}", parsed == request);
56
57    // Example 5: Working with headers directly
58    println!("\n--- Example 5: Header Details ---");
59    let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60    println!("Service ID: {}", header.service_id);
61    println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62    println!("Message ID: 0x{:08X}", header.message_id());
63    println!("Request ID: 0x{:08X}", header.request_id());
64
65    // Example 6: Different message types
66    println!("\n--- Example 6: Message Types ---");
67
68    let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69        .payload(b"Event data".as_slice())
70        .build();
71    println!("Notification: type={:?}, method_id={} (is_event: {})",
72        notification.header.message_type,
73        notification.header.method_id,
74        notification.header.method_id.is_event()
75    );
76
77    let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78        .payload(b"Fire and forget".as_slice())
79        .build();
80    println!("Fire-and-forget: type={:?}, expects_response: {}",
81        fire_and_forget.header.message_type,
82        fire_and_forget.expects_response()
83    );
84
85    // Example 7: Return codes
86    println!("\n--- Example 7: Return Codes ---");
87    for code in [
88        ReturnCode::Ok,
89        ReturnCode::NotOk,
90        ReturnCode::UnknownService,
91        ReturnCode::UnknownMethod,
92        ReturnCode::Timeout,
93    ] {
94        println!("  {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95    }
96
97    println!("\n=== Done! ===");
98}
Source

pub fn to_bytes(&self) -> Vec<u8>

Serialize the message to bytes.

Examples found in repository?
examples/message_basics.rs (line 49)
13fn main() {
14    println!("=== SOME/IP Message Basics ===\n");
15
16    // Example 1: Create a request message using the builder
17    println!("--- Example 1: Building Messages ---");
18    let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19        .client_id(ClientId(0x0100))
20        .session_id(SessionId(0x0001))
21        .interface_version(2)
22        .payload(b"Hello, World!".as_slice())
23        .build();
24
25    println!("Request message:");
26    print_message(&request);
27
28    // Example 2: Create a response from the request
29    println!("\n--- Example 2: Creating Responses ---");
30    let response = request
31        .create_response()
32        .payload(b"Response data".as_slice())
33        .build();
34
35    println!("Response message:");
36    print_message(&response);
37
38    // Example 3: Create an error response
39    println!("\n--- Example 3: Error Response ---");
40    let error = request
41        .create_error_response(ReturnCode::UnknownMethod)
42        .build();
43
44    println!("Error response:");
45    print_message(&error);
46
47    // Example 4: Serialize and deserialize
48    println!("\n--- Example 4: Serialization ---");
49    let bytes = request.to_bytes();
50    println!("Serialized to {} bytes", bytes.len());
51    println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52    println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54    let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55    println!("\nParsed message matches original: {}", parsed == request);
56
57    // Example 5: Working with headers directly
58    println!("\n--- Example 5: Header Details ---");
59    let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60    println!("Service ID: {}", header.service_id);
61    println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62    println!("Message ID: 0x{:08X}", header.message_id());
63    println!("Request ID: 0x{:08X}", header.request_id());
64
65    // Example 6: Different message types
66    println!("\n--- Example 6: Message Types ---");
67
68    let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69        .payload(b"Event data".as_slice())
70        .build();
71    println!("Notification: type={:?}, method_id={} (is_event: {})",
72        notification.header.message_type,
73        notification.header.method_id,
74        notification.header.method_id.is_event()
75    );
76
77    let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78        .payload(b"Fire and forget".as_slice())
79        .build();
80    println!("Fire-and-forget: type={:?}, expects_response: {}",
81        fire_and_forget.header.message_type,
82        fire_and_forget.expects_response()
83    );
84
85    // Example 7: Return codes
86    println!("\n--- Example 7: Return Codes ---");
87    for code in [
88        ReturnCode::Ok,
89        ReturnCode::NotOk,
90        ReturnCode::UnknownService,
91        ReturnCode::UnknownMethod,
92        ReturnCode::Timeout,
93    ] {
94        println!("  {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95    }
96
97    println!("\n=== Done! ===");
98}
Source

pub fn total_size(&self) -> usize

Get the total message size (header + payload).

Source

pub fn is_request(&self) -> bool

Check if this message is a request.

Source

pub fn is_response(&self) -> bool

Check if this message is a response.

Source

pub fn expects_response(&self) -> bool

Check if this message expects a response.

Examples found in repository?
examples/message_basics.rs (line 82)
13fn main() {
14    println!("=== SOME/IP Message Basics ===\n");
15
16    // Example 1: Create a request message using the builder
17    println!("--- Example 1: Building Messages ---");
18    let request = SomeIpMessage::request(ServiceId(0x1234), MethodId(0x0001))
19        .client_id(ClientId(0x0100))
20        .session_id(SessionId(0x0001))
21        .interface_version(2)
22        .payload(b"Hello, World!".as_slice())
23        .build();
24
25    println!("Request message:");
26    print_message(&request);
27
28    // Example 2: Create a response from the request
29    println!("\n--- Example 2: Creating Responses ---");
30    let response = request
31        .create_response()
32        .payload(b"Response data".as_slice())
33        .build();
34
35    println!("Response message:");
36    print_message(&response);
37
38    // Example 3: Create an error response
39    println!("\n--- Example 3: Error Response ---");
40    let error = request
41        .create_error_response(ReturnCode::UnknownMethod)
42        .build();
43
44    println!("Error response:");
45    print_message(&error);
46
47    // Example 4: Serialize and deserialize
48    println!("\n--- Example 4: Serialization ---");
49    let bytes = request.to_bytes();
50    println!("Serialized to {} bytes", bytes.len());
51    println!("Header bytes: {:02X?}", &bytes[..HEADER_SIZE]);
52    println!("Payload bytes: {:02X?}", &bytes[HEADER_SIZE..]);
53
54    let parsed = SomeIpMessage::from_bytes(&bytes).expect("Failed to parse");
55    println!("\nParsed message matches original: {}", parsed == request);
56
57    // Example 5: Working with headers directly
58    println!("\n--- Example 5: Header Details ---");
59    let header = SomeIpHeader::new(ServiceId(0xFFFF), MethodId(0x8001));
60    println!("Service ID: {}", header.service_id);
61    println!("Method ID: {} (is_event: {})", header.method_id, header.method_id.is_event());
62    println!("Message ID: 0x{:08X}", header.message_id());
63    println!("Request ID: 0x{:08X}", header.request_id());
64
65    // Example 6: Different message types
66    println!("\n--- Example 6: Message Types ---");
67
68    let notification = SomeIpMessage::notification(ServiceId(0x1234), MethodId::event(0x0001))
69        .payload(b"Event data".as_slice())
70        .build();
71    println!("Notification: type={:?}, method_id={} (is_event: {})",
72        notification.header.message_type,
73        notification.header.method_id,
74        notification.header.method_id.is_event()
75    );
76
77    let fire_and_forget = SomeIpMessage::request_no_return(ServiceId(0x1234), MethodId(0x0002))
78        .payload(b"Fire and forget".as_slice())
79        .build();
80    println!("Fire-and-forget: type={:?}, expects_response: {}",
81        fire_and_forget.header.message_type,
82        fire_and_forget.expects_response()
83    );
84
85    // Example 7: Return codes
86    println!("\n--- Example 7: Return Codes ---");
87    for code in [
88        ReturnCode::Ok,
89        ReturnCode::NotOk,
90        ReturnCode::UnknownService,
91        ReturnCode::UnknownMethod,
92        ReturnCode::Timeout,
93    ] {
94        println!("  {:?}: is_ok={}, value=0x{:02X}", code, code.is_ok(), code as u8);
95    }
96
97    println!("\n=== Done! ===");
98}
Source

pub fn service_id(&self) -> ServiceId

Get the service ID.

Source

pub fn method_id(&self) -> MethodId

Get the method ID.

Source

pub fn client_id(&self) -> ClientId

Get the client ID.

Source

pub fn session_id(&self) -> SessionId

Get the session ID.

Source

pub fn return_code(&self) -> ReturnCode

Get the return code.

Source

pub fn is_ok(&self) -> bool

Check if the return code indicates success.

Trait Implementations§

Source§

impl Clone for SomeIpMessage

Source§

fn clone(&self) -> SomeIpMessage

Returns a duplicate of the value. Read more
1.0.0§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SomeIpMessage

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for SomeIpMessage

Source§

fn eq(&self, other: &SomeIpMessage) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Eq for SomeIpMessage

Source§

impl StructuralPartialEq for SomeIpMessage

Auto Trait Implementations§

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneToUninit for T
where T: Clone,

§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.