MessageBuilder

Struct MessageBuilder 

Source
pub struct MessageBuilder { /* private fields */ }
Expand description

Builder for constructing SOME/IP messages.

Implementations§

Source§

impl MessageBuilder

Source

pub fn new( service_id: ServiceId, method_id: MethodId, message_type: MessageType, ) -> Self

Create a new message builder.

Source

pub fn client_id(self, client_id: ClientId) -> Self

Set the client ID.

Examples found in repository?
examples/message_basics.rs (line 19)
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 session_id(self, session_id: SessionId) -> Self

Set the session ID.

Examples found in repository?
examples/message_basics.rs (line 20)
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 interface_version(self, version: u8) -> Self

Set the interface version.

Examples found in repository?
examples/message_basics.rs (line 21)
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 return_code(self, code: ReturnCode) -> Self

Set the return code.

Source

pub fn payload(self, payload: impl Into<Bytes>) -> Self

Set the payload from bytes.

Examples found in repository?
examples/udp_client.rs (line 29)
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 30)
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/tcp_server.rs (line 56)
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}
examples/message_basics.rs (line 22)
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 payload_vec(self, payload: Vec<u8>) -> Self

Set the payload from a Vec.

Source

pub fn build(self) -> SomeIpMessage

Build the message.

Examples found in repository?
examples/udp_client.rs (line 30)
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 31)
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/tcp_server.rs (line 46)
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}
examples/message_basics.rs (line 23)
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}

Trait Implementations§

Source§

impl Clone for MessageBuilder

Source§

fn clone(&self) -> MessageBuilder

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 MessageBuilder

Source§

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

Formats the value using the given formatter. Read more

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.