pub struct SomeIpMessage {
pub header: SomeIpHeader,
pub payload: Bytes,
}Expand description
A complete SOME/IP message (header + payload).
Fields§
§header: SomeIpHeaderMessage header.
payload: BytesMessage payload.
Implementations§
Source§impl SomeIpMessage
impl SomeIpMessage
Sourcepub fn new(header: SomeIpHeader, payload: impl Into<Bytes>) -> Self
pub fn new(header: SomeIpHeader, payload: impl Into<Bytes>) -> Self
Create a new message with the given header and payload.
Sourcepub fn with_header(header: SomeIpHeader) -> Self
pub fn with_header(header: SomeIpHeader) -> Self
Create a new message with an empty payload.
Sourcepub fn request(service_id: ServiceId, method_id: MethodId) -> MessageBuilder
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
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}Sourcepub fn request_no_return(
service_id: ServiceId,
method_id: MethodId,
) -> MessageBuilder
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
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}Sourcepub fn notification(
service_id: ServiceId,
method_id: MethodId,
) -> MessageBuilder
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
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}Sourcepub fn create_response(&self) -> MessageBuilder
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
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}Sourcepub fn create_error_response(&self, return_code: ReturnCode) -> MessageBuilder
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
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}Sourcepub fn from_bytes(data: &[u8]) -> Result<Self>
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}Sourcepub fn to_bytes(&self) -> Vec<u8> ⓘ
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}Sourcepub fn total_size(&self) -> usize
pub fn total_size(&self) -> usize
Get the total message size (header + payload).
Sourcepub fn is_request(&self) -> bool
pub fn is_request(&self) -> bool
Check if this message is a request.
Sourcepub fn is_response(&self) -> bool
pub fn is_response(&self) -> bool
Check if this message is a response.
Sourcepub fn expects_response(&self) -> bool
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}Sourcepub fn service_id(&self) -> ServiceId
pub fn service_id(&self) -> ServiceId
Get the service ID.
Sourcepub fn session_id(&self) -> SessionId
pub fn session_id(&self) -> SessionId
Get the session ID.
Sourcepub fn return_code(&self) -> ReturnCode
pub fn return_code(&self) -> ReturnCode
Get the return code.
Trait Implementations§
Source§impl Clone for SomeIpMessage
impl Clone for SomeIpMessage
Source§fn clone(&self) -> SomeIpMessage
fn clone(&self) -> SomeIpMessage
Returns a duplicate of the value. Read more
1.0.0§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for SomeIpMessage
impl Debug for SomeIpMessage
Source§impl PartialEq for SomeIpMessage
impl PartialEq for SomeIpMessage
impl Eq for SomeIpMessage
impl StructuralPartialEq for SomeIpMessage
Auto Trait Implementations§
impl !Freeze for SomeIpMessage
impl RefUnwindSafe for SomeIpMessage
impl Send for SomeIpMessage
impl Sync for SomeIpMessage
impl Unpin for SomeIpMessage
impl UnwindSafe for SomeIpMessage
Blanket Implementations§
§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§unsafe fn clone_to_uninit(&self, dest: *mut u8)
unsafe fn clone_to_uninit(&self, dest: *mut u8)
🔬This is a nightly-only experimental API. (
clone_to_uninit)